我已前也碰到,这样太可以解决 procedure TFrm_OtherInList.FormDestroy(Sender: TObject); begin Frm_OtherInList:=nil; end;退出时释放窗体就可以
正常打开 得激活上次已经打开的 不能再重复打开吧 激活上次打开代码如下: function TfrmMain.MDIExist(frmName: string): Boolean; var i: Integer; begin Result := False; for i := 0 to MDIChildCount - 1 do begin if MDIChildren[i].Name = frmName then begin Result := True; MDIChildren[i].BringToFront; Break; end end; end; 如果lz意思是要打开复制一个的话 那就按照ls意思 差不多了。
我也问个问题mdi最小化了就隐藏了怎么办呀
if not MDIExist('frm_SellPreList') then begin application.CreateForm(Tfrm_SellPreList,frm_SellPreList); frm_SellPreList.Show; end这个对吗,好像不对
procedure RunDc(App: TApplication); begin if not Assigned(frmPatDc) then begin Application := App; frmPatDc := TfrmPatDc.Create(app.MainForm); frmPatDc.frmHandle :=frmPatDc.Handle; frmPatDc.Show; end else begin ShowWindow(frmPatDc.frmHandle, SW_SHOWDEFAULT); frmPatDc.BringToFront; end; end;
主窗:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type Tmain = class(TForm) Button1: TButton; Timer1: TTimer; Button2: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } qu_formindex: integer; end;var main: Tmain; //主窗implementation {$R *.dfm} uses unit2;//Form2的单元 var Frm:array[0..9]of TForm1;//定义10个(当然可以根据需要定义更多)TForm1 FormIndex:integer;procedure Tmain.Button1Click(Sender: TObject); begin if FormIndex >9 then begin showmessage('定义的10个窗体已经建立,不能再建立了。'); exit; end; Frm[FormIndex]:=TForm1.Create(self);//这样建立的TForm1,可以通过变量Frm[FormIndex]来访问 Frm[FormIndex].FormIndex:=FormIndex;//每个 TForm1 实例的索引 Frm[FormIndex].Caption:='第 '+inttostr(FormIndex)+' 个窗体';//给新窗体赋值窗眉文本 Frm[FormIndex].Show;//显示刚建立的窗体 inc(FormIndex); end;procedure Tmain.FormCreate(Sender: TObject); begin Timer1.Enabled:=false; Timer1.Interval:=100; end;procedure Tmain.Timer1Timer(Sender: TObject); begin Timer1.Enabled:=false; FreeAndNil(Frm[qu_formindex]);//释放刚刚关闭的动态窗体 end;procedure Tmain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var i:integer; begin for i:= 0 to 9 do if Frm[i]<>nil then FreeAndNil(Frm[i]);//主窗关闭前释放未释放的动态窗 end;procedure Tmain.Button2Click(Sender: TObject); begin if Frm[3]<>nil then begin Frm[3].Show;//如果窗体 Frm[3] 已经存在,让它显示 Frm[3].SetFocus;//将焦点放在 Frm[3] end; end;end.子窗:unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } FormIndex: integer;//每个 TForm1 实例的索引 end;var Form1: TForm1; //子窗implementation {$R *.dfm} uses unit1; // main 窗所在单元procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin main.qu_formindex:=FormIndex;//将自己的索引值传回主窗 main.Timer1.Enabled:=true;//打开主窗的定时器(让定时器来释放本窗体) end;end.
procedure TFrm_OtherInList.FormDestroy(Sender: TObject);
begin
Frm_OtherInList:=nil;
end;退出时释放窗体就可以
激活上次打开代码如下:
function TfrmMain.MDIExist(frmName: string): Boolean;
var
i: Integer;
begin
Result := False;
for i := 0 to MDIChildCount - 1 do
begin
if MDIChildren[i].Name = frmName then
begin
Result := True;
MDIChildren[i].BringToFront;
Break;
end
end;
end;
如果lz意思是要打开复制一个的话 那就按照ls意思 差不多了。
if not MDIExist('frm_SellPreList') then
begin
application.CreateForm(Tfrm_SellPreList,frm_SellPreList);
frm_SellPreList.Show;
end这个对吗,好像不对
begin
if not Assigned(frmPatDc) then
begin
Application := App;
frmPatDc := TfrmPatDc.Create(app.MainForm);
frmPatDc.frmHandle :=frmPatDc.Handle;
frmPatDc.Show;
end
else
begin
ShowWindow(frmPatDc.frmHandle, SW_SHOWDEFAULT);
frmPatDc.BringToFront;
end;
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
Tmain = class(TForm)
Button1: TButton;
Timer1: TTimer;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
qu_formindex: integer;
end;var
main: Tmain; //主窗implementation {$R *.dfm}
uses unit2;//Form2的单元
var Frm:array[0..9]of TForm1;//定义10个(当然可以根据需要定义更多)TForm1
FormIndex:integer;procedure Tmain.Button1Click(Sender: TObject);
begin
if FormIndex >9 then begin
showmessage('定义的10个窗体已经建立,不能再建立了。');
exit;
end;
Frm[FormIndex]:=TForm1.Create(self);//这样建立的TForm1,可以通过变量Frm[FormIndex]来访问
Frm[FormIndex].FormIndex:=FormIndex;//每个 TForm1 实例的索引
Frm[FormIndex].Caption:='第 '+inttostr(FormIndex)+' 个窗体';//给新窗体赋值窗眉文本
Frm[FormIndex].Show;//显示刚建立的窗体
inc(FormIndex);
end;procedure Tmain.FormCreate(Sender: TObject);
begin
Timer1.Enabled:=false;
Timer1.Interval:=100;
end;procedure Tmain.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=false;
FreeAndNil(Frm[qu_formindex]);//释放刚刚关闭的动态窗体
end;procedure Tmain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var i:integer;
begin
for i:= 0 to 9 do
if Frm[i]<>nil then FreeAndNil(Frm[i]);//主窗关闭前释放未释放的动态窗
end;procedure Tmain.Button2Click(Sender: TObject);
begin
if Frm[3]<>nil then begin
Frm[3].Show;//如果窗体 Frm[3] 已经存在,让它显示
Frm[3].SetFocus;//将焦点放在 Frm[3]
end;
end;end.子窗:unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
FormIndex: integer;//每个 TForm1 实例的索引
end;var
Form1: TForm1; //子窗implementation {$R *.dfm}
uses unit1; // main 窗所在单元procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
main.qu_formindex:=FormIndex;//将自己的索引值传回主窗
main.Timer1.Enabled:=true;//打开主窗的定时器(让定时器来释放本窗体)
end;end.
implementation {$R *.dfm}
uses unit2;//Form1的单元 (此处原来的注释误为 Form2 了)......