如何判断一个form是否已经存在?因为若不存在就动态创建它,存在就不创建。

解决方案 »

  1.   

    你这个form存在的标志是什么?
    窗口指针还是类的实体?
      

  2.   

    if not assigned(form2) then form2:=Tform2.Create(Application);
      form2.BringToFront;
      

  3.   

    是这样的。我定义了就一个form,然后动态创建它,就是想在创建之前先判断是否已经创建过
    若不存在这个form则创建它。
      

  4.   

    你的意思是检查是否有这个实例了,
    可以用findwindow来检查
      

  5.   

    assigned(object)前提是object如果曾经创建过,然后释放,需要在释放后设置object:=nil;否则下次测试assigned(object)仍然为true。findwindow的办法不是很好,如果存在同名(同类名)的窗口,就麻烦了
      

  6.   

    也可以用mutex,窗口创建的时候检查互斥元,不存则创建,存在则取消窗口创建,窗口销毁的时候一并撤销此mutex。这种方法最好,可以将窗口封装成一个新的类,以后直接拿来用就行了
      

  7.   

    if form1=nil then
      form1:=Tform1.create(Application);
      

  8.   

    {*******************************************************************
      函 数 名: if_have_form( FormClass, fm, AOwner )
      功能描述:判定某一子窗口是否已打开
      参数说明:类名(FORMCLASS)、父窗口名(fm);窗体名(AOwner)
      返回    :True   :表示有此FORM
                False  :表示没有此FORM
      AUTHOR  : CXB
      Date    : 2002-12-01
    *******************************************************************}
    function if_have_form( FormClass: TFormClass; var fm; AOwner: TComponent ):Boolean;
    var
    i: integer;
    Child: TForm;
    begin
      for i := 0 to Screen.FormCount - 1 do
        //如有一窗口打开,将不打开新的窗口
            if Screen.Forms[i].ClassType = FormClass then
          begin
            Child := Screen.Forms[i];
            if Child.WindowState = wsMinimized then    //如已存在但最少化的窗口,将还原显示
                ShowWindow(Child.handle, SW_SHOWNORMAL)
            else
              ShowWindow(Child.handle, SW_SHOWNA);
            if (not Child.Visible) then Child.Visible := True;
            Child.BringToFront;
            Child.Setfocus;
            TForm(fm) := Child;
            result := True;
            exit;
      end
      else if Screen.Forms[i].FormStyle = fsMDIChild Then
      begin
            application.MessageBox( '请先关闭窗口','警告',mb_iconwarning );
            result := True;
            exit;
      end;
      result := False;
    end;
      

  9.   

    If Form2 = nil then 
       Application.CreateFrom(TForm, Form2);
    Else
       Form2.show;
    End;
      

  10.   

    最常规的做法:使用Assigned函数来进行判断if not Assigned(Form1) then
      Form1:=TForm1.Create(Application);类TForm1的VMT已经存在于堆中,所以这个时候只要判断栈上的窗体指针Form1的内容是否有效就可以了!
      

  11.   

    比较经典~的判断
    我动态创建完以后如果释放不把object:=nil的话
    判断assigned(object)时候出错了的
      

  12.   

    http://218.56.11.178:8020/web/technology.aspx->下载基地->例程-基础应用->如何检测已创建的form
      

  13.   

    if findwindow('tform1','form1')=NULL then
     tform1.creat(application)
      

  14.   

    To Sy_315  常规的编写代码方法是在释放了对象实体后立刻对对象指针进行释放,这样做的唯一目的就是避免以后对野指针的调用,从而出现内存访问错误!  所以,按照你说的不对对象指针进行释放,这种操作从根本上就是错误的!你一开始就这样错误的写代码,接着又用Assigned函数去判断对象指针内容意义与否,你认为这种操作逻辑正确吗?最直接的方法,释放的时候使用FreeAndNil函数!