调用FindComonent('Form1'),它返回一个TCOMPONENT

解决方案 »

  1.   

    我答了啊
    var  
      MyForm: TForm;
      ss:string
    begin
      ss:='Form1';
      MyForm := (Application.FindComponent(ss) as TForm);
      MyForm.ShowModal;
    end;
      

  2.   

    我答了啊var  
      MyForm: TForm;
      ss:string
    begin
      ss:='Form1';
      MyForm := (Application.FindComponent(ss) as TForm);
      MyForm.ShowModal;
    end;
      

  3.   

    var  
      MyForm: TForm;
      ss:string
    begin
      ss:='Form1';
      MyForm := (Application.FindComponent(ss) as TForm);
      MyForm.ShowModal;
    end;
      

  4.   

    var  
      MyForm: TForm;
      ss:string
    begin
      ss:='Form1';
      MyForm := (Application.FindComponent(ss) as TForm);
      MyForm.ShowModal;
    end;
      

  5.   

    FindComponent  if SelectDirectory( '请选择存放生成文件的目录' ,'' ,StrTemp) then
        TEdit(FindComponent('Edit'+IntToStr(iTag))).Text:=StrTemp;
      

  6.   

    (FindComonent('Form1') as TForm).ShowModal;
      

  7.   

    我的.pas文件是动态调入的,不通过文件名直接调入,而是通过配置文件来打开这个.pas窗体文件的。。
      

  8.   

    你的上一贴我已答了,再答一次。csdn越走越慢,老发不出去。
      

  9.   

    如果,机器能承受的话。
    先全部创建所有的Form,并且关闭的时候不能释放,
    除非退出系统。var ss:string ;
    begin
      ss := 'Form2';
      (Application.FindComponent(ss) As TForm).Show;
    end;小何,最近一直在南京?没出去?
      

  10.   

    如果,机器能承受的话。
    先全部创建所有的Form,并且关闭的时候不能释放,
    除非退出系统。var ss:string ;
    begin
      ss := 'Form2';
      (Application.FindComponent(ss) As TForm).Show;
    end;小何,最近一直在南京?没出去?
      

  11.   

    而且工程文件中没有这个.pas,动态加载的。
      

  12.   

    如果,机器能承受的话。
    先全部创建所有的Form,并且关闭的时候不能释放,
    除非退出系统。var ss:string ;
    begin
      ss := 'Form2';
      (Application.FindComponent(ss) As TForm).Show;
    end;小何,最近一直在南京?没出去?
      

  13.   

    S:='Form1';
    TForm1(application.FindComponent(s)).caption:='test';一定要用application.FindComponent否则会出错
      

  14.   

    genphone_ru(票票) (  )这样不行的,我写的只是个外套程序,通过配置文件来确定需要加载的窗体文件。。
      

  15.   

    可以考虑abstrach factory模式
      

  16.   

    这个高分帖子到目前为止没有人能给出好的解决办法,我把问题再次描述一下:
    一个MDI的程序,子FORM都是动态通过配置文件来载入,配置文件只包括FORM的Name,
    问题是:我怎么样通过这个串,来载入这个子FORM.
    前面的方法我在没有发贴子只前早就实验过了,是不行的.因为我的FORM是动态载入的,FindComponent根本没有这个实例.如果你懂的话请高言。
    问题解决300分另外开帖子。
      

  17.   

    用TStringlist的AddObject方法,建立一个窗体名和窗体对象指针的映射链表,这样就可以通过字符串来访问相应的对象名称。
      

  18.   

    我觉得你的想法和你问问题的方式有些偏差,导致很多人答非所问。
    试试这个方法,不知是否满足你的要求。
    1、在你每个MDI子Form的单元中加以下代码
    initialization
      RegisterClasses([TYourMDIForm]);
    2、在你的一个单元中定义:
    type
      TMyFormClass = class of TForm;
    3、写一下代码:
    var
      AForm: TForm;
      AFormClass: TMyFormClass;
    begin
      AFormClass := FindClass('TYourMDIForm') as TMyFormClass;
      AForm := AFormClass.Create(Application);
      AForm.Show;
    end;不知以上想法是否符合你的要求。
      

  19.   

    stargazer(星空守望者) 的方法很好!TStringlist.AdoObject('form1',form1);//读取TForm(TStringlistObjects[Index]).Create;
      

  20.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        lst:TStringlist;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
       lst:=TStringlist.Create;end;procedure TForm1.Button1Click(Sender: TObject);
    begin
        lst.AddObject('form1',form1);
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      k:integer;
    begin
        if lst.Find('form1',k) then begin
           with (lst.Objects[k] as Tform1).Create(application) do begin
                 show;
                 ....
                 ....
                 free;
           end;
        end;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
        lst.Free;
    end;end.
      

  21.   

    正是我想知道的问题,njbudong (午夜游民) 你的设计和我一抹一样,我也不知怎样在Delphi中实现,反正原来在PB中是很简单的有人能给出满意的答案,我的这个贴子一起结!http://www.csdn.net/expert/topic/845/845631.xml?temp=.4014856
      

  22.   

    正是我想知道的问题,njbudong (午夜游民) 你的设计和我一抹一样,我也不知怎样在Delphi中实现,反正原来在PB中是很简单的有人能给出满意的答案,我的这个贴子一起结!http://www.csdn.net/expert/topic/845/845631.xml?temp=.4014856
      

  23.   

    smhpnuaa(农奴翻身感谢党),你的办法是不行的,因为将配置信息写入数据库,就是为了避免将来更改程序代码,而只需调整数据库数据,你这样写还要配置信息干嘛,还不如全部写在程序里!
      

  24.   

    我不懂楼上的意思,我只是写个demo来论证tStringlist可以实现,难道你需要我把数据库部分也写出来吗?呵呵!我想楼主应该知道吧!
      

  25.   

    说实话,我真的不知道你到底想做什么?你的工程里边的Form的名字你总应该知道吧?AnsiString TargetFormName;if(TargetFormName == "Form1")
    {
      Form1 = new  TForm1(NULL);
      Form1->Show();
    }  
    else if(....)
    {
      .......
    }
    else ....
      

  26.   

    我觉得楼主的意思好像是 通过字符串名字来创建tform类,而上面大多数的方法都是先创建所有的form,在通过字符串的名字得到已经创建的类实例。所以不合要求。不过,就我所知delphi并不能用通过普通的方法达到要求,我看能实现的话大概需要内嵌汇编代码改变编译器的运作方法了。不过BCB_FANS(四大名捕之追杀令) 的方法虽然太死了,但不失为一种没有办法的办法
      

  27.   

    smhpnuaa(农奴翻身感谢党),我并没有针对你的意思。我只是觉得你没完全明白搂主的意思,他的Form是动态载入的,也就是说程序代码应该是固定的,只是配置文件改动,窗口打开的模式就会跟着变,而无需改动代码!
      

  28.   

    下面是我用ADO编程时编的关于窗体的代码,希望对你有点帮助
    procedure TfrmMain.miQualityCertificatesClick(Sender: TObject);
    var
      frmBeforePaying: TfrmBeforePaying;
    begin
      dmCommon.ChanZhiShu :=true;
      frmBeforePaying:= TfrmBeforePaying.Create(Application);
      if frmBeforePaying.ShowModal() =  mrCancel  then
          exit;
      if not Assigned(frmCertificates) then
        frmCertificates:=TfrmCertificates.Create(Application);
       frmCertificates.Show;
    end;
      

  29.   

    我们也在作相同的事情。但是是将独立的Form编译成Dll,由主程序根据数据库的配置调用不同的Dll。由Dll负责创建对应的窗体。你想动态调用Form,必须事先将Form文件编译成两进制,负责你的程序怎么知道你Form的信息?
      

  30.   

    这是我的一个想法,不知道合不合贴主的要求:
     1.你把每一个要使用的子form都做成一个dll文件,在dll文件中定义一个已  知函数,用这个函数来完成创建form的工作。
     2.在主程序中用loadlibrary引入要使用form所在的动态库,然后调用dll文  件中已知的函数完成创建工作。
      

  31.   

    我也觉得还是用dll动态调入比较合适,不过考虑到具体的程序,恐怕也很复杂。
      

  32.   

    OpenSheetWithParm(child, sle_state,"w_child_1",MDI_User,4,Layered!)
    哎,在PB中一句话就搞定的,在Delphi中这么难?
      

  33.   

    如果你想用一个DFM文件来加载窗体,可以考虑如下代码,但是窗体上的控件类包括Form,必须事先调用RegisterClass来注册.var
      FileStream:TFileStream;
      Form: TForm;
    begin
      FileStream := TFileStream.Create('Form1.dfm',fmOpenRead);
      try
        Form := FileStream.ReadComponent(nil);
        if Assigned(Form) then
          Form.Show;
      finally
        FileStream.Free;
      end;
    end;
      

  34.   

    完全可以采用指针:
    type
      PForm =^TForm;然后定义一个数组什么的,在CreateForm时候建立对应表
      

  35.   

    对主要回答朋友的答复:
     
    to chechy(我爱洁洁)
    你的办法对已经装入.dpr的.Pas可以,我的问题是.Pas是动态加载的。你的方法不错的,向你学习。
    smhpnuaa(农奴翻身感谢党) :你的方法其实和chechy(我爱洁洁)的思路上一样,感谢你参与。
    to arg(雨隼) :你基本理解了我的意思。
    to BCB_FANS(四大名捕之追杀令) :难道我说的还不清楚吗?to arg(雨隼) 其实已经明白了。谢谢你的思路。
    to SQL5560(最后一朵蝴蝶兰) :谢谢你提供的帮助,不过不是我想要的。
    to  huazhb(), yansea(思宏) :采用dll肯定是不行的,因为.pas文件太多(19个子系统 320多个 窗体文件)
    to niu_zai(牛仔) :一种新的办法,可以参考。
    to 9527(?????) :也不错。。
      

  36.   

    这个在PB里简直是易如反掌,OpenSheetWithParm()
    怎么Delphi……
      

  37.   

    这里有一个相关的帖子http://www.csdn.net/expert/topic/813/813060.xml?temp=.114422-------------------有一点疑问,请先解释清楚,免得做无用功。那320个窗体文件是通过.DFM格式文件来单独发放的还是在编译时就已经连接到底EXE文件中?
      

  38.   

    用流进行串行化的办法,上面的方法是错的,要读资源文件,不应该用ReadComponent接口。dfm和一般永久化的对象存储格式是不同的(不信你run一下上面的代码),但如果一定用上面的方法,可以用WriteComponent来写你要存储的窗口。不过如此也会出问题,因为用ReadComponent(nil),它会先创建一个窗体实例,但在处理未reference类时,它会认为有相同名字的控件,但可以重载TWincontrol的一个方法,我一下想不起了,让他不处理控件。用资源文件的读写应该可以处理dfm的读取。
    其实,我认为,用dll不错,如果是dll很多,你可以做成一个大dll,或安子系统来分割,都提供一个createform接口,而传人的参数就是窗体的名字,让dll为你匹配合适的东西。
    在pb中你讲的东西之所以比较容易实现,以为他是脚本语言(从前),脚本本来就是它的范本。
    其实上面的永久化的方法,并不适用于你的问题,因为他会保持对象的发布属性的运行期值。你要的是一个生成窗体扥恩管理,而不是记住当时的状态。
    大系统的管理配置和省级一般都是通过dll方式。
    你想谈的问题如果升级,具体一点比较好谈。