我的子窗体是动态建立的.如果多次调用该函数的话!就会生成多个Frm 如何使其只有一个?
procedure TForm1.Frm2ShowOnClick(Sender:TObject);
var
 Frm:TForm2
begin
  Frm:=TFrom2.Create(Selft);
  Frm.Show();
end;

解决方案 »

  1.   

    if Assigned(Form2) then
        begin
          showmessage('已经存在了');
          Exit;
        end;
      Form2 := TForm2.Create(Self);
      Form2.Show;
      

  2.   

    procedure TForm1.Frm2ShowOnClick(Sender:TObject);
    var
     Frm:TForm2
    begin
      if from2=nil then
         Frm:=TFrom2.Create(Selft);
      Frm.Show();
    end;
      

  3.   

    Tform2.onclose
    beginaction:=cafree;
    form2:=nil;
    end;
      

  4.   

    if not Assigned(Form1) then
       Form1:=TForm1.Create(Application);
    Form1.Show;
      

  5.   

    Assigned(Form1)实际上也是判断Form1=nil
      

  6.   

    你们的方法都会发生:
    Raised Exception Class EAcess Violation
      

  7.   

    procedure TForm1.Frm2ShowOnClick(Sender:TObject);
    var
     Frm:TForm2
    begin
      if frm=nil then
         Frm:=TFrom2.Create(Selft);
      Frm.Show();
    end;
      

  8.   

    if not Assigned(Form2) then
       Form2:=TForm2.Create(self);
      

  9.   

    if frm=nil then
         无法判断其是空的,它始终不为空
      

  10.   

    if not Assigned(Frm2) then
      TForm1.Create(Tfrm2,frm2);
    Frm2.ShowModal;
    Frm2.free;
      

  11.   

    全对,结贴             if not assigned(form2) then     于同 if form2<>nil then
      

  12.   

    var
     Frm:TForm2
    begin
    if Frm is Tform then
    Frm.show
    else
    begin
      Frm:=TFrom2.Create(Selft);
      Frm.Show;
    end;
    end;
      

  13.   

    procedure TForm1.Frm2ShowOnClick(Sender:TObject);
    var
     Frm:TForm2
    begin
      if Application.findcomponent('frm')=nil then
        Frm:=TFrom2.Create(Self);
      Frm.Show();
    end;
      

  14.   

    以上的全错了!!!!!unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, SUIButton, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    Var
      Frm2:TForm2;
    begin
       if(Frm2 = nil) then
        begin
          Frm2:=TForm2.Create(Self);
          Frm2.Show;
        end
       else
        begin
          Frm2.Show;
        end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      Frm22:TForm2;
    begin
       if Frm22 is TForm then
        begin
         Frm22.Show;
        end
       else
        begin
         Frm22:=TForm2.Create(Self);
         Frm22.Show;
        end;
    end;procedure TForm1.Button3Click(Sender: TObject);
    var
      Frm23:TForm2;
    begin
       if Application.FindComponent('Frm23')=nil then
        Frm23:=TForm2.Create(Self);   Frm23.Show;
    end;procedure TForm1.Button4Click(Sender: TObject);
    var
      Frm24 :TForm2;
    begin
       if not Assigned(Frm24) then
        begin
           Frm24:=TForm2.Create(Self);
           Frm24.Show;
        end
       else
        begin
          Frm24.Show;
        end;
    end;end.
      

  15.   

    我用DElphi 做的实验的  除了Application.FindComponent('Frm23')=nil 能Show外其它的都不能 ShowApplication.FindComponent('Frm23')=nil 永远等于空!!所以就会显示很多个
      

  16.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Frm23:TForm2;
    begin
      if Application.FindComponent('Frm23') = nil then
      begin
        Frm23:=TForm2.Create(Application);
        Frm23.Name := 'Frm23';
        Frm23.Show;
      end;
    end;
      

  17.   

    procedure TForm1.Button3Click(Sender: TObject);
    var
      Frm23:TForm2; // 注意:这个是局部变量,请注意它的有效范围!!!
    begin
       if Application.FindComponent('Frm23')=nil then
        Frm23:=TForm2.Create(Self);   Frm23.Show;
    end;
      

  18.   

    // 注意:这个是局部变量,请注意它的有效范围!!!
     因为它CREATE 建立的 就还堆内存中,下次再来的时候就不用再CREATE了
      

  19.   

    这是一个判断mdichild窗体是否存在的函数,不知道是否对你有启发。
    function TMainForm.checkOpenmdiwin(Sender: TFormClass):boolean;
    //用于打开Mdi窗口前是否有此窗口,false则载系统忙信息窗口
    Var
      iii:Integer;
    begin
    result:=false;
        For iii:=0 to MainForm.MDIChildCount-1 Do Begin
            if MainForm.MDIChildren[iii].ClassType=Sender Then Begin
               result:=true;
               Exit;
            End;
        End;
    end;
      

  20.   

    我以前问过一个类似的问题,有人给出了很好的解决方法,一直在用
    给你看看吧
    http://community.csdn.net/Expert/topic/3542/3542420.xml?temp=.6751673
      

  21.   

    看你这么执着,帮你写一下吧触发打开窗口事件后:一般是这种设计思路
    IF 窗口被创建? THEN 显示到最前台
    ELSE 创建窗口
    ------------------------------------
    因为它CREATE 建立的 就还堆内存中,下次再来的时候就不用再CREATE了
    ------------------------------------
    说明你已经知道窗口在关闭时并没有被销毁!
    这会导致一个什么问题呢???
    上面那么多解决窗口重复打开的方法,其实本质上都是为了解决下面这个问题?
    很多窗口在被重新打开的时候,根本就不能用SHOW方法
    why?
    你刚发了一封EMAIL,现在还想再写一封,你新建EMAIL发现里面里显示
    都是上一封邮件内容时,你有何感觉?
    所以窗体一旦被关闭,就应该立即销毁,治标得治本
    好好看看吧
      

  22.   

    因为它CREATE 建立的 就还堆内存中,下次再来的时候就不用再CREATE了 ??? 
    窗体建立之后,是有一个对象存在了,但是函数内部局部变量能保存对象地址么??
      

  23.   

    调用 
    Frm.Free; 
    Frm := nil;
    表面上窗体被释放掉了,但仍然能调用窗体中的某些函数(BCB也一样),因此内存并没有释放。
      

  24.   

    全局变量:
    FormIsCreated:Boolean;procedure TForm1.Frm2ShowOnClick(Sender:TObject);
    var
     Frm:TForm2
    begin
      Frm:=TFrom2.Create(Selft);
      Frm.Show();
      FormIsCreated:=True;
    end;procedure TForm2.OnShow(Sender:TObject);
    begin
      FormIsCreated:=False;
    end;哈哈,够简单了吧?
      

  25.   

    如果要以其是否为NIL来判断的话,就要在窗体关闭事件中将其赋为nil.
      

  26.   

    通过
    function FormCreated(fForm: TFrom):boolean;
    Var
      i: integer;
    Begin
      Result := False;
      Try
        i := fForm.Height;
        Result := True;
      Exception
        Result := False;
      End;
    End;
      

  27.   

    function Tform1.ExistForm(FormName: string): boolean;
    var I: integer;
    begin //判断窗体是否已经存在。入口参数 FormName 为待检测窗体名称。
      Result := false; //结果先设为真。
      with form1 do
        for I := 0 to MDIChildCount - 1 do //用循环判断子窗体是否存在。
          if pos(Uppercase(FormName), Uppercase(MDIChildren[I].Name)) > 0 then
          begin
            Result := True; //结果返回假。
            Break;
          end;
    end;
    ........
    if  not ExistForm(form2) then 
    begin 
      form2:=tform2.Create(self);  
    end ;
      form2.show; 
    end;...................
      

  28.   

    你们有没有试下看看啊!!你们的思维多对的 
    zdee(好好学习,天天向上) 
    zxw111111(秋风) 
    但是第一次 没有建立起来是不可以访问的! victor_yang(victoryang) :
    全局变量:FormIsCreated:Boolean; 行的通 但不实用 我有12个Frm 其不是和累
      

  29.   

    一、ShowModal
    二、FindWindow()
      

  30.   

    to gzlcd:
    什么叫内存没释放?怎么可能没释放?难道释放内存非要再填满$0000 或$ffff ?
    出于效率考虑,一般释放内存时仅仅将被释放段标识成未用,并不再进行进一步的清零销毁
    但 xxx.Free后,xxx的内存已经释放了to ZengMuAnSha:
    你在每个按钮中放一个局部变量是不对的,函数结束局部变量就没了,
    你有好多个窗口,每个窗口都是一个单独的unit吧?每个unit中都有一个Form的全局变量吧?
    Delphi自动加的,打开自己好好看看,不用你自己加什么"FormIsCreate"
    var
      Form2: TForm2;主窗口中:
    unit Unit1;uses Unit2, Unit3, ...;//相信你已经加了procedure TForm1.Button1Click(Sender: TObject);
    begin
      if(Form2 = nil) then Form2 := TForm2.Create(Self);//根据全局变量判断窗口是否已建立
      Form2.Show;
    end;Unit2中:var
      Form2: TForm2;procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
      Form2 := nil;     //如果被关闭,设为空,防止重复建立
    end;
      

  31.   

    如果是防止重复创建同一个类的窗口,zdee(好好学习,天天向上)的方法可以借鉴,从类型判断;
    如果是防止同一个句柄重复创建,参考OverlordBlind(OverlordBlind)的方法处理。
    搂主的意思应该是第一个。