【问题标题】:How to display a control (e.g. TListbox) beyond the borders of a TForm如何在 TForm 的边界之外显示控件(例如 TListbox)
【发布时间】:2018-12-10 19:19:09
【问题描述】:

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

图像是在设计时单击列表框时从 IDE 获取的。我想在运行时实现这个效果。

【问题讨论】:

  • 你不能。这可能是拖动图像,而不是控件本身。
  • 我记得 MustangPeak 的 DropDownForm 实现了你想要的类似 ComboBox 的行为。 如果你设法找到一个副本,也许你可以从中获得一些想法。
  • 您的意思是在运行时拖动控件的同时达到相同的效果还是保持这种显示方式?
  • 你需要它是它自己的形式。
  • @Uli 和 Jerry:谢谢,这让我知道该怎么做。

标签: delphi tform tlistbox


【解决方案1】:

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

这里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;

【讨论】:

  • 谢谢。出于我的目的,最好调用Form2.Show(不是模态),并将FormStyle 设置为fsStayOnTop。如果 Form2 是 ShowModal 则 Form1 是完全无法访问的,这不是“在表单上拥有一个列表框”的想法
  • 我理解您的观点,但是您还需要决定如何处理用户移动 form1,或最小化/最大化或仅调整其大小。我不是说它不可行,但是...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 2011-07-18
  • 1970-01-01
  • 2015-07-01
  • 2014-12-15
  • 1970-01-01
  • 2018-09-29
相关资源
最近更新 更多