以下是简单测试用例:
procedure TForm1.Button1Click(Sender: TObject);
var
  aLabel: string;
  i: Integer;
  aPointer: pointer;
  aObj: TObject;
begin
  for i := 0 to aClassList.Count - 1 do begin
    if aClassList.Items[i].ClassName = Edit1.Text then begin
      aObj := aClassList.Items[i].Create;
      aPointer := TComponent(aObj).MethodAddress(aObj.ClassName);
      //...
      break;
    end;
  end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  aClassList := TClassList.Create;
  aClassList.Add(TLabel);
end;
上面代码实现了动态根据字符串创建相应同名类的对象,但如何能通过其VMT访问到方法呢?该问题可用于COM+三层结构中动态创建自定义的类对象,以及根据对象方法(也是字符串)调用实际的对象方法,各位大虾请多多帮忙,万分感谢!!!
不吝送分!!!!!

解决方案 »

  1.   

    希望这个对你有所帮助http://richsearch.com/displ.jsp?lid=1289838
      

  2.   

    楼主,你的代码通过测试了吗?
    要是我想创建一个TForm类型的对象,aObj := aClassList.Items[i].Create这一句没有Create方法需要的参数啊?
      

  3.   

    我想是因为TClassList中的类只能作为TClass来创建吧,我试过用AS没成功,再说类为动态加入的,写代码时并不知道是具体什么类,在运行期可以通过创建该类的派生类创建相关对象。
    关于根据字符串调用方法,我想采用“方法工厂”,不知是否有人认同
      

  4.   

    aObj := aClassList.Items[i].Create
    这一句可以创建吗?  
    如果可以, 这样调用一些公共函数: 
    if (aObj is TClass1 ) then TClass1(aObj).Func..
    else  if (aObj is TClass2 ) then TClass2(aObj).Func..
    .....如果需要动态创建的类型都知道,可能很多,也可以这么干. 
    如果都是同一父类,且只是需要调用一些继承方法 . 直接转换成父类调用
      

  5.   

    多谢大家关心该问题,尤其感谢hotzhu(非洲白脸) 
    今天下午结贴,有关注的请再次发表高见,谢谢。
      

  6.   

    如何根据类名和类方法的字符串动态创建对象和调用对象方法?--现成的,COM或CORBA