关于ShowModal(100)

Discussion in '用户界面' started by 墨剑, Aug 4, 2009.

  1. 墨剑

    墨剑 Member

    Apr 1, 2015
    在一个工程中,我有若干个Form,每个都是从同一个空白的父窗口继承下来的。 现在我不想运行时把所有窗口都创建,只想在使用时在创建。 但当我用Showmodal时,窗口变量还是空的。 于是我想在公用的父窗口中编写一个Showmodal函数,这个函数会先检测这个窗口是否=nil,如果是nil,则创建一个实例,接着才调用Showmodal来显示。 这个函数该如何编写呢? 试了好多代码都不行。
     
  2. de

    de410 Member

    Apr 1, 2015
    if not assigned(form2) then
    begin
    form2:=tform2.Create(nil);
    form2.showmadal;
    end;
    这样不可以吗?
     
  3. xn

    xnnfan126 Member

    Apr 1, 2015
    在二楼的基础上补充:form2.free;form2 :=nil;
     
  4. xu

    xuxiaohan Member

    Apr 1, 2015
    不是很明白你的意思,是不是只是实现单例?
     
  5. 草原骏马

    草原骏马 Member

    Apr 1, 2015
    if form2 <> nil then
    FreeAndNil(form2);form2 := TForm2.Create(nil);form2.showmodal();FreeAndNil(form2)
     
  6. li

    liuls Member

    Apr 1, 2015
    作为模态窗口, 还是用完就释放的好.with TForm2.Create(nil)do
    try ShowModal;finally Free;
    end;
     
  7. 墨剑

    墨剑 Member

    Apr 1, 2015
    如果只是单个窗口,直接写代码就行了。问题是现在是几十个窗口,我的意思是如何在他们的共同的一个父类里面只写一段代码就能实现?
     
  8. 墨剑

    墨剑 Member

    Apr 1, 2015
    简单点,比如在这样一个函数中: procedure ShowMe(fm:TForm) begin
    ??? end;
    我想调用form1.showmodal,则这样写: ShowMe(form1) 那问号处该如何写? 因为有可能fm还没有创建。
     
  9. 薛磊磊

    薛磊磊 Member

    Apr 1, 2015
    不知道有没有理解对在父窗的public里增加class procedure ShowFrm(fm:TForm);
    begin
    fm:=TForm.Create(Application);
    try fm.showmodal;
    finallly fm.free;
    end;
    end;
     
  10. 墨剑

    墨剑 Member

    Apr 1, 2015
    这样显然不行。fm:=TForm.Create(Application);只能建立一个空白的窗口(TForm),而建立不了form1窗口(TForm1)
     
  11. 薛磊磊

    薛磊磊 Member

    Apr 1, 2015
    这里的Tform用父窗的啊 TParentForm 本身就在父窗里创建的
     
  12. 薛磊磊

    薛磊磊 Member

    Apr 1, 2015
    比如Tform2是父窗则在别的窗体里调TForm2.ShowFrm(fm);TForm2: public里增加class procedure ShowFrm(fm:TForm);
    fm:=TForm2.Create(Application);
    try fm.showmodal;
    finallly fm.free;
    end;
     
  13. 墨剑

    墨剑 Member

    Apr 1, 2015
    fm:=TForm2.Create(Application);
    创建的依然是Form2,而不是子窗口
     
  14. 幼虫2004

    幼虫2004 Member

    Apr 1, 2015
    看来大家都跑题了,人家问的是MDI窗口。
     
  15. xi

    xiaojun5556 Member

    Apr 1, 2015
    procedure iFormmodal(InstanceClass: TComponentClass;
    var Reference);var Instance: TComponent;
    begin
    Instance := TComponent(InstanceClass.NewInstance);
    TComponent(Reference) := Instance;
    try Instance.Create(nil);
    TForm(Instance).ShowModal ;
    TForm(Instance).BringToFront;
    finally TForm(Instance).Free;
    TForm(Instance) := nil;
    end;
    end;
    调用iFormmodal(Tform2,form2);
    iFormmodal(Tform3,form3);
     
  16. 墨剑

    墨剑 Member

    Apr 1, 2015
    这个不行,我传递的参数只能是form2,没有Tform2. 如果有Tform2,那这个就不是问题了。
     
  17. ne

    neugls Member

    Apr 1, 2015
    没有看明白楼主的意思!
     
  18. li

    lizhenhe Member

    Apr 1, 2015
    1、在工程选项中将相应窗体设为不自动加载;2、打开窗体(FrmSample)的例子如下procedure TForm1.Button1Click(Sender: TObject)begin
    if not Assigned(FrmSample) then
    FrmSample := TFrmSample.Create(Application);
    FrmSample.ShowModal;
    end;
    3、在FrmSample的OnClose事件中加如下代码进行释放procedure TFrmSample.FormClose(Sender: TObject;
    var Action: TCloseAction);
    begin
    Action := caFree;
    FrmSample := nil;
    end;
     
  19. 墨剑

    墨剑 Member

    Apr 1, 2015
    还是没有明白我的意思。FrmSample := TFrmSample.Create(Application);这个语句的最大问题是,我只知道FrmSample,而不知道TFrmSample
     
  20. 墨剑

    墨剑 Member

    Apr 1, 2015
    就比如说,如果让你修改form的 showmodal方法,让这个方法实现先检查窗口是否为空,如果不为空则先建立,接着再显示窗口。 你怎么写?