procedure Terp.Button1Click(Sender: TObject);
var a:string;
begin
a:='xyjlr';
(If Application.findcomponent('xyjlr')=nil Then
Application.CreateForm(Txyjlr, xyjlr);
xyjlr.show;)
end;
以上小括号中的代码,如何将xyjlr换成变量a,该如何写?
var a:string;
begin
a:='xyjlr';
(If Application.findcomponent('xyjlr')=nil Then
Application.CreateForm(Txyjlr, xyjlr);
xyjlr.show;)
end;
以上小括号中的代码,如何将xyjlr换成变量a,该如何写?
procedure Terp.Button1Click(Sender: TObject);
var a:string;
begin
a:='xyjlr';
If Application.findcomponent(a)=nil Then
Application.CreateForm(Txyjlr, xyjlr);
xyjlr.show;
end;
procedure Terp.Button1Click(Sender: TObject);
var
a:string;
xyjlr:Txyjlr;
begin
a:='xyjlr';
If Application.findcomponent(a)=nil Then
Application.CreateForm(Txyjlr, xyjlr);
xyjlr.parent:=self;
xyjlr.show;
end;全变一个sting类型的a,我变不了啊,水平有限。
var a:string;
begin
a:='xyjlr';
If Application.findcomponent(a)=nil Then
Application.CreateForm(Txyjlr, Txyjlr(a));
Txyjlr(a).show;
end;?
Form1:=CreateInstanceByClassname('TForm1')
If Application.findcomponent('xyjlr')=nil Then
Application.CreateForm(Txyjlr, xyjlr);
xyjlr.show;
中的四个xyjlr都要换成另外的变量,该如何实现?
procedure Terp.Button1Click(Sender: TObject);
var
a:string;
tf:Tclass;
f:Tform;
begin
a:='xyjlr';
If Application.findcomponent(a)=nil Then
begin
tf:=findclass('T'+a);
Application.CreateForm(Tf, f);
f.show;
end;
end;
在formclose的时候释放。
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Txyjlr(a).free;
end;
中提示错误incompatible types:'TComponentClass' and 'TClass'
类型都不一样当然会有错 你可以强制转换 TComponentClass(Tf)但是之前tf:=findclass('T'+a) 如果 'T'+a 这个类不存在的话 也是会报错
就是Application.CreateForm(Tf, f);的tf 换成TComponentClass(Tf) 别的地方不动
能保证编译的时候不报错
但是执行的时候 到 tf:=findclass('T'+a) 如果 'T'+a 这个类不存在的话 也是会报错 你要调用的窗体之前是不是已经创建 是在同一个窗体内创建的呢 还是在别的窗体 对你的需求还是不大明白 能不能详细的说明一下
var
a : string;
fClass : TComponentClass;
f : TForm;
begin
a := 'xyjlr';
if Application.FindComponent(a) = nil then
begin
fClass := TComponentClass( FindClass('T' + a));
Application.CreateForm(fClass, f);
f.Name := a;
f.Show;
end;
end;
这两句中的xyjlr不能用变量a来替换了是吧?你就自己定义一个CreateForm的过程不就解决了?定义一些全局变量,如
var xyjlr:Txyjlr;
grot:Tgrot;
Produce P_CreateForm(FormName:String);procedure Tfrm_Main.P_CreateForm(FormName);
begin
if FormName='grot' then
begin
Application.CreateForm(Tgrot,grot);
grot.Show;
end;
if FormName='xyjlr' then
begin
Application.CreateForm(Txyjlr,xyjlr);
xyjlr.Show;
end;
end;你的调用
procedure Terp.Button1Click(Sender: TObject);
var a:string;
begin
a:='xyjlr';
P_CreateForm(a)
end;
procedure Terp.Button1Click(Sender: TObject);
var a:string;
begin
a:='xyjlr';
If Application.findcomponent(a)=nil Then
Application.CreateForm(Txyjlr, Txyjlr(a));
Txyjlr(a).parent:=self; //不一定是self,你要在什么母容器上显示就写那个容器的name
Txyjlr(a).show;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Txyjlr(a).free; //不一定在窗口关闭的时候才释放,只是一定要释放,否则报错。
end;
Txyjlr(a)
这样可以吗?要负责哦
呵呵,不知道他的Txyjlr是什么,不好说。
试试嘛。
('xylz',xylz,Txylz)这样的数据放在一个数组中,或者放在HASH表中,使用是根据字符的窗体名字找到窗体变量和窗体的类,这样不就可以动态生成窗体了吗?以后有变动就维护下那个数组或者HASH表不就行了吗?
不知道你明白我意思没有
还是帮你改13楼的吧,他那写法漏了一个关键:没有注册类;还有一个错误:Application.CreateForm(Tf, f);改成Application.CreateForm(TComponentClass(Tf), f);在你主窗体的Create事件中注册你要动态生成的那些窗体的类
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterClass(TForm2);//这里是没办法用变量来代替了,你有100个就要注册100个
RegisterClass(TForm3);
。
end;procedure TForm1.Button1Click(Sender: TObject);
var
a:string;
tf:Tclass;
f:Tform;
begin
a:='Form2';
If Application.findcomponent(a)=nil Then
begin
tf:=findclass('T'+a);
Application.CreateForm(TComponentClass(Tf), f);
f.ShowModal;
end;
end;
分析下为什么下次没出来?因为
If Application.findcomponent(a)=nil Then
不满足了,为什么不满足?因为
f.ShowModal;后没有执行f.free;
RegisterClass(TForm3);
学到了
创建窗体 用完后要释放掉 我也总爱犯这样的错误
Application.CreateForm(TComponentClass(Tf), f);
try
f.ShowModal;
finally
f.Free;
end;