通常のWindowsコンボボックス(csDropDown
またはcsDropDownList
スタイル)は、その下にドロップダウンリストを表示します。このリストの位置を(少なくともY座標で)制御できますか?ComboBoxドロップダウンリストの位置をプログラムで設定できますか?
答えて
が正しくドロップダウンリストのアニメーションが表示され、ComboBox1
の上にドロップダウンリストを示す強制するコードの例を投稿:このように。
TForm1 = class(TForm)
ComboBox1: TComboBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FComboBoxListDropDown: Boolean;
FComboBoxListWnd: HWND;
FOldComboBoxListWndProc, FNewComboBoxListWndProc: Pointer;
procedure ComboBoxListWndProc(var Message: TMessage);
end;
....
procedure TForm1.FormCreate(Sender: TObject);
var
Info: TComboBoxInfo;
begin
ZeroMemory(@Info, SizeOf(Info));
Info.cbSize := SizeOf(Info);
GetComboBoxInfo(ComboBox1.Handle, Info);
FComboBoxListWnd := Info.hwndList;
FNewComboBoxListWndProc := MakeObjectInstance(ComboBoxListWndProc);
FOldComboBoxListWndProc := Pointer(GetWindowLong(FComboBoxListWnd, GWL_WNDPROC));
SetWindowLong(FComboBoxListWnd, GWL_WNDPROC, Integer(FNewComboBoxListWndProc));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SetWindowLong(FComboBoxListWnd, GWL_WNDPROC, Integer(FOldComboBoxListWndProc));
FreeObjectInstance(FNewComboBoxListWndProc);
end;
procedure TForm1.ComboBoxListWndProc(var Message: TMessage);
var
R: TRect;
DY: Integer;
begin
if (Message.Msg = WM_MOVE) and not FComboBoxListDropDown then
begin
FComboBoxListDropDown := True;
try
GetWindowRect(FComboBoxListWnd, R);
DY := (R.Bottom - R.Top) + ComboBox1.Height + 1;
// set new Y position for drop-down list: always above ComboBox1
SetWindowPos(FComboBoxListWnd, 0, R.Left, R.Top - DY , 0, 0,
SWP_NOOWNERZORDER or SWP_NOZORDER or SWP_NOSIZE or SWP_NOSENDCHANGING);
finally
FComboBoxListDropDown := False;
end;
end;
Message.Result := CallWindowProc(FOldComboBoxListWndProc,
FComboBoxListWnd, Message.Msg, Message.WParam, Message.LParam);
end;
注:このコードは、コンボボックスhwndList
をサブクラス
- 私は完全にこれは
TComboBox
のために、この特定のデフォルト動作を変更することは悪い考えであることをデビッドに同意する、など。 OPはまだに反応していませんでした。理由はです。 - 上記のコードはD5/XPでテストしました。
正常にテストされました、ありがとう! – Andrew
これを行うには、GetComboBoxInfo
を使用して、リストに使用されているウィンドウのハンドルを取得し、そのウィンドウを移動します。このように:
type
TMyForm = class(TForm)
ComboBox1: TComboBox;
procedure ComboBox1DropDown(Sender: TObject);
protected
procedure WMMoveListWindow(var Message: TMessage); message WM_MOVELISTWINDOW;
end;
....
procedure TMyForm.ComboBox1DropDown(Sender: TObject);
begin
PostMessage(Handle, WM_MOVELISTWINDOW, 0, 0);
end;
procedure TMyForm.WMMoveListWindow(var Message: TMessage);
var
cbi: TComboBoxInfo;
Rect: TRect;
NewTop: Integer;
begin
cbi.cbSize := SizeOf(cbi);
GetComboBoxInfo(ComboBox1.Handle, cbi);
GetWindowRect(cbi.hwndList, Rect);
NewTop := ClientToScreen(Point(0, ComboBox1.Top-Rect.Height)).Y;
MoveWindow(cbi.hwndList, Rect.Left, NewTop, Rect.Width, Rect.Height, True);
end;
私はコードを単純にするためにエラーチェックの問題を無視しました。
ただし、ドロップダウンアニメーションがまだ表示されているので、かなり恐ろしいことに注意してください。おそらく、それを無効にする方法を見つけることができます。
しかし、Windowsは既にあなたのためにこのようなことを行う必要はありません。フォームを画面の下にドラッグしてコンボをドロップします。次に、コンボの上にリストが表示されます。
D5でXPでテストしました。このコードは私のために働いていません。 'cbi.hwndList'は移動されていません。すぐに開閉します。 – kobik
@kobikこれをやっていないもう一つの理由。問題はD5ではなくXPであると思います。異なるOSバージョンの動作を切り替える必要があるかもしれません。決して良い計画ではありません。 –
私は100%同意します。これはおそらく 'GWL_WNDPROC'にフックして' WM_SIZE'を処理することによって行うことができますが、その動作は予期せぬものであり、私はこの考えを完全にダンプします。ちょうどサイドのコメント、私は 'GetComboBoxInfo'を使用してCB_GETCOMBOBOXINFO(msdnのクラッシュに関するコメントを参照)よりも優れていると思う。 – kobik
- 1. ビューのY位置をプログラムで設定
- 2. AIRウィンドウの位置をプログラムで設定しますか?
- 3. 視聴者の位置と向きをプログラムで設定する
- 4. ココアタッチでプログラムで表示位置を右上に設定する
- 5. リッチテキストボックスの位置を設定できますか?
- 6. iphoneシミュレータの位置をプログラムで設定する
- 7. コンテキストメスの位置を設定できませんか?
- 8. QML ComboBoxドロップダウンメニューを現在のアイテム位置から開きます
- 9. プロセスを開始するときに開始位置をプログラムで設定する
- 10. Android:プログラムで設定されたチェックボックスのテキスト位置を右に設定
- 11. DataGridTemplateColumn内のComboBoxの項目をプログラムで設定する
- 12. UITextViewでカーソル位置を設定できません
- 13. Telerik MapPinPointの位置を正しく設定できません
- 14. usercontrolの位置を設定し、wpf C#でプログラムで変更する方法は?
- 15. jqueryダイアログボックスで位置と幅を設定することはできますか?
- 16. Comboboxドロップダウンリスト
- 17. UIImageViewの画像の位置を設定することはできますか?
- 18. プログレスバー:キャンバスでの位置/位置の設定
- 19. jQueryマウス位置の設定(カーソル位置ではない)
- 20. Powershell v2.0の動的パラメータを位置0に設定できますか?
- 21. Mercurial設定オプションをプログラム的に設定できますか?
- 22. wp7.1での位置設定の使用
- 23. 設定位置プロパティ
- 24. 位置をパーセントで設定 - Android DisplayMetrics
- 25. jQuery qTip:カスタムスタイルで位置を設定
- 26. スパンでの入力(設定位置)
- 27. テキストの位置はどのように設定できますか?
- 28. $ parserメソッドでキャレット位置を設定するとき
- 29. Javaは他のプログラムからのウィンドウの位置を制御できますか?
- 30. テーブルビューでセル内のラベルの位置を設定します
ちょっと疑問:なぜですか?どのようなデフォルトの動作では、あなたの好みにはありません? –
@ MarjanVenema私たちのデザイナーはオーナードローコンボボックスで使いやすさを改善したいと思っています – Andrew