くだすれC++Builder(超初心者用)その5

■ このスレッドは過去ログ倉庫に格納されています
2012/04/21(土) 13:26:14.76
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
C++Builder使いが優しくコメントを返しますが、
お礼はC++Builderの布教と初心者の救済をお願いします。

■C++Builder XE2 - エンバカデロ・テクノロジーズ
http://www.embarcadero.com/jp/products/cbuilder


<過去スレ>
くだすれC++Builder(超初心者用)その4
http://toro.2ch.net/test/read.cgi/tech/1256256376/
くだすれC++Builder(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1171219191/
くだすれC++Builder(超初心者用)その2
http://pc10.2ch.net/test/read.cgi/tech/1144308804/
くだすれC++Builder(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1117225464/

<兄弟スレ>
くだすれDelphi(超初心者用)その54
http://toro.2ch.net/test/read.cgi/tech/1325028195/
2012/05/18(金) 13:22:18.65
>>38
という事は一番上のメニューだけのバグか・・・不可解だな
4026
垢版 |
2012/05/18(金) 13:50:20.95
そうですね、一番上のメニューの幅が何故か表示した最大の幅で記憶されている感じです
ちなみに、メニューを表示していたフォームを閉じて再度開いて表示させると
初回表示時みたいに最初だけちゃんと表示されます
そんなわけで、これMenuItemをClearじゃなくて
TPopupMenuごと削除して作り直せばいいかもしれませんが・・・
2012/05/18(金) 13:54:46.16
TPopupMenuコンポーネントにバグがあるんじゃね

clear()じゃなくてTPopupMenuそのものを初めから動的に配置したらどうですか?
4226
垢版 |
2012/05/18(金) 14:06:46.63
>>41
フォームを開くたびに幅が初期化されているので
TPopupMenuを動的に作成したら多分うまくいくとおいますが・・
とりあえず現状ではそれしか回避策は無いですよね。

皆さん色々ありがとう
今回はTPopupMenuを動的に作って逃げてみます
2012/05/18(金) 17:45:18.51
いえいえ
お礼は結構ですよ
2012/05/18(金) 20:02:26.24
>>43
あんた誰?

>>42
http://pastebin.com/X7E3s6pC

こんな感じでTListを使って管理するのが普通でしょうね
4526
垢版 |
2012/05/21(月) 10:44:21.93
>>44
マジですか!
ちょっとそれやってみます、ありがとう
46デフォルトの名無しさん
垢版 |
2012/05/22(火) 20:00:42.86
(Image1 はTImageコンポ。)

Image1のStretchをtrueにする。
(Image1のWidthとHeightは200とする)
Image1の大きさよりも大きい画像(400*400のビットマップ)を
Image1->Picture->LoadFromFileで表示させる。

これで表示は出来るんだけど
Image1->Canvas->Pixels[i][j]で縦200横200のドットの色を取得すると
元の400*400の画像の左上から縦200横200の取得になってしまう。

ストレッチされた画像の縦200横200を参照するにはどうしたらいい?
教えてくれ。

わかりにくくてごめんね。
2012/05/22(火) 22:36:23.31
>>46
TImageの中に保持しているTBitmapはあくまでも元のイメージそのままで、表示の時に
Stretchしているに過ぎない
だからストレッチされた値がどうしても欲しければ他のコントロールにStretchDrawして(非表示でよい)
そこから読み取る必要がある
下のプログラムはちゃんと異なる値を表示する
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Image1->Picture->LoadFromFile("1.bmp");
Image2->Canvas->StretchDraw(Rect(0, 0, 200, 200), Image1->Picture->Graphic);

int x = Random(200), y = Random(200);

TColor tc1 = Image1->Picture->Bitmap->Canvas->Pixels[x][y];
TColor tc2 = Image2->Picture->Bitmap->Canvas->Pixels[x][y];

Label1->Caption = "x = " + IntToHex(tc1, 8);
Label2->Caption = "y = " + IntToHex(tc2, 8);
}
48デフォルトの名無しさん
垢版 |
2012/05/23(水) 09:37:17.52
TToolBarのButtonWidthを変更してもToolButtonの幅が変わらない
どうしたら変わるんですか?
ToolButtonのはチェックにしてます
2012/05/23(水) 13:54:19.23
>>48
やってみたけど変わるけど
バージョンは何かな
2012/05/23(水) 15:49:43.74
>>49
あれ?こっちじゃオブジェクトインスペクタで設定しても値がもどっちゃいます
2010です。
2012/05/23(水) 15:58:14.83
>>49
あー、わかりました。
ShowCaptions=Trueならダメなんですねこれ・・・
キャプションを表示しつつToolButtonの幅は変えられないですかね?
2012/05/23(水) 16:56:11.78
Captionを表示するとWidthが固定されちゃいますね
2012/05/23(水) 18:38:12.26
ですよね・・・
2012/05/23(水) 22:44:42.27
でしょうね・・・
2012/05/24(木) 21:05:04.39
TDictionaryをC++Builderで使うにはどのように書けばいいのでしょうか
さっぱりコンパイルが通りません

char s;

Memo1->Clear();
dic = new TDictionary__2<unsigned short, char>;
for (w = 0; (unsigned int)w < 0x10000; w++) {
s = char(w);
dic->Add(w, s);
}
2012/05/24(木) 21:59:42.99
C++で記述された実定義がないので、
template class を新たな型で new することはできません。
2012/05/24(木) 22:10:16.51
ガ━━(;゚Д゚)━━ン!!
Delphiを使えという事か・・・・
そう言えばC++ではTDictionaryではなくstd::mapを使えと書いてあったような
ありがとうございました
2012/05/25(金) 13:33:58.77
std::mapがあまりにも遅いのでstd::hash_mapを使ってみたら2倍ほどになったけど
TDirectoryよりまだまだ遅い・・・・

boost::mapの方が速いのかなあ?
59デフォルトの名無しさん
垢版 |
2012/05/25(金) 14:07:31.08
Builder2007で質問ですが
Form1からForm2を呼ぶときにForm2のFormStyleをfsStayOnTopにしているのに
Form1をクリックするとForm2がForm1の後ろに行っていまいます
Builder5じゃそんな事はなかったのですが
2007辺りから↓
SetApplicationMainFormOnTaskBar(Application, true);
こいつが悪さしてるって以前に聞いたことあるのですが
これはランタイムテーマ有効?のだとおもうんですが
それがONの状態でもfsStayOnTopで背後に行かないようにする方法を教えてください
2012/05/25(金) 14:41:05.19
>>59
XE2だけどそういう症状は出ないよ
2012/05/25(金) 14:48:16.55
>>60
5も大丈夫だったので2007だけかもしれません。
とりあえずWMWindowPosChangingメッセージでTOPにして常に最上位に表示するようにしてますが・・・
2007ってバグ多いからなあ
2012/05/25(金) 15:25:38.56
>>61
Form2ってForm1から動的に生成してる?それともUnit2として後からShow()してる?
2012/05/25(金) 15:38:04.10
>>62
Form1のコンストラクタで動的に作成してます
んで、Form2を表示させる場合にShowして必要なくなったらHideしてます。
Form2はフリーせずにずっと非表示で存在してます
2012/05/25(金) 16:07:48.89
>>63
んーモーダルにしてもモードレスにしてもやっぱりForm2はForm1の背後に行かないです
2012/05/25(金) 16:25:57.52
>>64
ランタイムテーマは有効になってますよね?
やっぱり2007だけのバグかなあ・・
2012/05/25(金) 16:34:37.92
>>65
XE2ではランタイムテーマはデフォルトで有効です
2012/05/25(金) 16:37:51.97
>>66
そうですよね、2007もデフォで有効になってますし
色々ありがとうございます。
とりあえずメッセージで回避できるのでそうしておきます・・
2012/05/25(金) 16:47:22.25
>>66
何かメッセージで処理するのを止めても背後に行かなくなった
んで、色々ためしててちょっとわかったのですが
どうもForm1をアイコン化したらForm2が背後にいっちゃうみたいです

そんなわけで、以下の手順で試してもらっていいですか?
1.Form1を表示してForm2をfsStayOnTopで表示
2.Form1をアイコン化(この時にForm2も消える)
3.Form1を元に戻す(Form2はどこかに行ってしまてtみえなくなる)
4.Form2を再度fsStayOnTopで表示(見た目上はForm1の上に表示される)
5.Form1をクリックしてみる、そうするとForm1の上に表示されているはずのForm2が裏に行ってしまう
2012/05/25(金) 20:05:38.96
>>68
XE2だとForm1をアイコン化するとForm2も同時にアイコン化するのは同じです
しかしその後Form1を戻すとForm2もちゃんと前面に表示された状態で再表示されました

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2 = new TForm2(Application); // 生成
Form2->Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Application->Minimize();
}
//---------------------------------------------------------------------------

