コンボボックスのドロップダウン

解決


うさこ  2004-02-21 05:38:26  No: 7256

こんにちは。
いつも参考にさせていただいております。

コンボボックスの制御について、悩んでおります。
コンボボックスにカーソル移動時に、自動でリストをドロップダウンする為に、
下記のコーディングを行っています。

procedure TForm1.ComboBox1Enter(Sender: TObject);
begin
   //フォーカスが移ったコンボボックスのリストをオープン表示
   PostMessage(TComboBox(Form1.ActiveControl).Handle, CB_SHOWDROPDOWN, 1, 0);
end;

通常は問題ないのですが、コンボボックスが画面の先頭項目で、画面起動と同時に
ドロップダウンする際に、コンボボックスの枠の線がなくなってしまします。
ドロップダウンはします。

上記のコーディングをコメントにすると、ドロップダウンはしませんが、
コンボボックスは正しく表示されます。

何か、タイミングの問題のような気がするのですが、
どのように解決すればよいのか分かりません。

情報をお持ちの方がいらっしゃいましたら、ご教授下さい。
宜しくお願い致します。

Delphi7 を使っています。


うさこ  2004-02-21 05:48:02  No: 7257

すみません。引き続きうさこです。

コンボボックスが画面の先頭項目で、画面起動と同時に
ドロップダウンする際の現象に、「カーソルが砂時計のままになる」
というのを追加させて下さい。
砂時計なのですが、リストの選択は可能でリストが閉じると
カーソルは通常に戻ります。

以上になります。
宜しくお願い致します。


にしの  2004-02-21 06:23:24  No: 7258

procedure TForm1.ComboBox1Enter(Sender: TObject);
begin
  Application.ProcessMessages;
  PostMessage(TComboBox(Form1.ActiveControl).Handle, CB_SHOWDROPDOWN, 1, 0);
end;
ではどうですか?


にしの  2004-02-21 06:35:13  No: 7259

砂時計対応しました。
ちょっと面倒ですが。

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;


こんぼぼっ君  2004-02-21 06:38:24  No: 7260

確認してみましたが、
Application.ProcessMessages;
ではダメでした。

ComboBox1.Refresh;
とか入れるといけるようです。


こんぼぼっ君  2004-02-21 06:45:57  No: 7261

分かりづらいので追記します。

上のを間に入れてという事で、

  Application.ProcessMessages;
  ComboBox1.Refresh;
  PostMessage(〜〜〜


うさこ  2004-02-23 23:31:58  No: 7262

にしのさん、こんぼぼっ君さん ありがとうございました。

アドバイス頂いたコードを追加してみると、
コンボボックスが上手く表示出来ました。

ただ、実行した時にFormが最大化されておらず、
マウスがForm上にない時に、マウスをForm上に移動すると、
カーソルが砂時計になるようです。
最初から、Form上にマウスを置いておいて実行すると、
砂時計にはなりません。

しかし今回は、メイン画面は最大化が原則ですし、
メイン画面から起動するサブ画面(非最大化)で同じように
コンボボックスを作成しても、正常に表示されているので、
問題ないようです。

という訳で無事解決とさせて頂きます。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加