MDI中,子窗体关闭后,主窗体怎样知道 ( 积分: 50 )

  • 主题发起人 主题发起人 青云
  • 开始时间 开始时间

青云

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在像做一个常用的功能,就是在主窗体中,把当前的打开的子窗体都在主窗体的菜单上显示,并在活跃的窗体对应的菜单上打上勾。
现在遇到一个技术难题,就是子窗体关闭时,主窗体上对应的菜单要跟着删除。这个不知道如何处理。总不至于每个子窗体里都要 uses 主窗体,这样结构不好。

我同事说,可以用广播机制处理,不过我不太懂。
希望能和大家探讨一下。
 
http://bbs.2ccc.com/topic.asp?topicid=269000
 
可以在子窗体里发送消息到主窗体。在消息处理函数里删除菜单 !sendmessage
 
这个功能不用自己做的,Delphi已经实现了。你只要把主窗体的WindowMenu指定为一个TMenuItem对象即可(如在主菜单中有一个标题为Windows的菜单项对象)。当你打开一个MDI子窗体时会自动被添加到这个菜单项下面,且活动的子窗体对应的菜单项会被勾选上。
 
fsldg 朋友。
如果您有空,能否把具体的子窗体把消息传给主窗体的实现讲一下。
ChrisMao朋友
你的方法确实很好,不过我没有用标准的菜单,我用的是第三方的菜单控件(DevExpress)
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3453891

把里面的WM_MDIACTIVATE改为WM_MDIDESTROY就是MDI窗体关闭消息了
Message.wParam就是被关闭的MDI子窗体的句柄
 
首定定义两个消息常量
const
WM_ChildFormClosed = WM_USER + $0001;
WM_ActiveChildFormChanged = WM_USER + $0002;

然后在主窗体中定义两个消息处理过程
procedure ChildFormClosed(var msg: TMessage); message WM_ChildFormClosed;
procedure ActiveChildFormChanged(var msg: TMessage); message WM_ActiveChildFormChanged;


procedure TfrmMain.ChildFormClosed(var msg: TMessage);
var
MenuItem: TMenuItem;
begin
if msg.Msg = WM_ChildFormClosed then begin
MenuItem := MainMenu1.Items.Find(String(msg.WParam));
MainMenu1.Items.Delete(MainMenu1.Items.IndexOf(MenuItem));
end;
end;

procedure TfrmMain.ActiveChildFormChanged(var msg: TMessage);
var
MenuItem: TMenuItem;
begin
if msg.Msg = WM_ActiveChildFormChanged then begin
MenuItem := MainMenu1.Items.Find(String(msg.WParam));
MenuItem.Checked := True;
end;
end;


//===========================
子窗体中加入以下代码

procedure TfrmMDIChildBase.FormClose(Sender: TObject; var Action: TCloseAction);
var
s: String;
begin
s := Self.Caption;
PostMessage(MainFormHandle, WM_ChildFormClosed, Integer(s), 0);
Application.ProcessMessages;
Action := caFree;
end;

procedure TfrmMDIChildBase.FormActivate(Sender: TObject);
var
s: String;
begin
s := Self.Caption;
PostMessage(MainFormHandle, WM_ActiveChildFormChanged, Integer(s), 0);
Application.ProcessMessages;
end;
 
太感动了,就这么一会儿,得到这么多热心朋友的帮助。
delphi的势头这几年不太好,觉得用delphi的人可能会越来越少。
不好咱们的大富翁依然红火啊。
 
哥们,你搞反了,
为什么不能主窗体主动去读取呢?

这样代码反而少,并且安全。
 
我使用 ChrisMao 的方法搞定了,里面的 MainFormHandle 我用的全局变量。
把传递的Self.Caption 改成 self.Handle
因为delphi支持unicode做的很烂,中文的Caption 它会把某些部分读成怪字符;

aKnightChen的方法,也许更方便。
只是看了不太明白。
 
MainFormHandle放在MDI窗体基类中会更好些。
 
學習學習。。。學習。。
 
又会一个问题```嘻嘻```[:D]
 
后退
顶部