gpt4 book ai didi

delphi - 表单如何向其所有者发送消息?

转载 作者:行者123 更新时间:2023-12-02 13:46:14 24 4
gpt4 key购买 nike

我编写了一个基于 MDI 的应用程序,其中子窗体具有不同的类型。我现在遇到一种情况,我需要一个子表单向另一个子表单发送消息,告诉它自行更新。第一个子窗体不知道当前是否正在显示第二个子窗体。

我曾想过让第一个子窗体(窗体 A)向主 MDI 窗体(窗体 0)发送一条消息,然后主窗体可以检查屏幕上当前显示的 MDI 子窗体列表。如果正在显示所需的表单(表单 B),则主表单可以向该表单(表单 B)发送第二条消息。

不幸的是,我无法成功编写使第一个子表单能够向主表单发出信号的代码。子表单如何向其所有者发送消息?

TIA,诺姆

最佳答案

表单的所有者不一定是另一个表单。 Owner property 只是 TComponent,它可以是任何东西,包括 nil。但如果所有者一个表单,您可以向它发送如下消息:

if Owner is TForm then
SendMessage(TForm(Owner).Handle, am_Foo, 0, 0);

不过,您可能不需要认识所有者。 MDI 父窗体始终是项目的主窗体,并且主窗体始终由Application.MainForm 指定。 。向该表单的句柄发送消息。

SendMessage(Application.MainForm.Handle, am_Foo, 0, 0);
<小时/>

MDI子项列表将在Application.MainForm.MDIChildren中。您的子窗体可以自己检查该列表,而不是让 MDI 父窗体执行此操作。您的任何一个表单都可以使用以下函数来查找任何 MDI 子类的实例。 (如果想要通信的窗体不是 MDI 子窗体,您仍然可以使用此技术,但不是搜索 Application.MainForm.MDIChildren,而是搜索 Screen.Forms 列表。)

function FindMDIChild(ChildClass: TFormClass): TForm;
var
i: Integer;
begin
for i := 0 to Pred(Application.MainForm.MDIChildCount) do begin
if Application.MainForm.MDIChild[i].InheritsFrom(ChildClass) then begin
Result := Application.MainForm.MDIChildren[i];
exit;
end;
end;
Result := nil;
end;

你的第一个子类可以像这样使用它:

var
SecondChild: TForm;
begin
SecondChild := FindMDIChild(TSecondChild);
if Assigned(SecondChild) then begin
SendMessage(SecondChild.Handle, am_Foo, 0, 0);
end;
end;

当窗口消息被发送到与发送者相同的线程中的窗口时(对于任何两个 VCL 窗体总是这种情况),当发送者等待响应时,它们的处理程序将立即被调用。这就像普通的函数调用一样,因此您可能希望跳过消息并在表单类中创建常规函数。然后你可以使用这样的代码:

var
SecondForm: TSecondForm;
begin
SecondForm := TSecondForm(FindMDIChild(TSecondForm));
if Assigned(SecondForm) then begin
SecondForm.Foo(0, 0);
end;
end;

关于delphi - 表单如何向其所有者发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2123571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com