procedure CreateClass(className:string);
var
  baseObj:TBaseClass;
begin
 baseObj:=className.Create;   //这样当然无法执行
 //希望像这样:EXEC(BaseObj:=className+'.Create');
end;上面程序的TBaseClass;有多个子类,现在想不用在程序中硬提定create哪一个子类
,而是根据传过来的像className一样的字符串标志来建立子类,className正好是子类的名字。有没有好的办法??

解决方案 »

  1.   

    例如:
    with GetClass('TForm').Create do
    begin
     ShowModal();
     Free;
    end;
      

  2.   

    看你的意思应该不是动态执行程序,而是依据传入字符串动态创建对象,
    这里关键要用到类引用的概念,实际运用中有两点要注意:
    1、注册各个子类,可以统一在调用单元里注册;
    2、用类引用:Class of ..,有的类并没有类引用需要自己声明,
    然后就可以写一个函数根据传入的字符串动态创建相应的子类对象了。刚刚回答了一个类似的问题,有详细说明及代码:
    http://expert.csdn.net/Expert/topic/2328/2328176.xml?temp=2.854556E-02
      

  3.   

    initialization
      ...
      RegisterClass(TForm2);  
      RegisterClass(TForm3);
      ...
    finalization
      ...
      UnRegisterClass(TForm2);
      UnRegisterClass(TForm3);
      ...function TMainForm.FindForm(FormName,FormCaption: string): TForm;
    var
     FindForm:TForm;
     FindFormClass:TFormClass;
     classname:string;//窗体类名
    begin
     FindForm:=tform(FormName);
     classname:='T'+formname;
     FindFormClass:=TFormClass(Findclass(classname));
     if FindFormClass<>nil then
     begin
       application.Createform(FindFormClass,FindForm);
       FindForm.Caption:=FormCaption;
       result:=FindForm;
     end;
    end;  
      

  4.   

    用类引用:Class of  ??  明白了。。一会补课先。
    明天给分。
      

  5.   

    问一个RegisterClass这个东西,他注册什么?注册到哪去??有什么重要作用?
    是不是只有Tpersistent的子类才能用registerClass去注册?
      

  6.   

    procedure RegisterClass(AClass: TPersistentClass);
    var
      AClassName: string;
    begin
      with ClassList.LockList do
      try
        while IndexOf(AClass) = -1 do
        begin
          AClassName := AClass.ClassName;
          if GetClass(AClassName) <> nil then
            raise EFilerError.CreateResFmt(@SDuplicateClass, [AClassName]);
          Add(AClass);
          if AClass = TPersistent then Break;
          AClass := TPersistentClass(AClass.ClassParent);
        end;
      finally
        ClassList.UnlockList;
      end;
    end;
      

  7.   

    TPersistentClass:TPersistentClass = class of TPersistent;ClassList: TThreadList;function GetClass(const AClassName: string): TPersistentClass;
    var
      I: Integer;
    begin
      with ClassList.LockList do
      try     // ClassAliasList protected by ClassList lock
        for I := 0 to Count - 1 do
        begin
          Result := Items[I];
          if Result.ClassNameIs(AClassName) then Exit;
        end;
        I := ClassAliasList.IndexOf(AClassName);
        if I >= 0 then
        begin
          Result := TPersistentClass(ClassAliasList.Objects[I]);
          Exit;
        end;
        Result := nil;
      finally
        ClassList.UnlockList;
      end;
    end;
      

  8.   

    主  题:  [共享]在程序中执行动态生成的Delphi代码的方法 兼散分 
    作  者:  rustle (一日不过三)  
    等  级:    
    信 誉 值:  100 
    所属论坛:  Delphi 基础类 
    问题点数:  200 
    回复次数:  43 
    发表时间:  2003-5-22 12:37:22 如何在程序中执行动态生成的Delphi代码经常发现有人提这类问题,或者提问内容最后归结成这种问题前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧。这里提供三种方法,都是借助第三方的组件来实现的。1、MicroSoft Windows Script Control(http://www.microsoft.com/downloads/details.aspx?FamilyID=d7e31492-2595-49e6-8c02-1426fec693ac&DisplayLang=en)
      这是微软的东西,OCX的,我对OCX的东西一向没什么好感,:)但总算是解决问题的一个方法。
      到以上地址下载回来sct10en.exe,这是个安装程序,安装完成以后,在安装目录里有一个msscript.ocx,就是它了。
      在Delphi中Import OCX...导入安装,在窗体上添加一个TScriptControl类的实例。
      设置好它的Scriptanguage属性:VBScript,JScript...IE认识的它都认识,没有Object Pascal?不要急,好戏总是放在后头嘛...
      以VbScript为例:
        运行脚本:ScriptControl1.ExecuteStatement('msgbox("Runing....")');
        计算公式:ShowMessage(scriptcontrol1.Eval('1+1'));
      
      优点:皇家的东西,相信它,没错的
      缺点:发布程序带个OCX,只能支持微软的Script2、Dream Collection中的DCScripter(ftp://202.117.210.28/file/dream4.rar)
      安装好以后在控件面板DreamCompany里面有一个向右的黑色箭头,就是它了。
      以VbScript为例:
      运行脚本:DCScripter1.Script.Add('msgbox("Script Runing...")');
                DCScripter1.Run;
      计算公式:ShowMessage(DCScripter1.Evaluate('1+1'));  优点:VCL的,除支持微软的脚本以外,还支持Perl,Python
      缺点:还是不支持Object Pascal...(别打,就来了...)3、DelphiWebScriptII(http://prdownloads.sourceforge.net/dws/dws2src11.zip)
      这个东西好啊,功能超强,太强了,太强了,真强...
      安装完成以后,将TDelphiWebScriptII,Tdws2GUIFunctions加入窗体,引用dws2Exprs单元。
      运行脚本:
      var
        prg: TProgram;
      begin
        prg := DelphiWebScriptII1.Compile('ShowMessage(''hi'');');
        prg.Execute;
      end;
      这个东西是用稍微复杂一点,不过看看Demo吧,接下来的造化就看你自己的了。  优点:VCL的,功能超强,支持Object Pascal...
      缺点:只支持Object Pascal...以上三个各有忧缺点,大家可能比较欣赏DelphiWebScript的功能,但是我觉得如果是给用户使用的话,还是Dream Scripter比较好,毕竟VbScript等比较容易为用户所接受。其实现在很多网管等都很习惯于利用系统提供的COM对象,使用纯脚本进行编程。很方便的。
      

  9.   

    to : wdsimon(老王(路漫漫其修远兮,吾将上下而求索)) 
    我看了你说的那个粘子(http://expert.csdn.net/Expert/topic/2328/2328176.xml?temp=2.854556E-02)
    可是这个程序中TFrameClass改成TFrame不行么?这里类引用起了什么作用啊?我看了半天就是这个不明白啊。请指教,多谢了!!!!! if GetClass(str)<>nil then
      begin
        FFrame:=TFrameClass(Findclass(str)).Create(self);
        FFrame.Parent:=panel2;
        FFrame.Show;
      end;
      

  10.   

    to  zhoutian618(秦失其鹿,天下共逐,唯胜者得鹿而割之
    谢谢发粘,我要能看明白vcl原码,我就不在这里问了,能用文字说明一下么?
      

  11.   

    先注册VCL原生组件,使用RTTI技术就能通过字符串动态创建控件。
      

  12.   

    TFrameClass改成TFrame肯定不行啊,
    forgot2000(忘记2000年) 说的就是这意思。