1.如何判断子窗体是否已经被创建!
  我一般情况下会在每个FORM的ONCLOSE事件中写如
  action:=cafree;或者formname := nil;free;
2.当子窗体被打开时,父窗体变灰,就是说他的菜单及其其他控件处于无法使用状态!该怎么做呢?
  特此请教各位大侠!

解决方案 »

  1.   

    你在子窗体打开的同时,记录子窗体的句柄(form.handle);
    判断的时候,向这个句柄发个RM_GetObjectInstance消息
    (RM_GetObjectInstance 是系统定义的,可以直接用),这个消息会返回当前句柄所表示的窗口类的实例,也就是对象本身,如果返回的是nil,这表示这个对象已经被释放了,如果非空,则可以直接用这个消息的返回值强制转换下后就可以访问这个窗体了,呵呵,一举两得
      

  2.   


    //======================================================
    //findfrm函數用來查找子窗體,若當前打開則在最前面顯示,否則打開
    //======================================================
    Function  findfrm(frmname:String): boolean;
    var i:integer;
    begin
         result:=false;
         for i:=0 to screen.FormCount-1 do
          if uppercase(screen.Forms[i].Name)=uppercase(frmname) then
          begin
           screen.Forms[i].BringToFront;
           result:=true;
           break;
          end
          else
          result:=false;
    end;
    楼主用这个函数试试
      

  3.   


    procedure TmainFrm.Button1Click(Sender: TObject);
    begin
      if not findfrm('searchfrm')  then
         begin
           searchfrm:=Tsearchfrm.Create(self);
           searchfrm.Show;
           end
          else
            searchfrm.BringToFront;
    end;
      

  4.   

    2.当子窗体被打开时,父窗体变灰,就是说他的菜单及其其他控件处于无法使用状态!该怎么做呢?procedure TForm1.Button1Click(Sender: TObject);
    begin
      form2.Show;
      form1.Enabled := false;
    end;对于close其实不用你去释放,close只是把窗体关掉,并没有释放,在程序结束后窗体才会释放,而你自己进行释放的话那势必又要判断然后create,如果判断出错程序还会给你个异常,这样岂不是给自己增加了许多工作量
      

  5.   

    这种方法是不行的,当你的父窗体的ENABLE成为false你的子窗体也不能用了,呵呵!不信你试试!
      

  6.   

    您的这中方法也不行,我试了下每当 TForm1.Button1Click一次就创建一个!
      

  7.   

    if Assigned(子窗体) then //判断子窗体是否创建 true为创建反之
    beign
      子窗体.showmodal;//模式显示 父窗体无法操作创建窗体要做到 谁创建谁释放 窗体释放时最好freeandnil(子窗体)
    本身释放 且窗体指针设为空
      

  8.   

    1.如何判断子窗体是否已经被创建!
      我一般情况下会在每个FORM的ONCLOSE事件中写如
      action:=cafree;或者formname := nil;free;
      if not Assigned(xxxx) then
       ....
    2.当子窗体被打开时,父窗体变灰,就是说他的菜单及其其他控件处于无法使用状态!该怎么做呢?
      特此请教各位大侠!
      for i := 0 to self.ComponentCount - 1 do
        if (Self.Components[i] is TWinControl)and (Self.Components[i].ClassName <> 你的那个窗体的变量.ClassName) then
          TWinControl(Self.Components[i]).Enabled := False;或者
        for i := 0 to self.ComponentCount - 1 do
        TWinControl(Self.Components[i]).Enabled := (Self.Components[i] is TWinControl)and (Self.Components[i].ClassName <> 你的那个窗体的变量.ClassName)
      

  9.   

    可用动态数组维护已创建子窗口句柄列表。
    如果需要,还可以命名创建子窗口。比如ichildfrm:=TXXForm.Create(self);
    if assigned(ichildfrm)..已经创建
      

  10.   

    1 if assigned
    2 子窗体用showmodal打开,这 方法不可以么?
      

  11.   


    可是我的form1 false后 form2的按钮还可以点啊
     是你的问题吧
      

  12.   

    1.我的主窗体是用showmodal打开的!
    2.我不知道为什么用showmodal打开子窗体是报错!错误信息为cann't make a visible window modal!是make不是create
      

  13.   

    一般窗体设计期默认visble为false,而子窗体在设计期间就置为visible了,所以程序报cann't make a visible window modal.就是说你不能置一个可见的窗体为modal方式.