一个调用MDIChild子窗体的问题?(50分)

  • 主题发起人 主题发起人 kinlee
  • 开始时间 开始时间
K

kinlee

Unregistered / Unconfirmed
GUEST, unregistred user!
一个MDI主窗体和多个MDIChild子窗体,单击主窗体的某个菜单项打开
相应的子窗体。我想做一个过程来实现这个调用功能。请问各位大虾应
如何写这个过程。要求如下:
1.首先要判断这个子窗体是否已经被打开。如果已经打开,则Show出来
即可,否则Create这个窗体,再Show出来。
2.请将调用过程和解说写清楚一点,本个乃一大菜鸟。谢谢!
 
proc ....click;
begin
applition.fromcreate(tform..,form..);
end;
proc form..close;
begin
form...free;
end;

工程文件中:
delete: applition.fromcreate(tform..,form..);
form.. 为form名
 
TO:liuchuanbo
我的意思是:所有的子窗体的调用都通过这个过程来实现,而不单单调用一个窗体。
而且你上面的这个过程没有考虑这个子窗体是否已经被调用过。
 
procedure TMain.CreateChild;
begin
if not Assigned(Child) then
Child:=TChild.create(self)
else
Child.BringToFront;
end;

procedure TMain.DeleteChild;
begin
if Assigned(Child) then
begin
Child.Free;
Child:=nil;
end;
end;
 

procedure openform(formname:string;formclass:tformclass;mainform:tform);
//formname:CHILDFORM表单名,tformclass:CHILDFORM表单类,MAINFORM:主MDI表单名。
var
frmopen:tform;
begin
frmopen:=formcreated(formname,mainform);
if frmopen=nil then
begin
frmmain.clickmenuname:=senderofmenu.name;
formclass.create(application);
end
else
if not frmopen.active then
frmopen.show;
end;


function formopen(mdichildname:string;mdiform:tform):tform;
var i:integer;
begin
result:=nil;
with mdiformdo
begin
for i:=0 to mdichildcount-1do
if uppercase(mdichildren.name)=uppercase(mdichildname) then
begin
result:=mdichildren;
break;
end;
end;
end;
 
TO:qf0421
你的代码没有参数传递,不可将所有子窗体的调用都通过这个过程调用。
另请问后面的DeleteChild过程在什么时候调用。
 
如果你的CHILD FORM是生成多个的话,可以这样:
procedure TMain.CreateChild(ChildCaption:string);
var i:integer;
begin
i:=findchild(childcaption);
if i=-1 then
begin
child:=Tchild.create(self);
child.caption:=childcaption;
end
else
main.mdichildren.bringtofront;
end;

procedure Tmain.deletechild(childcaption:string);
var i:integer;
begin
i:=findchild(childcaption);
if i<>-1 then
main.mdichildren.free;
end;
//deletechild可以用在菜单中的“关闭”
function Tmain.findchild(childcaption:string):integer;
var i:integer;
index:integer;
begin
index:=-1;
for i:=0 to main.mdichildcount-1do
if main.mdichildren.caption=childcaption then
begin
index:=i;
break;
end;
result:=index;
end;
 
我的程序如下:这个代码不能实现我上面的功能,谁能帮我修改一下。多谢。
procedure TMainForm.ShowMyForm(FormClass:TFormClass;Form:TForm);
//MainForm为MDI主窗体
begin
if Form=nil then
begin
Form:=FormClass.create(self);
end;
Form.Show;
end;

//一个菜单单击事件
procedure TMainForm.N1Click(Sender: TObject);
begin
ShowMyForm(TChildForm1,ChildForm1);
//ChildForm1为一个子窗体
end;
 
我发了一个例子给你
 
参看TApplication的CreateForm就可以了:
注意:如果关闭Form2的时候释放了内存,要
Form2 := nil;
否则会出错。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TMainForm = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure CreateForm(InstanceClass: TComponentClass;
var Reference);
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;
implementation
uses Unit2;
{$R *.DFM}
procedure TMainForm.CreateForm(InstanceClass: TComponentClass;
var Reference);
var
Instance: TComponent;
begin
if TComponent(Reference) <> nil then
exit;
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
Instance.Create(MainForm);
except
TComponent(Reference) := nil;
raise;
end;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
CreateForm(TForm2,Form2);
Form2.Show();
end;

end.
 
请问各位大虾,上面的过程中我想加入以下功能,应怎么做:
将已经打开的子窗体的caption加入到菜单中,当该子窗体关闭已后再删除它。
并且单击相应的菜单项,则显示相应的子窗体。
 
设置主MDI窗体的WINDOWMENU就可。
 
多人接受答案了。
 
后退
顶部