こんな感じです
2012/05/25(金) 20:06:39.07
あっちょっと違ってました

アイコン化するのはForm1だけで、Form2は消えてしまいアイコンになりません
しかしタスクバーをクリックするとForm2がForm1の上に重ねられて再表示されます
71デフォルトの名無しさん
垢版 |
2012/05/25(金) 20:48:18.31
FormにTLabelを貼り付けたら
TLabel *Label1;
と宣言挿入されたのですが

実際に、newはどこに書かれているのですか?
2012/05/25(金) 20:48:59.94
Project1.cpp(デフォルト名)じゃないの?
2012/05/25(金) 21:24:36.12
今見たらApplication->CreateForm()って専用のメソッド呼び出してますね
74デフォルトの名無しさん
垢版 |
2012/05/25(金) 21:52:36.57
>>73
質問の仕方が悪かったです。申し訳ありません。

Label1 = new TLabel();

というのが、とこに書いてあるのかが知りたいです。
2012/05/25(金) 22:01:43.60
>>74
それVCLの中に書いてあるんじゃない?
CreateForm()がフォームに貼り付けてあるコンポーネントを全部初期化するんでしょうね
2012/05/25(金) 22:12:47.64
>>74
IDEによって管理されているから、そういう記述はどこにも書かれていない。
VCL内部でフォームの情報を読んでそれぞれのコンポーネントを生成、初期化している。
2012/05/25(金) 22:13:31.37
>>69-70
ありがとうございます。
XE2ではちゃんと表示されるのですね・・・
やっぱり2007だけの現象なんですね
78デフォルトの名無しさん
垢版 |
2012/05/29(火) 10:20:37.46
誰かさピクセル関数の使い方教えてくれる人いない?
課題で黒い線の上を車の画像走らせるアプリ作ってるんだけどその車の左右には触覚?みたいなものがついていてその触覚の色を取得したいんだが・・・
2012/05/29(火) 16:38:22.87
>>78
Pixel()は遅いからScanLine()で一行取得してからそれを調べるのが定石
80デフォルトの名無しさん
垢版 |
2012/05/29(火) 20:32:10.95
学校の課題レベルで問題になるほど、でPixel()が遅い訳ねえじゃん。
81デフォルトの名無しさん
垢版 |
2012/05/29(火) 22:56:23.22
マウスホイールイベントをMESSAGE_HANDLERで捕まえて、処理する関数
 ttp://www.gesource.jp/programming/bcb/43.html
