function TForm1.CreateForm(FClass: string):Tform;
var
  fCls:TformClass;
begin
  fCls:=TformClass(GetClass(fClass));
  Application.CreateForm(fCls,result);
end;
procedure TForm1.Button1Click(Sender: TObject);
var str:string;
begin
str:='t'+Edit1.Text;
CreateForm(str).Show;
end;
(在每个被调用单元:
initialization
  RegisterClass(TForm2);)这段代码可以实现动态调用form,但是不能解决Form之间的变量传递问题,
比如:edit1.text := From2.edit1.text(Form2.bl);
麻烦高手解决。

解决方案 »

  1.   

    补充环境场景:
    Form1调用Form2时采用以上办法。Form2中正常创建Form3(不用动态调用)
    procedure TForm2.Button1Click(Sender: TObject);
    begin
       application.CreateForm(TForm3,Form3);
       Form3.ShowModal;
    end;procedure TForm3.Button1Click(Sender: TObject);
    begin
       edit1.Text := Form2.Edit1.Text;
    end;
      

  2.   

    edit1.Text  := (动态创建的Form.FindComponent('Edit1') As Tedtt).Text;
      

  3.   

    这点小问题,拜托别用“csdn中delphi无高手”这样的话。
      

  4.   

    这是什么话。
    如Form调用Form2:
    form2:=Tform2.create(self);
    try
      form2.showmodal;
    finally
      form2.free;
    end;
      

  5.   

    晕,你的表达太不清楚了,到底要做什么事?
    这与高不高手有什么关系啊??你把要做的事说清楚啊
    这-->“edit1.text := From2.edit1.text(Form2.bl);”  是个什么东东?语法表达有误?还是我水平太差,看不懂。  edit1.text(form2.bl)  是个什么东东??
      

  6.   

    to:
     kiboisme(还是铁棒.....针) 
    你试了吗?好使吗。Form没有FindComponent
      

  7.   

    edit1.text 中的 text 是个 属性,不是方法,后面不能跟 (....)的,你在里面加了一个“form2.bl“是什么意思啊,兄弟??
      

  8.   

    呵呵。DYS 你在线啊,麻烦你把情况说清楚一点,我来帮你一下,我不是高手,但这样的问题我基本可以解决,我想高手不会来解决这类问题的,呵呵
      

  9.   

    to :humer(humer) 
       (form2.bl)指Form2中的一个变量,也就是说:edit1.text的指可以赋予Form2中一个组件的值,也可以是一个变量的值,明白啦?
      

  10.   

    明白了,有MSN吗?我在里面和你说。
      

  11.   

    这样,我做一个死的3个from 的DEMO给你。
      

  12.   

    传参数overload create方法.针对动态调用,你可以在要创建的窗体类中定义一个属性,然后类创建后,可以传参数给property.
    希望解释的是你的问题。
      

  13.   

    如果Form2不用CreateForm函数创建而用
    application.CreateForm(TForm2,Form2);
       Form2.ShowModal;
    创建,就没有这个问题了
      

  14.   

    CreateForm(str).Show
    你这里都没有指定创建的实例名,当然你想用实例FORM2来访问的时候就回出错了
      

  15.   

    to: hthunter(核桃-我的心在下雨,雨中我和她携手漫步)
    但是你用
    for i:=0 to Screen.FormCount-1 do
       begin
          showmessage(Screen.Forms[i].Name);
       end;
    检查发现Form2已经存在
      

  16.   

    这样不是很简单么:
    procedure TForm1.CreateForm(var Form; FClass: string);
    var
      fCls: TFormClass;
    begin
      fCls := TFormClass(GetClass(fClass));
      Application.CreateForm(fCls, Form);
    end;CreateForm(Form2, 'TForm2');
      ————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  17.   

    to:lxpbuaa(桂枝香在故国晚秋) 
       Form的Name是根据数据库中动态取出的,你的CreateForm(Form2, 'TForm2')不行。   我就是不想写很多的创建窗体语句才采用通用函数实现创建窗体的。
      

  18.   

    你要是想用别的单元的变量,应该把那个变量声明在public里面呀,
      

  19.   

    to: humer(humer) 
    怎么不说了?快帮助解决呀
      

  20.   

    dongys2000(DYS): 你蠢啊,上面定义方法TForm1.CreateForm不就是你所谓的“通用函数”么?
      

  21.   

    你更蠢!你做过程序吗?
    如果有N个窗体,难道你要写N个CreateForm(Form2, 'TForm2');我的设计:从数据库中取出数据放到Treeview,当点击某个节点时,取出节点的字符串放到变量s中,
    这个s就是'TForm2'之类的字符串。这样只要在Treeview的Onclick事件中调用即可。
      

  22.   

    哦,想这样呀。那就用一个全局的list来存放各个窗体的指针吧
    每次记下窗体的index。用的时候用
    Tform(list.items[index])来引用窗体应该就可以了
      

  23.   

    楼主理解错了
    lxpbuaa确实已经实现了你的要求
    定义一个TForm实例AForm,设置参数FClass
    调用CreateForm(var Form; FClass: string)
     CreateForm(AForm,'TForm2')
    AForm.ShowModel;这本来就是一个公有函数,Form变量返回了创建好的实例
      

  24.   

    就像你的程序了这么改一下var list1:Tlist;//定义一个全局的list
    function TForm1.CreateForm(FClass: string):Tform;
    var
      fCls:TformClass;
    begin
      fCls:=TformClass(GetClass(fClass));
      Application.CreateForm(fCls,result);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var 
    str:string;
    insex:integer;
    begin
    str:='t'+Edit1.Text;
    index:=list1.add(CreateForm(str));
    Tform(list1.item[index]).show;
    //然后吧index记到一个地方和你的窗体对应起来
    ………………
    end;
    //以后访问
    edit1.Text  := (Tform(list1.item[index])..FindComponent('Edit1') As Tedtt).Text;程序没调试,不过这个想法应该可以
      

  25.   

    naughtyboy(重归起跑线) 把源码贴出来看看
      

  26.   

    to: naughtyboy(重归起跑线) 
       你那里能解决:变量传递问题?
      

  27.   

    声明一个TForm类型的变量来保存动态创建的窗体,这样的话就可以在其它单元引用:
    var
      dyForm:TForm:
    ...............
    procedure TForm1.CreateForm(var Form; FClass: string);
    var
      fCls: TFormClass;
    begin
      fCls := TFormClass(GetClass(fClass));
      Application.CreateForm(fCls, Form);
    end;
    ........................
    dyForm:=CreateForm(Form2, 'TForm2');..................
    edit1.text :=dyForm.bl;
      

  28.   

    代码就是 lxpbuaa(桂枝香在故国晚秋) 的代码CreateForm(Form2,'TForm2');
      

  29.   

    我想你在Form2.OnCreate事件写:
    form2 := self;
    应该能达到你的目的吧,不知我理解对了没有
      

  30.   

    to: hfclql(三毛) 
    完全正确