窗体的类名是变量,怎么创建?(88分)

  • 主题发起人 主题发起人 希望会更好
  • 开始时间 开始时间

希望会更好

Unregistered / Unconfirmed
GUEST, unregistred user!
窗体的类名和窗体名都在数据库中存的。
现在我要从数据库中读出来然后创建这个窗体,如何做?
其实相当于把窗体的类名保存到一个字符串变量里,然后用这个变量创建窗体
 
修改窗体的Name属性
 
function CreatForm(FormClass:string;FormName:stgring;):boolean;
begin
if FormClass = 'TForm1' then
begin
With TForm1.create(self) do
begin
Name:= FormName;
Parent:=self;
......
end;
end
else if FormClass = 'TForm2' then
begin
With TForm2.create(self) do
begin
Name:= FormName;
Parent:=self;
......
end;
end
else
begin
showmessage('无效的类型');
result:=false;
end;
result;=true;
end
凑合着看吧,就是这个意思
 
顶顶楼上.不过觉得用Cast来实现也许会更好点..
 
TO:weichao9999
不行啊, 能给我做一个简单的例子吗?
在一个窗体中,一个按钮事件: 动态创建一个窗体并显示,这个创建窗体的类名为变量。谢谢!
 
to 希望会更好:把你的代码贴出来
to fghyxxe:case中的条件必须是有序类型
 
如果类已经注册(RegisterClass),用GETCLASS就可以了.

变量名的话好象不太行,不过这个不影响,叫什么都可以啊,只是个处理技巧问题...

如:
var
formClass: TPersistentClass;
fm: TForm;
begin
formClass := GetClass('TForm1');
if formClass <> nil then
begin
fm := TFormClass(formClass).Create(Application);
fm.Show;
end;
end;

当然要记得在FORM1的初始化部分注册TFORM1类
initialization
RegisterClass(TForm1);
--------------------------------------------
如果想用易理解的名字也可以如:
initialization
RegisterClassAlias(TForm1, 'ABC MIS Sales Order');
 
类名不要用string保存用WORD应该够了
你可定义连串的常量
const
C_CLASSNAME = 100;
//相关类名
C_TFormMain1 = C_CLASSNAME + 1;
C_TFormMain2 = C_CLASSNAME + 1;
C_TFormMainN = C_CLASSNAME + N;
这样保存
在读取到这个数值

Case IntClassName of
C_TFormMain1 : With TFormMain1.create(self) do
begin
Name:= FormName;
.......
end;
C_TFormMain2 :;
C_TFormMainN :;
end;
 
我要的效果是用一段话接能循环创建所有form
比如:
Function CreateFrm();
var
MyForm:=TForm;
begin
//query是Tadoquery;里面取的是提前存储的窗体类
Query.first;
while not query.eof do
begin
MyForm:=TForm(TComponentClass(FindCalss(query.fieldbyname('FormClass')))).create(application);
MyForm.Align:=alClient;
MyForm.parent:=Panel1;
MyForm.show;
query.next;
end;
end;
这段代码其实已经可以实现了创建窗体的功能,但是由于窗体是被创建到了panel上。出现了问题:假如:form1创建了没有关闭,再创建form2覆盖了form1,这个时候如果我再创建form1的时候则会再panel上出现了2个form1,连续几次会出现更多。。如何才能在动态创建一个窗体的时候先判断它是否存在。当然如果是静态的就简单多了,但是如果这样动态创建的话.....
 
谢谢各位了!
 
后退
顶部