如何用字符串动态创建窗体

人鱼传说 2009-10-16 09:01:58
如何用字符串动态创建窗体


var
myform:tformclass;
aform:tform;
begin
myform:=TFormClass(TForm(Application.FindComponent('Form_Apply_Money_To_OA')));
aform:=TForm(myform);
aform:=myform.Create(nil);
try
aform.ShowModal;
finally
aform.Free;
end;


以上代码总是报错.....

我想要实现的效果是用一个字符串动态地创建一个窗体,并把它showmodal出来.......
...全文
137 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
sunnauq 2009-10-16
application.FindComponent(‘Form_Apply_Money_To_OA')
必须Form_Apply_Money_To_OA这个窗体已经创建了啊,直接用就是了

myform:=TForm(Application.FindComponent('Form_Apply_Money_To_OA'));

如果真的字符创创建窗体的话,我觉得还是1楼sonicer说的对啊,registerclass, findclass
  • 打赏
  • 举报
回复
sunnauq 2009-10-16
var
frmclass: TFormClass;
frm: TForm;
begin
frmclass := TFormClass(application.FindComponent('Form1').ClassType);
frm := frmclass.Create(nil);
frm.ShowModal;
frm.Free;
  • 打赏
  • 举报
回复
林石公 2009-10-16
呵呵,我就是这样实现的,毕竟delphi也有自己的实际情况
实际上,windows也是要注册类的,只不过大部分情况下,我们看不到这些代码,架构已经帮我们实现了,
你想根据字串创建对象,当然要多作些东西了
把你可能动态创建的类在类声明的单元里的initialization部分里全部注册一下就可以了
  • 打赏
  • 举报
回复
人鱼传说 2009-10-16
楼上两位朋友说得对.....我在网上也找了一下资料,需要registerclass, findclass,但我觉得既然
registerclass了,那还叫什么动态创建......

请问到底该怎么做呢?
  • 打赏
  • 举报
回复
newfang 2009-10-16
FindComponent 能找到,说明该窗体的实例存在着,还要创建什么?
  • 打赏
  • 举报
回复
wooden954 2009-10-16
我认为楼主的Application.FindComponent用法是错误的,因为FindComponent只能找到已实例化的对象,待创建的动态对象是找不到的,所以报错。
如果要实现你的功能,我觉得可以这样:
type
FormNameRec=record
Name:String;
ClassName:tformclass;
end;
然后再用此结构体记录系统中的全部类名称与其名,再创建时在结构体数组中搜索后返回ClassName,然后再创建窗体对象
  • 打赏
  • 举报
回复
林石公 2009-10-16
请参照registerclass, findclass
  • 打赏
  • 举报
回复
Seamour 2009-10-16
没出现引用某个类的代码的话,链接器是不会把那个类的 rtti 和方法之类链接到程序里的,不然你看到的 vcl 程序不可能是现在的大小
  • 打赏
  • 举报
回复
发帖
Delphi

5124

社区成员

Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
帖子事件
创建了帖子
2009-10-16 09:01
社区公告
暂无公告