调用嵌入表单的Show()应显示父表单

时间:2014-11-17 14:16:54

标签: delphi c++builder vcl tform

我在我的应用程序中使用嵌入式表单,我正在尝试这样的事情:

在设计时,表单是一种普通形式,对嵌入/对接一无所知。 使用ButtonClick,我可以通过调用表单的Show()方法使表单可见。 在运行时,可能会发生表单停靠到另一个表单并成为嵌入表单。 当我按下按钮再次显示表单(现在已嵌入)时没有任何反应,因为 我必须为包含嵌入表单的表单调用Show()。

我正在寻找一种在调用嵌入表单的Show()方法时强制显示父表单的方法。我可以通过在调用Show()之前检查父表单的存在来处理这个问题,但我不想包含这个特定的处理。

我更愿意在父表单中执行此处理,以便在表单停靠时收到通知。

Show()方法只将Visible属性设置为true(RAD Studio帮助),所以我不认为邮件会被触发......?

你知道一种实现这种方法的方法吗?

修改

我想提供一些关于我的应用程序的信息,因为我猜这更像是一个设计问题,而不是一个编程问题。

该应用程序使用多个插件来适应连接的硬件。 exe提供了一个drag& dock环境,并包含一个可停靠表单的基类。插件不了解对接实现。通过创建可停靠的表单并从插件中嵌入表单,插件表单变为可停靠。这就是为什么我想要在调用嵌入式窗体的方法Show()时显示父窗体的原因。

2 个答案:

答案 0 :(得分:4)

您可以为嵌入的表单甚至应用程序中的所有表单创建一个共同的祖先,然后从中派生您的表单:

type
  TEmbeddedForm = class(TForm)
  public
    procedure Show;
  end;

procedure TEmbeddedForm.Show;
var
  ParentForm: TCustomForm;
begin
  inherited Show;
  ParentForm := GetParentForm(Self);
  if ParentForm <> Self then
  begin
    // Form is Embedded
    Update;        
    ParentForm.Show;
    // You might alternatively consider to send custom 
    // message to the Parent form, and let it decide what to do e.g.
    // SendMessage(ParentForm.Handle, CM_MY_EMBEDED_FORM_SHOW, 0, 0);
  end;
end;

然后当你打电话:

procedure TForm1.Button1Click(Sender: TObject);
begin
  // MyEmbeddedForm is derived from TEmbeddedForm 
  MyEmbeddedForm.Align := alClient;
  MyEmbeddedForm.BorderStyle := bsNone;

  MyEmbeddedForm.Parent := Form3.Panel1;
  MyEmbeddedForm.Show;
end;

Form3正在展示。


另一个选项(我只用Spy ++确认)是截取WM_CHILDACTIVATE中的WM_WINDOWPOSCHANGINGTEmbeddedForm。当子表单调用TEmbeddedForm.Show时,它会发送给它,并相应地执行,即GetParentForm(Self).Show

答案 1 :(得分:0)

在嵌入表单上使用SetFocus代替Show

这也将强制显示父表单。