procedure Terp.Button1Click(Sender: TObject);
var a:string;
begin
a:='xyjlr';
(If Application.findcomponent('xyjlr')=nil Then
Application.CreateForm(Txyjlr, xyjlr);
xyjlr.show;)
end;
以上小括号中的代码,如何将xyjlr换成变量a,该如何写?

解决方案 »

  1.   

    a 换成常量,或+a+ 或a
      

  2.   


    procedure Terp.Button1Click(Sender: TObject);
    var a:string;
    begin
    a:='xyjlr';
    If Application.findcomponent(a)=nil Then
    Application.CreateForm(Txyjlr, xyjlr);
    xyjlr.show;
    end;
      

  3.   

    把上面代码中所有的xyjlr都换成变量a该如何写?
      

  4.   


    procedure Terp.Button1Click(Sender: TObject);
    var 
      a:string;
      xyjlr:Txyjlr;
    begin
    a:='xyjlr';
    If Application.findcomponent(a)=nil Then
    Application.CreateForm(Txyjlr, xyjlr);
    xyjlr.parent:=self;
    xyjlr.show;
    end;全变一个sting类型的a,我变不了啊,水平有限。
      

  5.   

    procedure Terp.Button1Click(Sender: TObject);
    var a:string;
    begin
    a:='xyjlr';
    If Application.findcomponent(a)=nil Then
    Application.CreateForm(Txyjlr, Txyjlr(a));
    Txyjlr(a).show;
    end;?
      

  6.   

    不知道想要的是不是下面这句,
    Form1:=CreateInstanceByClassname('TForm1')
      

  7.   

    我的意思是说点击一个按钮,根据录入的值(也就是form名),点击按钮调用不同的form,所以xyjlr一定要换成一个变量,不一定非是string也可以是其它的。也就是说
    If Application.findcomponent('xyjlr')=nil Then
    Application.CreateForm(Txyjlr, xyjlr);
    xyjlr.show;
    中的四个xyjlr都要换成另外的变量,该如何实现?
      

  8.   

    动态创建动态指定的form类的form啊:
    procedure Terp.Button1Click(Sender: TObject);
    var
      a:string;
      tf:Tclass;
      f:Tform;
    begin
      a:='xyjlr';
      If Application.findcomponent(a)=nil Then
      begin
        tf:=findclass('T'+a);
        Application.CreateForm(Tf, f);
        f.show;
      end;
    end;
      

  9.   

    http://hi.baidu.com/hirooney/blog/item/3a45603128f486ad5edf0e9f.html
      

  10.   

     将a写为全局变量,
     在formclose的时候释放。
      
      procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Txyjlr(a).free;
    end;
      
      

  11.   

    执行时在Application.CreateForm(Tf, f);
    中提示错误incompatible types:'TComponentClass' and 'TClass'
      

  12.   


    类型都不一样当然会有错 你可以强制转换 TComponentClass(Tf)但是之前tf:=findclass('T'+a) 如果 'T'+a 这个类不存在的话 也是会报错
      

  13.   


    就是Application.CreateForm(Tf, f);的tf 换成TComponentClass(Tf) 别的地方不动 
    能保证编译的时候不报错
    但是执行的时候 到 tf:=findclass('T'+a) 如果 'T'+a 这个类不存在的话 也是会报错 你要调用的窗体之前是不是已经创建 是在同一个窗体内创建的呢 还是在别的窗体 对你的需求还是不大明白 能不能详细的说明一下
      

  14.   

    不知道是不是这样的procedure TForm1.Button1Click(Sender: TObject);
    var
      a : string;
      fClass : TComponentClass;
      f : TForm;
    begin
      a := 'xyjlr';
      if Application.FindComponent(a) = nil then
      begin
        fClass := TComponentClass( FindClass('T' + a));
        Application.CreateForm(fClass, f);
        f.Name := a;
        f.Show;
      end;
    end;
      

  15.   

    楼主你是卡在Application.CreateForm(Txyjlr, xyjlr);xyjlr.show
    这两句中的xyjlr不能用变量a来替换了是吧?你就自己定义一个CreateForm的过程不就解决了?定义一些全局变量,如
    var xyjlr:Txyjlr;
        grot:Tgrot;
    Produce P_CreateForm(FormName:String);procedure Tfrm_Main.P_CreateForm(FormName);
    begin
      if FormName='grot' then
         begin
           Application.CreateForm(Tgrot,grot);
           grot.Show;
         end;
      if FormName='xyjlr' then
         begin
           Application.CreateForm(Txyjlr,xyjlr);
           xyjlr.Show;
         end; 
    end;你的调用
    procedure Terp.Button1Click(Sender: TObject);
    var a:string;
    begin
    a:='xyjlr';
    P_CreateForm(a)
    end;
      

  16.   

    原来你是这个意思啊,我还当你非要强塞字符串呢。那我引用Versus1008的。
    procedure Terp.Button1Click(Sender: TObject);
    var a:string;
    begin
    a:='xyjlr';
    If Application.findcomponent(a)=nil Then
    Application.CreateForm(Txyjlr, Txyjlr(a));
    Txyjlr(a).parent:=self;    //不一定是self,你要在什么母容器上显示就写那个容器的name
    Txyjlr(a).show;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Txyjlr(a).free;  //不一定在窗口关闭的时候才释放,只是一定要释放,否则报错。
    end;
      

  17.   

    a:='xyjlr';
    Txyjlr(a)
    这样可以吗?要负责哦
      

  18.   

    这个
    呵呵,不知道他的Txyjlr是什么,不好说。
    试试嘛。
      

  19.   

    首先你要注册这个类RegisterClass,之后用FindClass找到这个类,再建创
      

  20.   

    能编译通过,但提示Class Txyjlr nof found
      

  21.   

    编译的时候能通过,但执行的时候提示Class Txyjlr nof found,我的意思是在edit中输入一个表单名,点击按钮,能够调出输入的这个表单,该怎样写?
      

  22.   

    我的方法只是抛砖引玉,实用肯定是要看情况的,至少是一个解决你问题的方向,你觉得不适合你的情况就改一下呀,比如把
    ('xylz',xylz,Txylz)这样的数据放在一个数组中,或者放在HASH表中,使用是根据字符的窗体名字找到窗体变量和窗体的类,这样不就可以动态生成窗体了吗?以后有变动就维护下那个数组或者HASH表不就行了吗?
    不知道你明白我意思没有
      

  23.   

    实现了你也会觉得烦琐,因为必然会有个赋值过程;
    还是帮你改13楼的吧,他那写法漏了一个关键:没有注册类;还有一个错误:Application.CreateForm(Tf, f);改成Application.CreateForm(TComponentClass(Tf), f);在你主窗体的Create事件中注册你要动态生成的那些窗体的类
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       RegisterClass(TForm2);//这里是没办法用变量来代替了,你有100个就要注册100个
       RegisterClass(TForm3);
       。
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      a:string;
      tf:Tclass;
      f:Tform;
    begin
      a:='Form2';
      If Application.findcomponent(a)=nil Then
      begin
        tf:=findclass('T'+a);
        Application.CreateForm(TComponentClass(Tf), f);
        f.ShowModal;
      end;
    end;
      

  24.   

    楼主是严重吃现成的,这个习惯不好
    分析下为什么下次没出来?因为
    If Application.findcomponent(a)=nil Then
    不满足了,为什么不满足?因为
    f.ShowModal;后没有执行f.free;
      

  25.   

    原来是没有注册窗体的类
    RegisterClass(TForm3);
    学到了 
    创建窗体 用完后要释放掉 我也总爱犯这样的错误
    Application.CreateForm(TComponentClass(Tf), f);
    try
      f.ShowModal;
    finally
      f.Free;
    end;