こんにちは。
いつも参考にさせていただいております。
コンボボックスの制御について、悩んでおります。
コンボボックスにカーソル移動時に、自動でリストをドロップダウンする為に、
下記のコーディングを行っています。
procedure TForm1.ComboBox1Enter(Sender: TObject);
begin
//フォーカスが移ったコンボボックスのリストをオープン表示
PostMessage(TComboBox(Form1.ActiveControl).Handle, CB_SHOWDROPDOWN, 1, 0);
end;
通常は問題ないのですが、コンボボックスが画面の先頭項目で、画面起動と同時に
ドロップダウンする際に、コンボボックスの枠の線がなくなってしまします。
ドロップダウンはします。
上記のコーディングをコメントにすると、ドロップダウンはしませんが、
コンボボックスは正しく表示されます。
何か、タイミングの問題のような気がするのですが、
どのように解決すればよいのか分かりません。
情報をお持ちの方がいらっしゃいましたら、ご教授下さい。
宜しくお願い致します。
Delphi7 を使っています。
すみません。引き続きうさこです。
コンボボックスが画面の先頭項目で、画面起動と同時に
ドロップダウンする際の現象に、「カーソルが砂時計のままになる」
というのを追加させて下さい。
砂時計なのですが、リストの選択は可能でリストが閉じると
カーソルは通常に戻ります。
以上になります。
宜しくお願い致します。
procedure TForm1.ComboBox1Enter(Sender: TObject);
begin
Application.ProcessMessages;
PostMessage(TComboBox(Form1.ActiveControl).Handle, CB_SHOWDROPDOWN, 1, 0);
end;
ではどうですか?
砂時計対応しました。
ちょっと面倒ですが。
Form1のPrivateに、
procedure ApplicationIdle(Sender: TObject; var Done: Boolean);
を定義。
procedure TForm1.FormCreate(Sender: TObject);
begin
// Form作成時にComboBox.OnEnterを空にし、Application.OnIdleを設定する
ComboBox1.OnEnter := nil;
Application.OnIdle := ApplicationIdle;
end;
procedure TForm1.ApplicationIdle(Sender: TObject; var Done: Boolean);
begin
ComboBox1.OnEnter := ComboBox1Enter;
PostMessage(TComboBox(Form1.ActiveControl).Handle, CB_SHOWDROPDOWN, 1, 0);
//一度呼ばれたら二度と使わないのでnil。OnIdleが必要なら、フラグでチェックする手もあります。
Application.OnIdle := nil;
end;
確認してみましたが、
Application.ProcessMessages;
ではダメでした。
ComboBox1.Refresh;
とか入れるといけるようです。
分かりづらいので追記します。
上のを間に入れてという事で、
例
Application.ProcessMessages;
ComboBox1.Refresh;
PostMessage(〜〜〜
にしのさん、こんぼぼっ君さん ありがとうございました。
アドバイス頂いたコードを追加してみると、
コンボボックスが上手く表示出来ました。
ただ、実行した時にFormが最大化されておらず、
マウスがForm上にない時に、マウスをForm上に移動すると、
カーソルが砂時計になるようです。
最初から、Form上にマウスを置いておいて実行すると、
砂時計にはなりません。
しかし今回は、メイン画面は最大化が原則ですし、
メイン画面から起動するサブ画面(非最大化)で同じように
コンボボックスを作成しても、正常に表示されているので、
問題ないようです。
という訳で無事解決とさせて頂きます。
ありがとうございました。
ツイート | ![]() |