がBCB6では動いていたんですが、
XE2にしたらイベントを捕まえられなくなりました。

単純に以下のソースをForm1にコピーして、
ホイールを回したら、MessageBoxが出るように改良しているだけです。
なぜでしょうか。理由がわからなくて困っています。
また、その理由に基づいてどうしたらよいですか?
※Win7 32bit
82デフォルトの名無しさん
垢版 |
2012/05/29(火) 22:57:39.22
× 単純に以下のソースをForm1にコピーして、
○ 単純に上のソースをForm1にコピーして、
^^
2012/05/30(水) 09:41:42.41
^^
2012/05/30(水) 10:10:48.54
>>81
http://toro.2ch.net/test/read.cgi/tech/1335177837/173
にも書いてあるけど

void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
if (Msg.message == WM_MOUSEWHEEL) {
Application->MessageBox(L"マウスホイールが回されました。", L"", MB_OK);
}
}

でいいんじゃないの
85デフォルトの名無しさん
垢版 |
2012/05/30(水) 10:19:22.99
とりあえずマウスダウンでピクセル使って色を取得するプログラム作ったんだけどフォームの色しか取得出来ないんだが
イメージ画像とかコンポーネントの色が取得出来ないのは何でだ?
2012/05/30(水) 10:22:16.06
基本的にCanvasの色しか取得出来ないだろ
それかBitmapか
87デフォルトの名無しさん
垢版 |
2012/05/30(水) 10:30:24.03
いまからはじめても大丈夫?
会社つぶれない?
2012/05/30(水) 10:42:02.25
つぶれない。でもあと3ヶ月待て。C++BuilderはXE3で本気出す予定()だから。
89デフォルトの名無しさん
垢版 |
2012/05/30(水) 10:48:40.13
>>86
コンポーネントの色を取得出来ないのはしかたがないとしてビットマップ画像の色は取得したい
2012/05/30(水) 11:29:30.35
カーソル直下に存在するコンポーネントのCanvasでPixels()を使え
2012/05/30(水) 16:41:41.04
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Image1->Picture->LoadFromFile("1.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int x = Random(Image1->Width);
int y = Random(Image1->Height);

Label1->Caption = UnicodeString().IntToHex(Image1->Canvas->Pixels[x][y], 8);
}
//---------------------------------------------------------------------------

