在父窗口中自定义了一个消息。
怎样让它的所有子窗口接收到父窗口发出的这个消息?
非常感谢!!!

解决方案 »

  1.   

    你最好先建立一个窗体摸板,在窗体的的OnCreate方法中向主窗体登记,在OnDestroy方法中删除登记,然后定义一个所有单元都有的消息WM_CUSTE=WM_USER+110,然后在摸板窗体中建立一个方法MYNOTIFY,和一个WM_CUSTE消息方法.在MYNOTIFY方法中调用消息方法.
    当主窗体发送消息时候,可以遍历所有已经注册的窗体,调用窗体自己的MYNOTIFY方法,由他们去调用各个窗体的方法.注意你的各个子窗体必须由窗体摸板继承而来!
      

  2.   

    可以考虑用一个整型数组来存放子窗体的handle,维护这个数组就可以了。
      

  3.   

    简单写一下:
    窗体摸板部分:
    Constructor TFormModule.Create(AOwner:TComponent);
    var Main:TMainForm;//TMainForm为你的主窗体
    begin
      Main:=MainUnit.MainForm;
      Main.AddForms(self);
    end;Destructor TFormModule.Destroy;
    var Main:TMainForm;//TMainForm为你的主窗体
    begin
      Main:=MainUnit.MainForm;
      Main.DelForms(self);
    end;
    //以下这个方法为消息方法,你可以在继承后的各个窗体重新实现它;
    Procedure TFormModule.WMMyself(var message:TMessage);message WM_Myself;
    begin
      //you add some code here to do something;
    end;
    //这个方法是静态方法,只存在于摸板窗体中,子窗体不要改写
    Procedure TFormModule.DoSometing(var message:TMessage);
    begin
      WMMyself(message);
    end;主窗体部分:
    var formlist:TList;
    Constructor TMainForm.Create(AOwner:TComponet);
    begin
      formlsit:=List.Create;
    end;procedure TMainForm.AddForms(param:TForm);
    begin
      formlist.add(param);
    end;procedure TMainForm.DelForms(param:TForm);
    begin
      formlist.delete(param);
    end;procedure TMainForm.WMAllNotidy(var message:TMessage);message WM_Myself;
    var i:integer;
    begin
      for i:=0 to formlist.count-1 do
        TFormModule(formlist.items[i]).DoSometing(message);
    end;
    最后记住在主窗体的卸载代码中删除formlist对象就可以了!注意单元的引用避免循环!
      

  4.   

    如果有10个子窗口,当主窗口接受到WM_Myself消息后,将由WMAllNotidy向每一个子窗口发送一个WM_Myself消息,总共要发送10个WM_Myself消息。
    这样和下面的代码没有本质的区别。for i := 0 to MDIChildCount - 1 do
      PostMessage(MDIChildren[i].Handle, WM_Myself, 0, 0);        |--WM_Myself-->Form1
    MainForm|--WM_Myself-->Form2
            |--WM_Myself-->Form3而我的想法是只由主窗口发送一个WM_Myself消息,然后这个消息在所有的子窗口中遍历。MainForm --WM_Myself--> Form1 --WM_Myself--> Form2 --WM_Myself--> Form3这样的话如何实现?