1.我做一个主界面,左边放了3个按钮,分别为采购管理,入库管理,销售管理,右边放了一个panel,有3个form,一个为采购管理的流程图:包括:采购申请,采购计划,采购审核,其余两个form对应入库管理流程图和销售管理流程图,
2.我想要的效果是:点button1时将form1显示出来,点button2时将form2显示出来,点button3时将form3显示出来,如果form已经创建了,则不再创建,直接显示,否则创建
3.我写的创建form的代码:
定义了一个私有变量:
CForm : TForm;
procedure TfrmMain.CreateForm(myFormClass: TFormClass;
var Reference: TForm; sname: String);
begin
if assigned(CForm) then
FreeAndNil(CForm); CForm := myFormClass.Create(self);
try
CForm.Parent := RzPanel2;
CForm.BorderStyle := bsnone;
CForm.Align := alClient;
CForm.Name := sname;
CForm.Show;
except
FreeAndNil(CForm);
end;
end;
现在第一次创建没问题,关键是如何判断该form已经创建,我现在是因为不好判断form已经创建,所以每次都先释放
2.我想要的效果是:点button1时将form1显示出来,点button2时将form2显示出来,点button3时将form3显示出来,如果form已经创建了,则不再创建,直接显示,否则创建
3.我写的创建form的代码:
定义了一个私有变量:
CForm : TForm;
procedure TfrmMain.CreateForm(myFormClass: TFormClass;
var Reference: TForm; sname: String);
begin
if assigned(CForm) then
FreeAndNil(CForm); CForm := myFormClass.Create(self);
try
CForm.Parent := RzPanel2;
CForm.BorderStyle := bsnone;
CForm.Align := alClient;
CForm.Name := sname;
CForm.Show;
except
FreeAndNil(CForm);
end;
end;
现在第一次创建没问题,关键是如何判断该form已经创建,我现在是因为不好判断form已经创建,所以每次都先释放
mHandle:THandle;
begin
mHandle:=FindWindow(nil,'caption');
if mHandle = 0 then
begin
//--create form
end
else
beign
//--
end;
end;
我一般这样处理的
首先,把子form从 auto create 中去掉。在子 form的 onclose 事件中如下写:
action := cafree;
self := nil;调用的时候 : if not assigned(Formxxx) then
application.createform(tformxxx,formxxx);
formxxx.hostdocksite := panelxxx;
formxxx.align := alclient;
formxxx.show;
....
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
function createform(var Form:TForm;AFormClass: TFormClass;Caption:String=''):Boolean;
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses Unit2, Unit3;{$R *.dfm}function TForm1.createform(var Form:TForm;AFormClass: TFormClass;Caption:String=''):Boolean;
begin
result:=False;
if not Assigned(Form) then
begin
try
begin
Application.ProcessMessages;
Form:=AFormClass.Create(Application);
if Caption<>'' then
Form.Caption:=Caption;
Form.ShowModal;
result:=True;
end;
finally
Form.Free;
Form:=nil;
end;
end
else begin
try
Form.ShowModal;
result:=true;
except
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
createform(TForm(Form2),TForm2,'ddd');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
createform(TForm(Form3),TForm3,'ddd333333');
end;end.
就可以实现你的要求,你只要加上Parent然后用Show就可以
我测试过了..
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
Tfrm_Child = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end; function CreateFrmChild:Boolean;
function CreateFrmChildModal:Boolean;implementationvar
frm_Child: Tfrm_Child;
{$R *.dfm}function CreateFrmChild:Boolean;
begin
if Assigned(frm_Child)then
frm_Child:=Tfrm_Child.Create(Application); frm_Child.Show;
Result:=True;
end;function CreateFrmChildModal:Boolean;
var
form:Tfrm_Child;
begin
Result:=False;
form:=Tfrm_Child.Create(Application);
form.ShowModal;
if mrOK=form.ShowModal then
Result:=True;
form.Free;
end;end.要创建时调用 CreateFrmChild 或 CreateFrmChildModal 就可以了.要想停靠在另一个容器中用form.ManualDock(Panel1);
unit2, unit3;var
fm2: TForm2;
fm3: TForm3;procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(fm2) then
begin
fm2 := TForm2.Create(nil);
fm2.HostDockSite := panel1;
fm2.Align := alClient;
fm2.Show ;
end
else
fm2.Show ;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
if not Assigned(fm3) then
begin
fm3 := TForm3.Create(nil);
fm3.HostDockSite := panel1;
fm3.Align := alClient;
fm3.Show ;
end
else
fm3.Show ;
end;//TForm2,TForm3取消自动创建。
procedure TfrmMain.CreateForm(myFormClass: TFormClass;
var Reference: TForm; sname: String);
begin
if assigned(CForm) then ///?????????
CForm.show ////????????
else
begin
CForm := myFormClass.Create(RzPanel2);
try
CForm.Parent := RzPanel2; //创建在RzPanel2上
CForm.BorderStyle := bsnone;
CForm.Align := alClient;
CForm.Name := sname;
CForm.Show;
except
FreeAndNil(CForm);
end;
end;
end;
1.这段代码在第一个button执行时没问题,因为此时CForm为nil,执行后创建一个form1,此时CForm已不为nil,按
第一个button时,此时因为不创建同一个form,所以应该再创建,可assigned(CForm)这句判断CForm不为nil,这句应该咋改
2.这个过程中传了一个Reference: TForm,就是form的名称,我本就是想判断传来的form是否存在,存在就show,否则创建,所以我改了一下:将这两句改为:
if assigned(Reference) then
Reference.show
我是这样调过程的:
Self.CreateForm(TForm5,TForm(Form5),'Form5','Form5');
可为啥 Reference为nil
procedure TfrmMain.HideFrame(index: Integer);
Var
i : Integer;
begin
for i:=0 to FormList.Count-1 do
Begin
if i<>index then
Begin
TFrame(FormList.Objects[i]).Hide;
End;
End;
end;将frame放到一个list里面,在这里面判断。
procedure TfrmMain.RzGroup2Items0Click(Sender: TObject);
Var
frmSysConfig : TfrmSysConfig;
Index:Integer;
begin
//系统配置
Index:=FormList.IndexOf('frmSysConfig');
If Index<0 then
Begin
frmSysConfig := TfrmSysConfig.Create(nil);
frmSysConfig.Parent:=mainPanel;
frmSysConfig.Align:=alClient;
frmSysConfig.getSysConfigInfo;
frmSysConfig.Show;
FormList.AddObject('frmSysConfig',frmSysConfig);
End
Else
Begin
//先隐藏其他
HideFrame(index);
TFrame(FormList.Objects[index]).Show;
End;
end;在这里面创建及显示