こんなのでしょ
今まで何回も出てきてるけど
Button1で画像をロードしてButton2でランダムな点のTColorをゲットする
92名無しさん@お腹いっぱい
垢版 |
2012/05/30(水) 18:30:22.70
裁判所の力
93デフォルトの名無しさん
垢版 |
2012/05/30(水) 20:11:44.34
StringGirdのセルに、IMEで漢字入力したくて、以下のソースをググってつくてみました。
入力セルの内にIMEの変換候補が表示されるプログラムです。
(XE2を使っています)

入力直後だけ変換候補が表示されません。
例:あるセルで、IMEをONにして文字列を打ち込んでいくと、
東京都[スペース] ←この段階では、変換候補が表示されない。
[改行]      ←確定で「東京都」の文字が表示される。
港区[スペース]  ←これ以降の続き入力では、変換候補も表示される。
最初から表示したい。どうすべ?
94デフォルトの名無しさん
垢版 |
2012/05/30(水) 20:12:43.44
void __fastcall TStringGrid1::IMEStart(TMessage& Message)
{
// IMEの位置をキャレットのポジションに設定
COMPOSITIONFORM CompForm;
POINT pt;
LOGFONT lf;
HIMC hImc=ImmGetContext(Handle);

//キャンバスのフォントと同じに設定する
GetObject(this->Canvas->Font->Handle,sizeof(LOGFONT),&lf);
ImmSetCompositionFont(hImc,&lf);

//キャレットのポジションに設定する
ImmGetCompositionWindow(hImc,&CompForm);
CompForm.dwStyle=CFS_POINT;
GetCaretPos(&pt);
pt.x = this->CellRect(this->Col, this->Row).left+2;
pt.y = this->CellRect(this->Col, this->Row).top+2;

CompForm.ptCurrentPos=pt;
ImmSetCompositionWindow(hImc,&CompForm);
ImmReleaseContext(Handle, hImc);

//編集モード用カーソルの表示
this->Options << goEditing; //編集モードをON
this->EditorMode = true; //選択セルのカーソルを表示。これがないと、かな漢字変換の初期段階で選択枠が表示されたままになる。
}
95デフォルトの名無しさん
垢版 |
2012/05/31(木) 10:50:26.77
StringGirdが持つ、TInplaceEditのIME設定(SetImeCompositionWindow)を
以下のように変更しようとしていますが、
SetImeCompositionWindowがprotectメンバのためアクセスできません。
どう解決したらよいですか?

