如何在 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;