Delphi TForm.ManualDock是否应在FormShow上调用?

Delphi TForm.ManualDock是否应在FormShow上调用?,delphi,events,event-handling,docking,Delphi,Events,Event Handling,Docking,当我输入这个问题时,我意识到它可能应该 将表单停靠到TPageControl在调用form.Create()和form.ManualDock(pagecontrol,pagecontrol.alClient)时调用FormShow 取消停靠表单也会调用show,我假设这是因为在停靠/取消停靠时表单实际上是“重置”的 如果这是设计好的,我将重构我不想在那里触发的代码以再次创建(除非这是糟糕的设计)。是否应该比技术问题更具哲理。通过执行函数也使用的控制消息来触发事件。在内部,此消息调用触发事件本身的

当我输入这个问题时,我意识到它可能应该

将表单停靠到TPageControl在调用form.Create()和form.ManualDock(pagecontrol,pagecontrol.alClient)时调用FormShow

取消停靠表单也会调用show,我假设这是因为在停靠/取消停靠时表单实际上是“重置”的


如果这是设计好的,我将重构我不想在那里触发的代码以再次创建(除非这是糟糕的设计)。

是否应该比技术问题更具哲理。通过执行函数也使用的控制消息来触发事件。在内部,此消息调用触发事件本身的内容

在下面的示例中,我将使用两个表单,Form1(带有页面控件和按钮)和Form2(空且可固定)。我认为两者都是自动创建的

以下代码证明事件是由控制消息触发的。单击按钮,执行消息并触发Form2的事件

表格1的代码

procedure TForm1.FormShow(Sender: TObject);
begin
  Form2.Show;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  DockObject: TDragDockObject;
begin
  DockObject := TDragDockObject.Create(Form2);
  try
    // sending the CM_DOCKCLIENT message internally performs also the
    // CM_SHOWINGCHANGED message which triggers the TForm.OnShow event
    PageControl1.Perform(CM_DOCKCLIENT, WPARAM(DockObject), LPARAM(SmallPoint(0, 0)));
  finally
    DockObject.Free;
  end;
end;
Form2只有事件处理程序

procedure TForm2.FormShow(Sender: TObject);
begin
  ShowMessage('FormShow');
end;
一个简单的解决方法不是通过自己(在事件中)手动停靠Form2,而是通过创建者或显示它的表单来停靠它。在上一个示例中,我在Form1.OnShow事件中显示了Form2,因此我可以轻松地将其手动停靠在那里

procedure TForm1.FormShow(Sender: TObject);
begin
  Form2.Show;
  Form2.ManualDock(PageControl1);
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  // no manual docking of this form by itself
end;

手动表单后也会调用FormShow.Hide;形式。表演;也按照您描述的方式,您只希望代码运行一次,因此FormCreate无论如何都是一个更好的地方。即使你从不隐藏你的表单,其他程序也可以隐藏你的表单。谢谢-我只是把我需要的东西扔进了OnCreate。