StringGirdのメンバー関数内での記述:
TInplaceEdit* editor= dynamic_cast<TInplaceEdit*>(this->Components[0]);
editor->SetImeCompositionWindow(this->Canvas->Font, 100, 50);
2012/05/31(木) 11:39:32.71
>>93
IME何使ってるの?
GoogleIMEだとちゃんと表示されるけど
2012/05/31(木) 11:47:50.87
ちなみにMSIME2010でやってもちゃんと表示されました
98デフォルトの名無しさん
垢版 |
2012/05/31(木) 11:50:12.26
MSIME2010 です。
2012/05/31(木) 11:53:24.40
同じIMEですねえ
ちゃんと変換候補も出ます
ちなみに>>94みたいな事はしていません
100デフォルトの名無しさん
垢版 |
2012/05/31(木) 12:04:12.49
もしかと思い、OS変えて調べてみました。
手元にある、Win7では×ですが、XPでは○でした。
OSなんですか?
2012/05/31(木) 12:04:35.43
XPですね
OSの問題かな?
2012/05/31(木) 12:15:13.46
WOW64のバグかはたまたIMEの64bit版のバグか
103デフォルトの名無しさん
垢版 |
2012/05/31(木) 12:21:44.69
>>94で書いたような、IME位置の移動処理をしなくても、

 this->Options << goEditing; //編集モードをON
 this->EditorMode = true; //選択セルのカーソルを表示。

として、編集モードにさえすれば、その場所に変換文字が表示されるんですね。
XP限定ですが。

win7だと、>>95で書いた方法でIMEを移動できても、無理かもしれませんね。
2012/05/31(木) 12:28:52.96
WOW64の非互換の問題でしょう
こればかりは仕方がない
MSに文句付け方が早い
105デフォルトの名無しさん
垢版 |
2012/05/31(木) 12:36:04.75
私が使ているのは、Win7-32bitなんですが、
WOW64は、32bitOSでも関係あるものでしょうか?
2012/05/31(木) 12:38:45.44
>>105 ない。
2012/05/31(木) 12:53:05.99
なんだ、じゃWin7-32bitのバグじゃないか
2012/06/04(月) 15:15:22.38
画像を一度ずつ回転させたく調べたところ
x1=(x2-cx)*cos(θ)-(y2-cy)*sin(θ)+cx
y1=(x2-cx)*sin(θ)+(y2-cx)*cos(θ)+cy
http://homepage2.nifty.com/tsugu/sotuken/rotation/#basic
(このサイトを参照)

このような式が出てきました
この式の左辺をどこに代入すればよいのか全くわかりません
どなたかご教授よろしく
109デフォルトの名無しさん
垢版 |
2012/06/04(月) 19:15:32.73
プログラミングの前に、高校数学をやり直したほうがいいぞ
2012/06/05(火) 13:17:22.21
>>108
http://pastebin.com/R9DNtmZZ

こんな感じでちゃんと動いたが
2012/06/05(火) 23:07:17.39
C++Builderユーザー各位

いつもお世話になっております。エンバカデロ 営業の深町です。本日は、先週
発表致しましたC++Builder次期バージョンへのパスについて、改めてご案内致し
ます。今回の発表は、C++BuilderがiOSやAndroidを含むモバイルプラットフォー
ムにも拡張されるという大きな一歩を表明しています。

これに対し、現在のC++Builderから将来バージョンまでを入手いただけるパスと
して、「Future Ticket」版の提供開始を発表させていただきました。すでに、
多くのお客様から反響をいただいております。

6月29日までにサポートと併せてご購入いただくことで、C++Builder XE2を20% OFF
でさらに次期バージョンへのプライオリティプレビューアクセスと、今後1年間に
提供される新バージョンを入手することができます。64-bitサポートをはじめ、
C++Builderの今後のバージョンへ円滑に移行するには、現在最新バージョンから
の作業が重要です。ぜひ、この機会をご活用いただき、今後1年間にわたって最新
環境をご用意いただければと存じます。

