点一个按钮,创建一个窗口,然后把它隐藏。下次再点按钮时,先判断这个窗口是否存在,如果存在就Show,若不存在在,再Create。现在的问题是,我不知道怎么判断窗口是否存在。请各位指点下。谢谢!

解决方案 »

  1.   

    if Application.FindComponent('FormXXXX')=nil then
          Application.CreateForm(TFormXXXX,FormXXXX);
      FormXXXX.Show;
      

  2.   

    if Assigned(窗体实例) then
      存在
      

  3.   

    Assigned 窗体释放后重新Create出现异常
      

  4.   

    var
      AForm2:TForm2;procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Assigned(AForm2)then
        ShowMessage('存在')
      else
        ShowMessage('不存在!');
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      AForm2:=TForm2.Create(Self);
      AForm2.Show;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
      AForm2.Release;
    end;我的程序是社么写的:第一个按键是测试是否存在,第二个按钮创建窗口,第三个销毁。
    程序运行后,直接点第一个按键,出现“不存在”,当创建后,再点,出现“存在”。当点第三个把窗口Release后,点第一个还是出现“存在”,请问这是怎么加速,请指点下。
      

  5.   

    用Assigned重新Create没有出现异常,但是检测不到窗口是否存在。当窗体没有创建时,用Assigned显示没有创建,当创建了,能够找到窗体,显示“存在”,但是把窗体销毁后,还是显示“存在”,就不知道是为什么了,用Application.FindComponent也一样。这是怎么回事?
      

  6.   


    button1  中這樣寫。if Assigned(Application.FindComponent('AForm2')) then ShowMessage('存在')  else
       ShowMessage('不存在!'); 
      

  7.   

    用你的方法:
    var
      Aform2:TForm2;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Aform2:=Tform2.Create(Self);
      Aform2.Show;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      if Application.FindComponent('AForm2')=nil then
        ShowMessage('does not exist!')
      else
        ShowMessage('Exist');end;无论是创建还没有创建都没有检测到窗体,是我写得不对吗?
      

  8.   


    procedure TForm1.Button1Click(Sender: TObject);
    begin
      form2:=Tform2.Create(Self);
      form2.Show;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      if Application.FindComponent('Form2')=nil then
        ShowMessage('does not exist!')
      else
        ShowMessage('Exist');
    end;我测试没问题啊
      

  9.   


    if Application.FindComponent('Form2')=nil then 
          Application.CreateForm(TForm2,Form2); 
      Form2.Show;这样不可以么?
      

  10.   

    if Assigned(Application.FindComponent('Form2')) then ShowMessage('存在')  else
       ShowMessage('不存在!'); 那是因為你又自己聲明了一個TFORM2的變量子 Aform2 , 你看下你的 Tform2 的NAME是什麼,相對應的你的 FindComponet  也應該找哪一個NAME
      

  11.   


    不管是否创建,都是“dose not exist"。
    我把第二个窗体在Project的选项里从AutoCreate移到Available里了。和这有着么吗?
      

  12.   


    procedure TForm1.Button1Click(Sender: TObject);
    begin
      form2:=Tform2.Create(Self);
      form2.Show;
    end;你这样form2的所有者是form1 //此时的Self是form1
    Application.FindComponent当然是找不到了
      

  13.   

    if MyForm<> nil then
       MyForm.Show
    else
       MyForm ;= TMyForm.Create(nil);
    //MyForm为全局变量 
      

  14.   

    再补充一点,在MyForm的析构事件中把MyForm置空了。
      

  15.   

    constructor TComponent.Create(AOwner: TComponent);
    begin
      FComponentStyle := [csInheritable];
      if AOwner <> nil then AOwner.InsertComponent(Self);
    end; 好好理解下這個意思
      

  16.   

    //指定窗口是否存在,存在,则将其置前并返回真
    function Tfrm_main.checkFromExist(TypeName : TClass): bool;
    var
      I:integer;
    begin
      for I := 0 to self.MDIChildCount - 1 do
      begin
        if self.MDIChildren[i].ClassType=TypeName then
        begin
          result:=true;
          if self.MDIChildren[i].WindowState=wsMinimized then MDIChildren[i].WindowState:= wsMaximized;
          MDIChildren[i].BringToFront;
          exit;
        end;
      end;
      result:=false;
    end;
      

  17.   

    可以不可以这样理解:
    AForm2:TForm2;里的Afomr2是一个指针,判断这个指针是否为空?
      

  18.   

    对,只要记住在释放窗体的onclose 事件action := cafree后面紧接MyForm := nil;
      

  19.   

    窗口的析构事件是OnDestroy事件,不是OnClose事件。在TMyForm的OnDestroy事件中加上以下语句就没问题了。
    MyForm := nil;//MyForm为全局变量判断窗口是否存在只需要判断MyForm = nil是否为假即可。
    if MyForm <> nil then 
      MyForm.Show 
    else 
      MyForm := TMyForm.Create(nil);
      

  20.   

    那我再问一句:动态创建的窗体(就在程序启动时不创建,程序运行时根据需要创建的窗体,比如把Form2由Auto-Create放到Available里),点窗体上的那个小叉,是隐藏还是从内存中销毁呢?