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);就是一个动态创建窗体的例子。