「Future Ticket」版 詳細ページはこちらになります。
 ⇒ http://www.embarcadero.com/jp/landing-pages/cbuilder-bundle
112デフォルトの名無しさん
垢版 |
2012/06/06(水) 00:13:16.43
今時、超優秀なコンパイラがフリーで手に入る時代に、超強気な価格ですねw
113デフォルトの名無しさん
垢版 |
2012/06/06(水) 15:04:09.16
Builder2010ですがProgressBarでStepBy( 1 )してるのですが
ProgressBarの進みが遅く、処理が終了しても70%くらいまでしか進んでいません。
これ以前のようにちゃんと現在位置を表示させる方法を教えてください
2012/06/06(水) 17:05:47.07
Maxの計算が間違っているんじゃないの?
2012/06/06(水) 17:07:53.60
>>113
Application->ProcessMessages()でも挟んでみたら?
116デフォルトの名無しさん
垢版 |
2012/06/06(水) 17:24:08.87
>>114
間違ってないです。
>>115
いや、挟んでる。

非常に単純です。
ProgressBar->Min = 0;
ProgressBar->Max= 100;
ProgressBar->Step = 1;
ProgressBar->Position = 0;
for( int i = 0; i < 100; i ++ ){
 ProgressBar->StepBy( 1 );
 Application->ProcessMessages( );
}
ProgressBar->Position = 0;
回す回数にもよりますがこれでバーが7割くらいのとこで0になってしまします。
ちなみに最後のProgressBar->Position = 0;を取ると
処理が終わってやや暫くしてからバーがMAXになります。。
そんなわけで、ProgressBar自体が遅延処理を行ってるみたいなので。
同じコードをBuilder5でやるとちゃんと最後まで表示されます。
これまた例によって2010だけのバグかもしれませんが。
2012/06/06(水) 17:33:54.85
>>116
ProgressBar->Min = 0;
ProgressBar->Max= 100;
ProgressBar->Step = 1;
ProgressBar->Position = 0;
for( int i = 0; i < 100; i ++ ){
 ProgressBar->StepBy( 1 );
 Application->ProcessMessages( );
}
ProgressBar->Position = 0;
Application->ProcessMessages( );

最後に Application->ProcessMessages( );
重い処理をした後あとだと処理が終わってもCGIが再描画されないときもあった気がする。
2012/06/06(水) 17:45:07.42
また2010のバグかよ(-_-;)

XE2でやるとうまく行くが
次のようなコードはどう?

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ProgressBar1->Min = 0;
ProgressBar1->Max= 100;
ProgressBar1->Step = 1;
ProgressBar1->Position = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
ProgressBar1->StepBy(1);
}
//---------------------------------------------------------------------------
119デフォルトの名無しさん
垢版 |
2012/06/06(水) 17:51:58.01
>>117
それやってみましたがダメでした
>>118
すんません、コードの性質上タイマーでアレするのはちょっとやりにくいのです。

ProgressBarが内部で遅延描画をしてるのは疑いないのですが
それをプロパティ等で設定できないものかとおもいまして
ちなみにSmooth = falseにしても、バーが滑らかなアレのままで断片表示になってくれません。
完全にProgressBarのバグですが、ちゃんと描画させる方法はないですかね?
更にちなみに、UpdateやInvalidateなどをやってもダメでした・・・
2012/06/06(水) 17:55:42.61
>>119
そうじゃなくて>>118ならちゃんと表示されるか聞きたい
だめならSleep()でもいいからさ
2012/06/06(水) 18:21:45.69
これでも表示がおかしいかい?

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ProgressBar1->Position = 0;

