如何在 TForm 的边界之外显示控件(例如 TListbox)
How to display a control (e.g. TListbox) beyond the borders of a TForm
如何在运行时显示超出父窗体边界的列表框:
图像是在设计时单击列表框时从 IDE 获得的。我想在运行时实现这个效果。
您无法真正在视觉上将控件扩展到父窗体之外。但是您可以通过为此控件创建一个单独的无边框窗体并在第一个窗体上部分显示此辅助窗体来达到效果:
此处 Form1
是主窗体,OnClick
处理程序用于 Button1
:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(nil);
try
Form2.Left := ClientOrigin.X + 140;
Form2.Top := ClientOrigin.Y + ClientHeight - 20;
Form2.ShowModal;
Edit1.Text := IntToStr(Form2.ModalResult);
finally
Form2.Free;
end;
end;
由于第二种形式 (Form2
) 与 Form1
无关(子-父级),我们必须将其位置指定为屏幕像素,但仍相对于 Form1
。因此我们使用Form1.ClientOrigin
(`Form1客户区顶部和左侧作为屏幕坐标)作为参考。
包含 TListBox
的第二种形式 Form2
具有以下 属性 设置
BorderStyle = bsNone
KeyPreview = True (to catch `Enter` key)
它的 OnKeyUp
事件处理程序写成
procedure TForm2.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_RETURN then
ModalResult := ListBox1.ItemIndex;
end;
如何在运行时显示超出父窗体边界的列表框:
图像是在设计时单击列表框时从 IDE 获得的。我想在运行时实现这个效果。
您无法真正在视觉上将控件扩展到父窗体之外。但是您可以通过为此控件创建一个单独的无边框窗体并在第一个窗体上部分显示此辅助窗体来达到效果:
此处 Form1
是主窗体,OnClick
处理程序用于 Button1
:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(nil);
try
Form2.Left := ClientOrigin.X + 140;
Form2.Top := ClientOrigin.Y + ClientHeight - 20;
Form2.ShowModal;
Edit1.Text := IntToStr(Form2.ModalResult);
finally
Form2.Free;
end;
end;
由于第二种形式 (Form2
) 与 Form1
无关(子-父级),我们必须将其位置指定为屏幕像素,但仍相对于 Form1
。因此我们使用Form1.ClientOrigin
(`Form1客户区顶部和左侧作为屏幕坐标)作为参考。
包含 TListBox
的第二种形式 Form2
具有以下 属性 设置
BorderStyle = bsNone
KeyPreview = True (to catch `Enter` key)
它的 OnKeyUp
事件处理程序写成
procedure TForm2.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_RETURN then
ModalResult := ListBox1.ItemIndex;
end;