//在form2中单击按钮,显示一个窗口f1,代码如下:
form2.button1click(sender:object)
var f1:Tform1;
begin
    if f1=已经存在 //如何在这里判断这个f1窗口已经被创建过了?
     //注意这里f1是一个局部变量。
       f1.BringToFront;
    else
    begin
       f1:=Tform1.create(self);
       f1.show;
    end;
end;
敬请帮助,不胜感激。

解决方案 »

  1.   

     if f1<>nil then
      

  2.   

    楼主的写法本身就是有问题的,kaikai_kk被楼主误导了:---- f1是局部变量,初始值不可预测,你那样写会出错的。楼主需要表达出自己的最终需求,自然有人马上给你写出代码,很简单。
      

  3.   

    首先说一下为什么kaikai_kk的写法会出错:form2.button1click(sender:object) 
    var f1:Tform1; 
    begin 
        if f1<>nil then 
          //局部变量在栈上分配空间,但栈管理仅仅是移动栈顶指针,栈上随机存放着此前用过的乱七八糟的数据
         // 一量f1被分配在内容不为0的四个字节上,那么这个判断将成立,但f1指向的位置一定不是一个TForm1的实例
          //将报内存错误
         // 只有在巧合的情况下,f1占据的四字节栈空间全部是0,则 f1=nil,才转去执行下面的Create语句
         // Assigned(Pointer)与 Pointer=nil是同样的效果。
          
           f1.BringToFront  
        else 
        begin 
           f1:=Tform1.create(self); 
           f1.show; 
        end; 
    end; 再假设一下楼主的最终需求:----如果楼主只是想“通过F1创建一个TForm1的实例,如果此实例已创建,就显示出来;如果未创建或已释放,那就重新创建并显示”:那么就可以用kaikai_kk的写法了,但要求是全局变量。var
      F: TForm1;{全局变量}procedure TForm1.Button2Click(Sender: TObject);
    begin
      if not Assigned(F) then F := TForm1.Create(Self);
      F.Show;
    end;有一个前提条件,就是:在释放F对象后,要做到立即把F变量赋值为空指针:F := nil;这样,当F.Hide后,F隐藏,此时再点击Button将重新显示F;当FreeAndNil(F)后,就重新构造并显示。------如果楼主是想动态创建多个TForm1的实例,那么,有几种方案:
    一种是通过array of TForm1进行管理(或TList)
    二种是用with开域语句进行构造,同时一定要给窗体起一个名字,然后,可以通过这个名字,用FindComponent进行查找
    这种方法也有一个前提,那就是Create(AOwner)时,一定要指定AOwner为同一个对象,例如Self
    说了这么多,没有实际去改楼主的代码,汗自己一个。不写了。
      

  4.   

    LZ要这样用,我也这样写了,供参考而已hehe...
      

  5.   

    楼主这样写代码说明有很多问题还没搞懂,delphi里所谓的对象皆是一个指针,你声明成函数(过程)局部的,如果自己没有较好的释放掉对象的内存,在过程结束后很有可能会该对象的内存没有被释放,而指针(4byte)已经被释放了,从而导致你或应用无法释放这块内存。
    var f1:Tform1; 
    在你新建一个form的时候,对应的unit里已经自动给你声明了一个这个窗体变量,而它是全局的,你完全可以使用这个变量就可以了,但在具体判断的时候你虽然可以使用if Assigned(frm1) then这样的方法来判断,但你要做到必要的初始化,及在关闭form的时候做好free及指为nil(或者用freeandnil)
      

  6.   


    form2.button1click(sender:object)  
    var 
        f1:Tform1;  
    begin  
        if f1 <>nil then //或if assigned(f1) then
        begin  
           f1.BringToFront;
        end
        else  
        begin  
           f1:=Tform1.create(self);  
           f1.show;  
        end;  
    end;  
      

  7.   

    我的想法就是:动态创建多个TForm1的实例,如果该实例已经存在就置前,否则新建;在网上搜的文章,然后用句柄实现的:
    public h:hwnd
    buttonclick(sender :Tobject)
    var f1:Tform1;
    begin
       //判断
       if (hwnd<>0) then SetForegroundWindow(hwnd)
       else 
       begin f1:=Tform2.create  (self);hwnd:=f1.handle;end;
    end;
    然后在form2中释放:form1.h:=0;
    不知道使用句柄是否有隐患?
    谢谢诸位,倾力相助。
      

  8.   

    给你写了一种方案的演示代码,请参考。(需要新建工程测试,然后主窗体放两个Button,单元如下)unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      I : integer;
    begin
      for I := 1 to 5 do
        if Self.FindComponent('MyFrm'+InttoStr(I)) = nil then
          with TForm1.Create(Self) do begin
            Name := 'MyFrm' + InttoStr(I);
            Top := 30;
            Left := 50*I;
            Caption := Name + '创建于' + Formatdatetime('hh:nn:ss.zzz', Now);
            Button1.Enabled := False;
            Show;
          end
        else
          TForm1(Self.FindComponent('MyFrm'+InttoStr(I))).Show;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      Self.Hide;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Button1.Width := 200;
      Button1.Caption := 'All Create or Show';
      Button2.Caption := 'Hide Self';
    end;end.
      

  9.   

    谢谢,我觉得命名成public和利用句柄都一样。