for (int i = 0; i < ProgressBar1->Max; i++) {
Sleep(100);
Step();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Step()
{
ProgressBar1->StepBy(1);
}
122デフォルトの名無しさん
垢版 |
2012/06/06(水) 18:59:01.97
>>120
あー、なるほど。
確かにそうですよね、やってみます。
>>121
それもやってみましたがダメでした
123デフォルトの名無しさん
垢版 |
2012/06/07(木) 18:26:38.63
BCB6をXPで使用しています。
メインファームである処理をしている時にフォームを掴むとその処理が停止してしまいますが、
これを回避する方法はありますか?
離せばまた元通り動き出すので、今は「掴むな!!」という事にしています。
2012/06/07(木) 18:52:02.41
別スレッドで処理を行わせるくらいしか回避方法はない。
2012/06/07(木) 21:06:21.52
Focus当てられないようにするとか
2012/06/07(木) 21:52:25.64
FormのEnabledプロパティをfalseにするとフォーカスが当てられなくなるな

しかもオーナードローでなければボタンは反応するので途中で計算を止めたい時も行ける
127123
垢版 |
2012/06/07(木) 22:59:14.92
アドバイス有り難うございます。

FormのEnabledをflaseにして見ましたが、そもそも移動したい時にも移動できなくなるので
ちょっと難しいそうです。
別スレッドでという方法を試して見ます。

スレッドは使った事が無いので基本的な事を教えて下さい。

「異なるスレッドが保有するVCLにアクセスする時に排他制御の問題があるので、
Synchronizeメゾッドを使用して同期しろ」と書かれていますが、
例えばメインフォームのLabel1にアクセスするコードが新しく生成したスレッドの中にしか無い場合には、
排他制御の問題はそもそも無いのでSynchronizeメゾッドは使用する必要がないという理解で良いでしょうか?

2012/06/07(木) 23:15:27.11
移動は出来るけど処理は止めたくないのかあ

SynchronizeメソッドはVCLがマルチスレッドに対応してないので
Label1を新しく生成したスレッドからしかいじらないとしても調べる必要がある
129123
垢版 |
2012/06/07(木) 23:31:32.58
>>128

「調べる必要がある」とはどういう意味でしょうか?


Synchronizeメソッドの説明を読むと、
一度メインフォームに処理を戻してVCLの更新を実行するという事が書かれています。
でもフォームが掴まれている状態でSynchronizeメソッドを呼ぶとそこで止まってしまうのではないかと・・・?
結局止まってしまうのではないかと。
130123
垢版 |
2012/06/07(木) 23:45:49.94
>>Synchronizeメソッドを呼ぶとそこで止まってしまうのではないかと・・・?

実験してみたら上記は問題ありませんでした。
2012/06/08(金) 00:57:57.67
スレッド別なんだから止まるわけないじゃん
それよりメインフォームでVCLをいじってるとSynchronize()の結果が変わる
その時にいじると競合が発生して不審な挙動になる
2012/06/08(金) 15:25:24.49
C++Builder発売15周年記念キャンペーン
なんてやってたんだね
proで50000円は新規の人に魅力的だろうか?
133バカでごめんね
垢版 |
2012/06/09(土) 13:06:35.97
c++を使い始めたものなんですけど

こっちはちゃんとなるんですけど
http://www.dotup.org/uploda/www.dotup.org3073322.jpg

includeを使うと
http://www.dotup.org/uploda/www.dotup.org3073352.jpg


こんな感じになっちゃって・・・(´;ω;`)


だれか解決して下さいませんか?


2012/06/09(土) 14:34:38.30
>>133
画像は分かりやすいけど…
dotupじゃすぐに消えちゃうぞ。一発ネタならちょうどいいけどね。
とりあえず、imgurにでもアップしなおして。
2012/06/09(土) 14:37:00.41
あと、ユーザー名は画像加工した方がいいんでないかい?
136バカでごめんね
垢版 |
2012/06/09(土) 14:38:35.85
ユーザー名ぐらいはいいかなあと
2012/06/09(土) 14:46:28.54
いいんならいいけど。
てか、よく見たらこれBuilderじゃなくて、Borland C++ Compiler 5.5.1か〜。
2012/06/09(土) 18:37:32.34
>>133
http://www.atmarkit.co.jp/fwin2k/win7/06xpmode/06xpmode_03.html

ここを参考にXPモードでBCCをインストールし直す
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況