100分,关于以前的一个关于动态菜单调用Form的问题(100分)

T

t123

Unregistered / Unconfirmed
GUEST, unregistred user!
根据不同的菜单选择可以传回不同的form名(string型),如何动态调用这个form?
例如:
有两个form:
form1:tform1
form2:tform2
菜单项的onclick事件代码均为:my_showform(v_formname);
参数v_formname(string型)是动态变化的。
我想通过my_showform来显示不同的form,也就是说
my_showform('form1')显示tform1
my_showform('form2')显示tform2
如何实现?
以前的回答:
Procedure my_showform(v_formname:string);
begin
tform(application.FindComponent(v_formname)).show;
End
或者
直接以TFORM做参数,如下:
procedure my_showform(v_formname:TForm);
调用时Form1时:
my_showform(Form1);
新问题:
我的form是mdichildform,在主程序开始的时候我不想创建他们,我想用的时候再创建,这两种方法就不灵了!
怎么办?难道非得用sdi或在开始时就创建他们?
 
J

jrq

Unregistered / Unconfirmed
GUEST, unregistred user!
动态创建的时候得到句柄, 再 show不行吗?
 
S

sadj

Unregistered / Unconfirmed
GUEST, unregistred user!
可以这样:
for i := 0 to Screen.FormCount - 1do
if Screen.Forms.Name = 'Form1' then
...
try it!
 
T

t123

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是,主程序运行后,还没有创建子form,子form要根据选择的菜单功能来创建。
例如:菜单1对应的mdichildform名是:form_aaaa
菜单2对应的mdichildform名是:form_bbbb
当我选择菜单1时就动态创建form_aaaa,用完释放;
当我选择菜单2时就动态创建form_bbbb,用完释放。
所以用两位的方法行不通
 
S

sadj

Unregistered / Unconfirmed
GUEST, unregistred user!
需要注意的是:MDIChild的Form不能被隐藏,也就是不能Hide,除非你用发个消息给他。而且可能
有隐含的问题。
如果根据菜单的功能创建,可以写在菜单的OnClick事件中阿,或者写入actionlist也可以
比如:
var
form_aaaa: TForm_aaaa;
implementation
TForm.aaaaClick(sender: TObject);
begin
form_aaaa := TForm_aaaa.create(self);
end
 

Unregistered / Unconfirmed
GUEST, unregistred user!
如果你的菜单对应着Form就好办了:
Procedure TMainForm.N1Click(Sender:TObject)
begin
if not Assigned(Form_aaa) then
Beign
Form_aaa:=TForm_aaa.Create(Application);
Form_aaa.show;
end;
end;
但是在OnClose事件中要把动态创建的Form_aaa释放掉:
Action:=caFree;
Form_aaa:=nil;
试试吧!!!如果能行就给点分吧!哈
 
S

sadj

Unregistered / Unconfirmed
GUEST, unregistred user!
嗯,楼上写得比较具体,照他的办吧
 
Z

zxb200

Unregistered / Unconfirmed
GUEST, unregistred user!
打開窗口過程,你看看:
procedure tform1.my_showform(v_formname:string);//v_formname為窗體名
var classform:tformclass;
fform:tform;
begin
classform:=tformclass(findclass('t'+v_formname));
fform:=tform(application.FindComponent(v_formname));
if not assigned(fform) then
application.CreateForm(classform,fform);
fform.show;
end;
若想在form1中通過上過程打開其他窗口,首先要注冊其它窗口
的類。如若想打開form2窗口,則注冊如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterClass(tform2);
end;
這樣在form1的oncreate事件中將要打開的窗口類全部一次性注冊即可。
打開窗口示例:
procedure TForm1.Button3Click(Sender: TObject);
begin
my_showform('form2');
end;
 
T

t123

Unregistered / Unconfirmed
GUEST, unregistred user!
尧的方法不可行,应为我在程序运行后才知道菜单所对应的tfrom是什么。
zxb2000的做法可能行,我先试试。
 
S

sydan

Unregistered / Unconfirmed
GUEST, unregistred user!
把你那個v_formname變為Tform類型不是更簡單么!!??
在菜單的Click事件中這樣寫道 New_Form(v_formname);
再公共事件中這樣寫道:
procedure TMain_Name.New_Form(form_MName: Tform);
if form_MName=nil then
form_MName:=Tform_MName.create(application);
form_MName.show;
 
T

t123

Unregistered / Unconfirmed
GUEST, unregistred user!
请教zxb2000:
若想在form1中通過上過程打開其他窗口,首先要注冊其它窗口
的類。如若想打開form2窗口,則注冊如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterClass(tform2);
end;
问题是我只有在程序运行后才知道有哪些窗口要打开,也就是说tform2是个字符串变量,怎么办?
 
Z

zxb200

Unregistered / Unconfirmed
GUEST, unregistred user!
應該在你的系統中
窗口的類名是設計時
就固定在下來了。把所有要
在主窗口打開的窗口的
類注冊一遍,不就可以了。
你要在程序中動態生成
其它的窗口,也是在當前
已存在的類中繼承。
比如要打開form2,form2窗口早在
你設計時就建立好了,你在主窗口
寫個注冊form2的類就可以了。
 
T

t123

Unregistered / Unconfirmed
GUEST, unregistred user!
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
948
SUNSTONE的Delphi笔记
S
顶部