1、我有Tform1.create(self)建立了并显示为一个模态窗口,如何关闭最好?我用CLOSE和FREE都不行,提示错误!
2、我用MDI结构,也是用以上方法建立的,用SHOW来显示,应该怎么关闭最好?
3、我怎么能知道MDI结构中打开了哪些CHILD窗口?
4、有谁用过skinengine控件,知道它的MENUBAR控件在MDI窗口中,怎么把子窗口的菜单应用到主窗口上!?(这个不知道就算了,知道最好!)多谢高手!

解决方案 »

  1.   

    1.可以在Formclose中加入
      Action := caFree;
      Form1 := nil;2.直接Close,可以类似上面的
      

  2.   

    3.
     可以用MDIChildCount, MDIChildren
     with MainForm do
        for I := 0 to MDIChildCount - 1 do
          ShowMessage(MDIChildren[I].Name);
      

  3.   

    2。TCloseAction = (caNone, caHide, caFree, caMinimize);
       其实MDIChild是在关闭的时候调用了默认的Action :=caMinimize
       只要在form的关闭事件里写action:=cafree就可以了
      

  4.   

    关于第二个问题是这样的,我想在MDI窗口里当打开一个子窗口的时候关闭其它打开的子窗口,我知道子窗口的onclose事件中把action:=cafree可以关闭这个子窗口,但是我是在主窗口里执行打开或关闭子窗口的,我就不知道该怎么办了,刚学习不久,望大家不要见笑!多谢指点!!!
      

  5.   

    关于第3个问题可以后回掉函数,
    unit Unit3;interface
    uses
      Windows,Classes,Forms,SysUtils,Messages;type
      P=^TWindowsStruct;
      TWindowsStruct=record
         ClassName:String;
         AChiWinHnad:Thandle;
    end;
    var
       WRString:String;
    function EnumChildProcY(CHandle:Hwnd;Lparms:LongInt):Boolean;
      {$IFDEF Win32}stdcall;{$ELSE};export;{$ENDIF}
    function FindWindowA(ClassName:String):Thandle;
    procedure ReportToForm2(X,Y:String);
    procedure RestoreWindow(AWindowHand:THandle);implementation
    uses
      unit1,unit2;
    function FindWindowA(ClassName:String):THandle;
    var
       AWindowsStruct:TWindowsStruct;
    begin
       AWindowsStruct.ClassName:=UpperCase(ClassName);
       AWindowsStruct.AChiWinHnad:=0;
       EnumChildWindows(Application.MainForm.Handle,@EnumChildProcY,Longint(@AWindowsStruct));
       FindWindowA:=AWindowsStruct.AChiWinHnad;
    end;function EnumChildProcY(CHandle:Hwnd;Lparms:LongInt):Boolean;
         {$IFDEF Win32}stdcall;{$ELSE};export;{$ENDIF}
    var
       ATFormName:PChar;
       FormFound:Boolean;
    begin
       GetMem(ATFormName,255);
       Result:=True;
       FormFound:=False;
       try
         if GetClassName(CHandle,ATFormName,255)>0 then
           if Pos(P(Lparms).ClassName,UpperCase(ATFormName))>0 then
              FormFound:=True;       if FormFound then
             begin
               P(Lparms).AChiWinHnad:=CHandle;
               Result:=False;
             end;
        finally
           FreeMem(ATFormName,Sizeof(ATFormName^));
        end;
    end;
    procedure ReportToForm2(X,Y:String);
    var
      TheWindowHandle:THandle;
    begin
      TheWindowHandle:=FindWindowA('TChildForm');
      with AppliCation do
        if TheWindowHandle=0 then
          begin
            AppliCation.CreateForm(TChildForm,ChildForm);
            SendMessage(ChildForm.Handle,WM_RunChild,LongInt(@X),LongInt(@Y));
            if X='WR' then
              SendMessage(ChildForm.Handle,WM_WRMeg,0,Longint(@WRString));
          end
        else
          begin
            SendMessage(ChildForm.Handle,WM_RunChild,LongInt(@X),LongInt(@Y));
            if X='WR' then
            SendMessage(ChildForm.Handle,WM_WRMeg,0,Longint(@WRString));
            RestoreWindow(TheWindowHandle);
            BringWindowToTop(TheWindowHandle);
          end;
    end;
    procedure RestoreWindow(AWindowHand:THandle);
    begin
       if IsIconic(AWindowHand) then
          OpenIcon(AWindowHand)
    end;
    end.
      

  6.   


    在创建之前写:
    begin
      if MainForm.ActiveMDIChild <> nil then
      MainForm.ActiveMDIChild.Close;
      创建new MDIChild
      ....
    end;
      

  7.   

    第二个问题在MDI中,可以在childform中的onclose事件中用Action := caFree关闭childform, 这是最好的方法。