如何动态创建已存在的窗口???(20分)

  • 主题发起人 主题发起人 Rabbit_Lap
  • 开始时间 开始时间
R

Rabbit_Lap

Unregistered / Unconfirmed
GUEST, unregistred user!
在工程中不让系统自动创建所有的窗体,而是在用户选择相应的功能后去定位
要创建的窗体,请问各位大虾该怎做?当然如下是可以的,但窗体名称是保存在一
数据表中的,
var
Myform : TForm;
begin
myForm := TForm(Application.FindCommponent('Form1'));
if myForm <> nil then //存在该窗体
else //没有存在该窗体,创建
end;
 
myForm:= Application.CreateForm(TForm, myForm);
 
你把自动创建form的地方去掉
改在需要的地方创建
用完后free不就行了。
 
在Project中,注释掉自动创建窗体
在需要创建的时候使用
myForm:= TmyForm.Create(Application)
 
唉,看来你们还是理解错误!myForm:= Application.CreateForm(TForm, myForm);只能是
在你确定了窗体名称后才能如此,关键是TFor,Myform应该是变量,如果单指某个窗体当然
容易,现在问题就在于如何去替代窗体变量!比如数据表中功能为结帐管理对应的窗口为
FormAccount(在表中为字符),那么该如何写?[:D]
 
可以创建一个继承于“旧”窗体的“新”窗体吗?
如果可以的话,你把“新”窗体修改一下,不就行了?
 
rabbit_lap,不存在理解错误,在程序中声明一个MyForm,其实它是个引用,根本就没创建。
只有调用了Application.CreateForm或TForm.Create才会引起内存分配。干吗要把窗体名称
保存在数据表里呢,在你的程序里声明这些窗体的变量就行了。
 
动态创建已存在的窗口???
那就将已存在的窗口del,然后再创建
 
rabbit_lap
var
Myform : TForm;
begin
myForm := TForm(Application.FindCommponent('Form1'));
if myForm <> nil then //存在该窗体
else //没有存在该窗体,创建
end;

改为
var
Myform : TForm;
begin
if Application.FindComponent('Form1') Is TForm
then //存在该窗体
else //没有存在该窗体,创建
begin
MyForm:=TForm.Create(Application);
MyForm.Name='Form1';
end;
end;

 
jsbhwjg的方法我也知道,这是在窗体名称知道的情况下,当然你前面说的在代码中定义窗体
变量,没必要放在表中这也行,但我觉得是否缺少灵活性?如果不是考虑灵活性,也不会有此
问题要问大家了,难道真的没办法解决吗?[:)]
 
不是已经解决了吗?
首先从数据库中取出窗体名,给一个字符串变量。例如:FormName;
var
Myform : TForm;
FormName:string;
MyComponent:TComponent;
begin
FormName:=...;//略
MyComponent:=Application.FindComponent(FormName);
if MyComponent Is TForm then
begin
MyForm:=TForm(MyComponent);
MyForm.ShowModal;
end else //没有存在该窗体,创建
begin
MyForm:=TForm.Create(Application);
MyForm.Name:=FormName;
MyForm.ShowModal;
end;
end;
上面的代码不能解决你的问题吗?
 
我真的有点受不了:(
var
Myform : TForm;
FormName:string;
MyComponent:TComponent;
begin
FormName:=...;//略
MyComponent:=Application.FindComponent(FormName);
if MyComponent Is TForm then
begin
MyForm:=TForm(MyComponent);
MyForm.ShowModal;
end
else if MyComponent=Nil //没有存在该窗体,创建
begin
MyForm:=TForm.Create(Application);
MyForm.Name:=FormName;
MyForm.ShowModal;
end
else
begin
//组件存在,却不是TForm类型;
end;
end;
 
你的意思是根据类名来创建类的实例吧?!
我以前也碰到过,但类比较少,就用CASE解决了,你有多少个不同的窗体类?
不知道条件编译(我也不懂[:)])能不能解决你那个问题???
关注啊!
 
我懂了,不太可能,除非象上面那样
 
jsbhwjg,你那样是不行的,只能创建一个有需要名字的空白窗体,别人的窗体是有类的
 
是的,我知道了,开始没太领会,献丑
 
这个问题有点难度,有意思,关注!
 
cp0574你后来可有什么折忠的方法解决?我在CSDN也发表过该问题,也未得到解决方案,唉!!![:(]
 
其实这还是
RegisterClass
FindClass的问题
在每一个窗体单元
都RegiserClass
然后FindClass
在创建

或者声明
一个常量数组
把所有的窗体类放进去
const
CFormClasses: array [0..20] of TFormClass =
(TForm1, TForm2, TForm3,...,TForm20);
然后
procedure CreateForm(const AClassName: string);
var
I: Integer;
MyFormClass: TFormClass;
begin
for I := Low(CFormClasses) to High(CFormClasses) do
if CFormClasses.ClassName = AClassName then
begin
MyFormClass := CFormClasses;
break

end;
if MyFormClass = nil then
raise Exception.Create('此窗体类名错误!')
else
with MyFormClass.Create(Application) do
try
ShowModal;
finally
Free;
end;
end;
 
看看这个
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1526037

我的例子程序是根据类名,你也可以在窗体名前面加上一个"T"
来创建动态加载的模块中的MDI 子窗体的,
看你这个小气,肯定是没分了,
如果需要,我就破例不要分送给你
 

Similar threads

S
回复
0
查看
777
SUNSTONE的Delphi笔记
S
S
回复
0
查看
690
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部