我在我的应用程序中使用嵌入式表单,我正在尝试这样的事情:
在设计时,表单是一个正常的表单,对嵌入/对接一无所知。
使用 ButtonClick,我可以通过调用表单的 Show() 方法使表单可见。
在运行时,表单可能会停靠到另一个表单并成为嵌入式表单。
当我按下按钮再次显示表单(现在是嵌入的)时,什么也没有发生,因为
我现在必须为包含嵌入表单的表单调用 Show()。
我正在寻找一种在调用嵌入表单的 Show() 方法时强制显示父表单的方法。我可以通过在调用 Show() 之前检查父表单的存在来处理这个问题,但我不想包含这个特定的处理。
我更愿意在父表单中进行此处理,当表单停靠时会收到通知。
Show() 方法仅将 Visible 属性设置为 true(RAD Studio 帮助),所以我认为不会触发消息...?
你知道实现这样的事情的方法吗?
编辑
我想提供一些关于我的应用程序的信息,因为我猜这更像是一个设计问题而不是编程问题。
该应用程序使用几个插件来适应连接的硬件。该 exe 提供了一个拖放环境,并包含一个可停靠表单的基类。插件对对接实现没有任何了解。通过创建可停靠表单并从插件嵌入表单,插件表单变得可停靠。这就是为什么我希望在某处调用嵌入表单的 Show() 方法时显示父表单的原因。
最佳答案
您可以为您的嵌入式表单甚至应用程序中的所有表单创建一个共同的祖先,然后从中派生您的表单:
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_WINDOWPOSCHANGING
在 TEmbeddedForm
.当子窗体调用 TEmbeddedForm.Show
时发送给它,并采取相应的行动,即 GetParentForm(Self).Show
.
关于delphi - 调用嵌入表单的 Show() 应该显示父表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26974682/