各位兄弟,我在编写MDI程序中,希望每次只出现一个Form,如果调用一个新Form,就将目前存在的form清除,再动态建立新Form,然后显示。
我们知道,建立一个Form可以这样书写
Application.CreateForm(TfrmMain, frmMain); 因此,我希望建立这样的一个过程(其中全程私有变量OldForm:TForm,用于保存目前的Form对象)
Procedure TfrmMain.ShowForms(FormClass:TForm;NewForm:TForm);
在这个过程中应实现这样的功能,先判断OldForm是否为nil,如不为,则OldForm.free,然后再动态建立NewForm,最后将OldForm:=NewForm,可是我查了帮助,发现Tapplicaiton的CreateForm过程是这样定义的:
procedure CreateForm(FormClass: TFormClass; var Reference); 照这样,我怎么也不能定义自己的动态调用窗体的ShowForms过程,也就不能动态实现动态调用如ShowForms(Form1)..ShowForms(Formn)了。 请各位兄弟,帮帮忙,帮我实现一下这个ShowForms过程。
我们知道,建立一个Form可以这样书写
Application.CreateForm(TfrmMain, frmMain); 因此,我希望建立这样的一个过程(其中全程私有变量OldForm:TForm,用于保存目前的Form对象)
Procedure TfrmMain.ShowForms(FormClass:TForm;NewForm:TForm);
在这个过程中应实现这样的功能,先判断OldForm是否为nil,如不为,则OldForm.free,然后再动态建立NewForm,最后将OldForm:=NewForm,可是我查了帮助,发现Tapplicaiton的CreateForm过程是这样定义的:
procedure CreateForm(FormClass: TFormClass; var Reference); 照这样,我怎么也不能定义自己的动态调用窗体的ShowForms过程,也就不能动态实现动态调用如ShowForms(Form1)..ShowForms(Formn)了。 请各位兄弟,帮帮忙,帮我实现一下这个ShowForms过程。
TFormClass= Class of TForm;
var
TempFormClass:TFormClass;Procedure ShowForm(FormClass:TFormClass);
begin
FormClass:=TFormClass.Create;
FormClass.show;
end;调用:ShowForm(TempFormClass);
if Screen.ActiveForm <> Application.MainForm then
Screen.ActiveForm.Close;
if MDIChildCount>0 then
ActiveMDIChild.Close;
我的意思是啊,当我点击工具栏中A按钮时,动态建立FormA并显示它,当我再点击工具栏中B按钮时,清除FormA, 并同时动态建立FormB 并显示它。tmainform.AClick(sender:tobject);
begin
ShowForms(FormA);
end;TmainForm.BClick(Sender:Tobject);
begin
ShowForms(FormB);
end;TmainForm.ShowForms(form);
begin
if MDIChildCount>0 then
ActiveMDIChild.Free;//此处不能使用Close ,因在MDI中,Close只能缩小窗体,不能清除窗体
TApplcaiton.createForm(参数1,Form);
Form.show;
end; 在上面中,参数1该怎样传入呢,传入什么呢???因为平时在Delphi自动生成的语句中一般是这样的。
Tapplicaiton.createform(TFormA,FormA);
Tapplicaitopn.createform(TFormB,formB);因此,在ShowForm中,怎样传入正确的CreateForm的两个参数就非常重要的啊。
改为
TApplcaiton.createForm(TForm,Form);
var
ClassClient:TComponentClass;
client:TForm;
begin
ClassClient:=TComponentClass(FindClass(strForm));
Application.CreateForm(ClassClient,client);
end;
在调用这个函数之前,必须在相应类单元文件中的"end."之前加上如下语句:
initialization
RegisterClass(类名);
finalization
UnRegisterClass(类名);
begin
if not Assigned(TForm(Afrom)) then Application.CreateForm(AfromClass, Afrom)
else TForm(Afrom).BringToFront;
end;
AfromClass:為窗口類,Afrom為指針
調用
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenFrom(TForm2,Form2);
end;
var
i:Integer;
begin
for i :=0 to screen.FormCount-1 do begin
if screen.Forms[i].ClassType=InstanceClass then begin
TComponent(Reference) := screen.Forms[i];
exit;
end;
end; application.CreateForm(InstanceClass,Reference);
end;
var
FormA:TForm;
begin
TForm(FrmList).Free;
FrmList.Delete[0]; FormA:=TForm.Create(Self);
FrmList.Add(FormA);
ShowForms(FormA);
end;TmainForm.BClick(Sender:Tobject);
begin TForm(FrmList).Free;
FrmList.Delete[0];Formb:=TForm.Create(Self);
ShowForms(FormB);
FrmList.Add(FormB);
end;另把close里的Aciton := caFree;