リストボックスにしたいけど、スペースを取るからComboBoxを使っているような用途の場合、
ComboBoxの自動ドロップダウンは有効ですよね。
(私が作った社内のアプリでも、自動にしてほしいという要望が多いです)
これを実現するためにComboBoxには、AutoDropDownというプロパティが用意されているので、これをTrueするだけで良いように思えます。しかし、この設定では、カーソルがComboBoxに移動しても、ドロップダウンしません。
ヘルプで確認しますと、
<Delphi2007 for Win32 HELPより引用>
TComboBox.AutoDropDown プロパティ
AutoDropDown が true であれば,コンボボックスにフォーカスがあるときに
ユーザーが文字をタイプすれば自動的にリストをドロップダウンします。
これでは少し中途半端ですよね。
このような時には、次のような処理をします。(と書くほどのものではありませんけど)
procedure TForm1.ComboBox1Enter(Sender: TObject);
begin
ComboBox1.DroppedDown := True;
end;
上の処理では、マウスで▼をクリックしてOnEnterが処理されたとき、一度閉じてしまいますね。
キー操作での処理ばかりしてたので、気付かなかったです。
ということで次の処理を考えてみました。しかしこれでもマウスがクリックされずに▼の上にあって、OnEnterが処理された場合には自動で開きませんけど(^^;
procedure TForm1.ComboBox1Enter(Sender: TObject);
var
P1,P2: TPoint;
R1, R2: Boolean;
begin
GetCursorPos(P1);
P2 := ComboBox1.ScreenToClient(P1);
// ボタン幅の取得がわからなかったのでSM_CXHSCROLLを使いました。
R1 := P2.X > (ComboBox1.Width - GetSystemMetrics(SM_CXHSCROLL));
R2 := (P2.X < ComboBox1.Width);
if R1 and R2 then Exit;
ComboBox1.DroppedDown := True;
end;
でも、ここで一つ気になるのがヘルプの記述です。
<Delphi2007 for Win32 HELPより引用>
TCustomCombo.DroppedDown プロパティ
DroppedDown プロパティを読み出すと,ドロップダウンリストが可視であるか
どうかを判別できます。ドロップダウンリストを開いたり閉じたりするには,
DropDown プロパティを設定します。DroppedDown は,ドロップダウンリストが
開いていれば true,閉じていれば false です。
私には、この記述は間違っているように思えます。
DroppedDownは読み込み専用プロパティではなく、設定も可能です。
DropDownプロパティは、OnDropDownイベントになりますので、開けたり閉じたりするには、やはりDroppedDownを使うものだと思われます。
又、AutoCloseUpというよくわからないプロパティもあります。
こちらもヘルプで確認してみます。
<Delphi2007 for Win32 HELPより引用>
TComboBox.AutoCloseUp プロパティ
AutoCloseUp が true になっていれば,ユーザーが項目を選択したとき,
自動的にドロップダウンが閉じられます。
と書いていますが、実際には、このプロパティの設定に関係なく項目を選択すればドロップダウンが閉じられます。
もしかしてOnCloseUpイベントに影響があるのかなと思い、確かめてみましたが、こちらも常に発生するので
関係がないように思います。こうなるとわざわざ存在する理由がわからないですよね。
[2007/09/06 一部訂正しました。]