疑问:通过类名创建对象??

wasay007 2003-10-20 02:26:03
请问各位:
怎样用类名动态创建对象呀?
...全文
219 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tigerhohoo 2003-10-20
  • 打赏
  • 举报
回复
TButtonClass = class of TControl;

procedure TForm1.RadioGroup1Click(Sender: TObject);
const
BUTTONS : array[0..2] of TButtonClass = (TBitBtn, TButton, TSpeedButton);
begin
CreateButton( BUTTONS[ RadioGroup1.ItemIndex]);
end;

procedure TForm1.CreateButton(ButtonClass : TButtonClass);
var
AButton : TControl;
begin
AButton := ButtonClass.Create(Self);
AButton.Parent := Self;
...
end;
wasay007 2003-10-20
  • 打赏
  • 举报
回复
类名是字符串形式的,怎么创建啊?
Linux2001 2003-10-20
  • 打赏
  • 举报
回复
你所谓的类名是什么,如果不是字符串形式那么很容易解决,如果是字符串形式,恐怕只有使用比较BT的方法了!不过仍然很Easy
superyys 2003-10-20
  • 打赏
  • 举报
回复
我贴错地方了,,,在这里有完整的
http://expert.csdn.net/Expert/TopicView3.asp?id=2374764
superyys 2003-10-20
  • 打赏
  • 举报
回复

参考
1. Herb Sutter. Exceptional C++. Addison-Wesley, Reading, MA. 1999.
侯捷.《Exceptional C++中文版》.培生教育出版集团.2000.

2. 虫虫.《天方夜谭VCL:多态》.C++ View.2001,10.

3. 侯捷.《深入浅出MFC》,2/e.松岗电脑图资料股份有限公司/华中科技大学出版社.1997/2001.

4. 虫虫.《天方夜谭VCL:开门》.C++ View.2001,9.

5. Scott Meyers. More Effective C++. Addison-Wesley, Reading, MA. 1996.
侯捷.《More Effective C++中文版》.培生教育出版集团.2000.

6. GoF. Design Patterns: Elements of Resuable Object-Oriented Software. Addison-Wesley, Reading, MA. 1995.
李英军等.《设计模式:可复用面向对象软件软件的基础》.机械工业出版社.2000.
superyys 2003-10-20
  • 打赏
  • 举报
回复
天方夜谭VCL: 生死
虫虫

生命是什么?科学和宗教都给出了不同的诠释。有句话也许说得更有意思:生命是这样一种东西,如果你把它当作一个开场或结局,那么它总是一样的;而当你把它当作一个过程,它总是不同的。其实,万事万物又何尝不是分别以生和死作为开场和结局呢?对象也不例外,不过生成以及销毁对象都需要健全的机制作保证。否则不仅对象本身遭殃,甚至会导致程序乃至整个系统崩溃。

传说中,东方的天、人、阿修罗、畜生、饿鬼、地狱六道轮回(以及由此演变出的丰都鬼城),和西方的地狱、炼狱、天堂,都有一套非常完整、严密、健全的机制,管理着时空中各种生命体。同样,一套框架也需要这么一套机制来管理记忆体中的对象,以保证正常运作。VCL自然也不例外。但虫虫这次并不准备详细分析涉及VCL对象生死的代码,相信大家对剖析涉及底层汇编都有了一定的经验。所以前面虫虫会对这方面提几句,把重点放在设计的结构和模式上,并解决一个在BBS上看到的问题。

对象生成
对象生成的方式几乎都是一样,一般流程如右图所示(VCL类的初始化是指初始化VMT和接口指针)。对象一般生存在两个地方,栈(stack)或自由存储区(free store)[1]中。由于Object Pascal只支持第二种方式,所以VCL类都在自由存储区中,表现在C++中就是必须使用new和delete分配、回收空间,速度自然会比存在于栈中的普通C++类要慢一些。

控制VCL对象生成过程的代码主要在TObject::InstanceSize、TObject:: NewInstance、TObject::InitInstance几个成员函数中。有兴趣的朋友可对照右图分析一下,源代码在 Source/Vcl/system.pas里,没有什么特别之处。我们将把重点主要放在分析动态生成(Dynamic Creation)机制上。

动态生成是一个相当实用的技术。比如上次我们提到的一个绘制图形的程序[2],具体的图形以插件的方式提供,主程序对相应的图形类一无所知,但是仍然需要 “动态”地生成这些对象。又比如Delphi/C++ Builder的IDE对象设计器,也是一个很好的例子:鼠标双击,一个对象就动态生成在设计面板,可以供我们设计之用了。C++语言本身并没有也不可能提供对动态生成的支持,不过MFC中用宏(macro)模拟就可以取得令人满意的效果[3]。

图1 对象生成流程
  • 打赏
  • 举报
回复
可以告诉你,基本上无解。
即使解决了,也是非常规途径(用RegisterClasses)。
这个问题涉及到编译器的问题了
angle097113 2003-10-20
  • 打赏
  • 举报
回复
var
from1:Tform1;
begin
form1:=Tform1.Create(self);
form1.showmodal;
end;
zhaojinghui 2003-10-20
  • 打赏
  • 举报
回复
up
pankun 2003-10-20
  • 打赏
  • 举报
回复
你这个类要从TPersistent继承才行,才有RTTI支持.
再用GetClass(类名)
wasay007 2003-10-20
  • 打赏
  • 举报
回复
大虾们,有谁知道吗

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