1.我做一个主界面,左边放了3个按钮,分别为采购管理,入库管理,销售管理,右边放了一个panel,有3个form,一个为采购管理的流程图:包括:采购申请,采购计划,采购审核,其余两个form对应入库管理流程图和销售管理流程图,
2.我想要的效果是:点button1时将form1显示出来,点button2时将form2显示出来,点button3时将form3显示出来,如果form已经创建了,则不再创建,直接显示,否则创建
3.我写的创建form的代码:
定义了一个私有变量:
CForm : TForm;
procedure TfrmMain.CreateForm(myFormClass: TFormClass;
  var Reference: TForm; sname: String);
begin
  if assigned(CForm) then
    FreeAndNil(CForm);    CForm := myFormClass.Create(self);
    try
      CForm.Parent := RzPanel2;
      CForm.BorderStyle := bsnone;
      CForm.Align := alClient;
      CForm.Name  := sname;
      CForm.Show;
    except
      FreeAndNil(CForm);
    end;
end;
现在第一次创建没问题,关键是如何判断该form已经创建,我现在是因为不好判断form已经创建,所以每次都先释放

解决方案 »

  1.   

    那你最好使用findwindow来查找一下
      

  2.   

    var
      mHandle:THandle;
    begin
      mHandle:=FindWindow(nil,'caption');
      if mHandle = 0 then
      begin
        //--create form
      end
      else
      beign
        //--
      end;
    end;
      

  3.   

    兄弟,可不可改一下我这个代码,如何查找,如找到了,应该哪个show,是CForm.show,还是Reference.show,这2个好象都不对
      

  4.   


    我一般这样处理的
    首先,把子form从 auto create 中去掉。在子 form的 onclose 事件中如下写:
    action := cafree;
    self := nil;调用的时候 :  if not assigned(Formxxx) then
        application.createform(tformxxx,formxxx);
      formxxx.hostdocksite := panelxxx;
      formxxx.align := alclient;
      formxxx.show;
      ....
      

  5.   

    4楼,兄弟,为啥我每次mHandle:=FindWindow(nil,'caption')的结果都不为0,都在创建,
      

  6.   

    我另写了一个函数,窗体找到了,现在的问题是我是把3个form都是创建在同一个panel上,这样是不是不行哦,我写了如果找到就CForm.Show; 但没反应,还是显示的原来的form
      

  7.   

    试试这样:
    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);
      private
        { Private declarations }
        function createform(var Form:TForm;AFormClass: TFormClass;Caption:String=''):Boolean;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2, Unit3;{$R *.dfm}function TForm1.createform(var Form:TForm;AFormClass: TFormClass;Caption:String=''):Boolean;
    begin
      result:=False;
      if not Assigned(Form) then
      begin
        try
          begin
            Application.ProcessMessages;
            Form:=AFormClass.Create(Application);
            if Caption<>'' then
              Form.Caption:=Caption;
            Form.ShowModal;
            result:=True;
          end;
        finally
          Form.Free;
          Form:=nil;
        end;
      end
      else begin
        try
          Form.ShowModal;
          result:=true;
        except
        end;
      end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      createform(TForm(Form2),TForm2,'ddd');
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      createform(TForm(Form3),TForm3,'ddd333333');
    end;end.
      

  8.   

    我的想法可能有问题,我是想点button1是将form1创建在panel1上,点button2是将form2也创建在panel1上,点button3是将form3也创建在panel1上,如果再点button1,原来已创建form1,这时只将其在panel1显示出来,但好象实现不了,如果把它们加一个pagecontrol上应该可以
      

  9.   

    zxf_feng 
    就可以实现你的要求,你只要加上Parent然后用Show就可以
    我测试过了..
      

  10.   

    印象中这种停靠窗体到一个PANEL上好象有很多问题要处理,如:焦点、热键什么的
      

  11.   

     if not assigned(Formxxx) then 
      

  12.   

    unit WinChild;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      Tfrm_Child = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;  function CreateFrmChild:Boolean;
      function CreateFrmChildModal:Boolean;implementationvar
      frm_Child: Tfrm_Child;
    {$R *.dfm}function CreateFrmChild:Boolean;
    begin
      if Assigned(frm_Child)then
        frm_Child:=Tfrm_Child.Create(Application);  frm_Child.Show;
      Result:=True;
    end;function CreateFrmChildModal:Boolean;
    var
      form:Tfrm_Child;
    begin
      Result:=False;
      form:=Tfrm_Child.Create(Application);
      form.ShowModal;
      if mrOK=form.ShowModal then
        Result:=True;
      form.Free;
    end;end.要创建时调用 CreateFrmChild 或 CreateFrmChildModal 就可以了.要想停靠在另一个容器中用form.ManualDock(Panel1);
      

  13.   

    uses
      unit2, unit3;var
     fm2: TForm2;
     fm3: TForm3;procedure TForm1.Button1Click(Sender: TObject);
    begin
      if not Assigned(fm2) then
      begin
        fm2 := TForm2.Create(nil);
        fm2.HostDockSite := panel1;
        fm2.Align := alClient;
        fm2.Show ;
      end
      else
        fm2.Show ;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      if not Assigned(fm3) then
      begin
        fm3 := TForm3.Create(nil);
        fm3.HostDockSite := panel1;
        fm3.Align := alClient;
        fm3.Show ;
      end
      else
        fm3.Show ;
    end;//TForm2,TForm3取消自动创建。
      

  14.   

    CForm : TForm; //私有变量
    procedure TfrmMain.CreateForm(myFormClass: TFormClass; 
      var Reference: TForm; sname: String); 
    begin 
      if assigned(CForm) then   ///?????????
        CForm.show   ////????????
      else
       begin
        CForm := myFormClass.Create(RzPanel2); 
        try 
          CForm.Parent := RzPanel2;  //创建在RzPanel2上 
          CForm.BorderStyle := bsnone; 
          CForm.Align := alClient; 
          CForm.Name  := sname; 
          CForm.Show; 
        except 
          FreeAndNil(CForm); 
        end; 
      end;
    end; 
    1.这段代码在第一个button执行时没问题,因为此时CForm为nil,执行后创建一个form1,此时CForm已不为nil,按
    第一个button时,此时因为不创建同一个form,所以应该再创建,可assigned(CForm)这句判断CForm不为nil,这句应该咋改
    2.这个过程中传了一个Reference: TForm,就是form的名称,我本就是想判断传来的form是否存在,存在就show,否则创建,所以我改了一下:将这两句改为:
    if assigned(Reference) then   
        Reference.show  
    我是这样调过程的:
      Self.CreateForm(TForm5,TForm(Form5),'Form5','Form5');
    可为啥 Reference为nil
      

  15.   

    别用form 用frame 就可以轻松搞定。
    procedure TfrmMain.HideFrame(index: Integer);
    Var
      i : Integer;
    begin
      for i:=0 to FormList.Count-1 do
      Begin
        if i<>index then
        Begin
          TFrame(FormList.Objects[i]).Hide;
        End;  
      End;
    end;将frame放到一个list里面,在这里面判断。
    procedure TfrmMain.RzGroup2Items0Click(Sender: TObject);
    Var
      frmSysConfig : TfrmSysConfig;
      Index:Integer; 
    begin
      //系统配置
      Index:=FormList.IndexOf('frmSysConfig');
      If Index<0 then
      Begin
        frmSysConfig := TfrmSysConfig.Create(nil);
        frmSysConfig.Parent:=mainPanel;
        frmSysConfig.Align:=alClient;
        frmSysConfig.getSysConfigInfo;
        frmSysConfig.Show;  
        FormList.AddObject('frmSysConfig',frmSysConfig);
      End
      Else
      Begin
        //先隐藏其他
        HideFrame(index);
        TFrame(FormList.Objects[index]).Show;
      End;
    end;在这里面创建及显示