gpt4 book ai didi

delphi - 我可以以编程方式设置组合框下拉列表的位置吗?

转载 作者:行者123 更新时间:2023-12-03 15:04:58 32 4
gpt4 key购买 nike

普通 Windows ComboBox(csDropDowncsDropDownList 样式)将在组合正下方打开其下拉列表,或者如果下方没有空间,则在组合上方打开其下拉列表。我可以控制该列表的位置(至少可以通过 Y 坐标)吗?

最佳答案

发布一个代码示例,该示例将正确显示下拉列表动画,并强制显示 ComboBox1 上方的下拉列表。此代码是 ComboBox hwndList 的子类:

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;
<小时/>

注释:

  1. 我完全同意 David 和其他人的观点,即更改 TComboBox 的特定默认行为是一个坏主意。 OP 尚未回应为什么他想要这样的行为。
  2. 以上代码已使用 D5/XP 进行测试。

关于delphi - 我可以以编程方式设置组合框下拉列表的位置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9161330/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com