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

人鱼传说 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出来.......
...全文
192 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
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 程序不可能是现在的大小

5,928

社区成员

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

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