【问题标题】:How to 'parent' a form? (Controls won't accept focus)如何“父”表单? (控件不接受焦点)
【发布时间】:2017-02-06 10:22:42
【问题描述】:

我有一个子表单“frmTest”和一个主表单“TfrmMain”。我将主窗体设置为 frmTest 的父窗体,如下所示:

unit Main;

INTERFACE
USES
  System.SysUtils, System.Classes, Vcl.Forms, Test, Vcl.StdCtrls, Vcl.Controls;

type
  TfrmMain = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

IMPLEMENTATION  {$R *.dfm}

procedure TfrmMain.Button1Click(Sender: TObject);
VAR frmTest: TChildForm;
begin
  Application.CreateForm(TChildForm, frmTest);
  //frmTest:= TForm1.Create(Self);
  frmTest.Parent:= Self;
  frmTest.Show;
  frmTest.SetFocus;
end;

unit test;  { THIS IS THE CHILD }

INTERFACE

USES
  System.SysUtils,  System.Classes, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Samples.Spin;

TYPE
  TChildForm = class(TForm)
    Edit1: TEdit;
    SpinEdit1: TSpinEdit;
  private
  public
  end;


IMPLEMENTATION {$R *.dfm}

end.

Code as ZIP

但是 frmInsertImg 中的控件(编辑框、旋转编辑等)不会接受鼠标的焦点,但可以使用 Tab 进行焦点。

我做错了什么?

【问题讨论】:

  • 我们不需要 ZIP,只需要 Q 中的 minimal reproducible example
  • Q 中发布的完整示例
  • 添加frmTest.BorderStyle := bsNone 一切都很好。我怀疑您是否真的希望表单的非客户端 chrome 显示为顶级窗口。通常你会同时将Align 设置为alClient
  • 包括 WS_CAPTION 似乎是搞砸鼠标交互的原因。我强烈建议您放弃当前计划并使用bsNone。如果您出于视觉原因需要提供框架,请执行此操作。

标签: delphi delphi-xe7


【解决方案1】:

我建议您将子窗体的BorderStyle 设置为bsNone。我不确定它起作用的确切原因,但它具有预期的效果。

如果您需要为子表单添加可视框架,那么最好使用包含子表单的显式 UI 来完成。

在我看来,表单并不是真的打算以这种方式使用。你可以让事情大部分工作,但它不是非常强大。将 UI 放入框架中,然后托管应该会带来更好的行为。

【讨论】:

  • “我不确定这行得通的确切原因”-我只是想问你这到底是为什么 :) 这似乎无关 :) 边框如何影响焦点?
  • Focus 只是当您为表单设置父级时会有些麻烦的事情之一。表单并不是真正为此而设计的。更简洁的设计是使用框架。
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 2020-08-16
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多