如何根据类名动态创建该类的实例(100分)

  • 主题发起人 主题发起人 calmness
  • 开始时间 开始时间
C

calmness

Unregistered / Unconfirmed
GUEST, unregistred user!
由于我刚接触Delphi对Object Pascal不熟,不知Delphi中有没有象Java反射包这样的函数,即已知类的名称比如TTestForm,这个名称是已字符串形式出现的,比如是从数据库中用select语句得到,并保存的FormName变量中,即FormName='TTestForm',如何通过这个信息来创建窗口的实例,并显示窗口,而不是用一大堆if..else..实现,如
if FormName = 'TTestForm' then
TestForm = TTestForm.Create(Self);
 
这么多高手大家看看啊,每人能回答吗?
 
是不是Pascal没有这种功能啊?
 
我以前也在想象Edit1,Edit2,Edit3之类能不能通过Edit+IntToStr(i)之类就可以实现
没有找到解决的办法,只好在Edit中的Tag编号,通过编号不同寻找是哪个Edit
我也想知道有没有这样的方法
 
看看FindComponent的帮助
 
Delphi中的TForm不可以动态创建,但其他置入Form容器的VCL组件则可以动态创建。
 
OP不是动态语言,不能像Java那样用字符串来指定类。
不过DELPHI提供了个变通的办法,对于普通的VCL,,可以用字符串作为对象名称来用,像下面这个样子:
类名.create(self).name:=字符串
//这是创建对象,并指定它的名字
with 类名(FindComponent(字符串)) do .... //这是用这个对象
 
Delphi没有办法,用Factory Pattern试试吧。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=849178
 
var dd: TGetClass
 
TOcalmness:每个语言有每个语言的特点,Pascal/Object Pascal语言的一个很鲜明的特点就是非常强调类型,不同类型间的相容性很小。而它不支持通过类名称字符串来创建类实例也是由它自身这个特点所决定的,因为Pascal/Object Pascal语言的编译器要保证在编译的时候就能够检查出所有的类型引用错误,如果它支持上述操作的话,显然无法实现这个目标。比如--定义一个TForm1 类的变量Form1,然后编写这么一句程序Form1:=TForm1.Create(self);编程程序可以很容易的检查出这句语句的类型引用是正确的,因为Form1的类型是TForm1,如果该语句写成了Form1:=TForm2.Create(self);编译程序也能马上指出这种类型引用的错误。但是,如果语言特性支持通过类名称字符串来创建类实例的话,编译器就无法在编译的时候指出可能存在的类型引用错误了。事实上,就算我们想自己写一个通过类名称字符串创建类实例的函数,从现有的Pascal/Object Pascal语言语法来说,也是不允许的。打个比方,我定义了这么一个函数function CreateInstanceByClassname(Classname:string):TObject;不管它里面是怎么实现的先吧,现在我要用它来创建一个实际的类的对象,比如有var Form1:TForm1;这么一个变量,编写对象实例创建语句如下:Form1:=CreateInstanceByClassname('TForm1');在编译的时候肯定通不过,因为TForm1类型跟TObject类型不匹配。

TObjaman:
Delphi 的中的Form当然可以动态创建,在一个程序中的窗体很多的时候,为了减少程序的启动时间,我们经常会把除了主窗体之外的其它窗体都设为不自动创建,然后在程序运行过程中调用它们的时候再动态创建啊。比如:Form2:=TForm2.Create(Self);就是一个动态创建窗体的例子。
 
不能实现的原因是你没办法在运行时知道某个类的constructor入口地址与参数表(这些都是编译器在编译时就决定了的,运行时无法得知)。所以如果能在程序中保存下这些信息的话就能通过字符串创建类实例了。
也许有办法保存。。。
 
后退
顶部