Delphi 如何在TForm边界之外显示控件(如TListbox)

Delphi 如何在TForm边界之外显示控件(如TListbox),delphi,tform,tlistbox,Delphi,Tform,Tlistbox,如何在运行时显示超出父窗体边界的列表框: 该图像是在设计时单击列表框时从IDE获得的。我希望在运行时实现这一效果。您无法在父窗体之外直观地扩展控件。但是,您可以通过为此控件创建单独的无边框窗体并在第一个窗体上部分显示此辅助窗体来实现此效果: 这里的Form1是一个主要表单,对于Button1,有以下OnClick处理程序: procedure TForm1.Button1Click(Sender: TObject); begin Form2 := TForm2.Create(nil);

如何在运行时显示超出父窗体边界的列表框:


该图像是在设计时单击列表框时从IDE获得的。我希望在运行时实现这一效果。

您无法在父窗体之外直观地扩展控件。但是,您可以通过为此控件创建单独的无边框窗体并在第一个窗体上部分显示此辅助窗体来实现此效果:

这里的
Form1
是一个主要表单,对于
Button1
,有以下
OnClick
处理程序:

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客户端区域顶部和左侧作为屏幕坐标)作为参考

第二个表单,
Form2
包含
TListBox
,具有以下属性设置

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;

你不能。这可能是一个拖拽图像,而不是控件本身。我记得MustangPeak的DropDownForm实现了您想要的ComboBox式行为。如果你能找到一个副本,也许你可以从中吸取一些想法。你的意思是在运行时拖动控件时达到同样的效果,还是让它以这种方式显示?你需要它自己的形式。@Uli和Jerry:谢谢,这让我知道了如何做。谢谢。出于我的目的,最好调用
Form2.Show
(非模态),并将
FormStyle
设置为
fsStayOnTop
。如果Form2是ShowModal,那么Form1是完全不可访问的,这不是“表单上有一个列表框”的想法。我理解你的观点,但是你还需要决定如何处理用户移动Form1,或者最小化/最大化它,或者只是调整它的大小。我不是说这不可行,但是。。。