//Unit1 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementationuses Unit2, Unit3;{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject); begin if Assigned(FormA) then FormA.Close; if Assigned(FormA) then Exit; if not Assigned(FormB) then FormB:=TFormB.Create(Application); FormB.ShowModal; end;procedure TForm1.Button1Click(Sender: TObject); begin if not Assigned(FormA) then FormA:=TFormA.Create(Application); FormA.Show; end;end. //Unit2=FormA unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TFormA = class(TForm) Label1: TLabel; Button1: TButton; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private public IsSaved:Boolean; end;var FormA: TFormA;implementation{$R *.dfm}procedure TFormA.FormClose(Sender: TObject; var Action: TCloseAction); begin if not IsSaved then begin Action:=caNone; Application.MessageBox('未保存,请保存','提示',64); end else begin Action:=caFree; FormA:=nil; end; end;procedure TFormA.Button1Click(Sender: TObject); begin IsSaved:=True; end;procedure TFormA.FormCreate(Sender: TObject); begin IsSaved:=False; end;end. //Unit3=FormB unit Unit3;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TFormB = class(TForm) Label1: TLabel; procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end;var FormB: TFormB;implementation{$R *.dfm}procedure TFormB.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:=caFree; FormB:=nil; end;end.
有没有保存在窗体关闭询问事件里处理: procedure Tfpdcl.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if "保存标志未保存" then begin showmessage('未保存,请保存'); canclose:=false; end; end;保证只打开一个窗体可以先执行关闭所有窗体过程,再打开某个窗体 procedure Tmain.N7Click(Sender: TObject); var i:integer; begin for i:=0 to main.MDIChildCount-1 do try main.MDIChildren[i].Close; except on EAccessviolation do ; end; end;
你再打开B窗体时,判断一下是否有子窗体打开,即 for I := Form1.MDIChildCount-1 downto 0 do Form1.MDIChildren[I].Close;接着在打开B子窗体。 这样子应该可以,如果害怕有没有保存,我觉得你应该用一个全局变量来确认是否有做改动啦,最后再在关闭事件中判断。
1。在子窗口关闭事件中,看是否已经保存,如果没有保存则提示保存
2。在该函数中检测是否有其它窗体,如果有则关闭
3。创建新窗体
//Unit1
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses Unit2, Unit3;{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(FormA) then
FormA.Close;
if Assigned(FormA) then
Exit;
if not Assigned(FormB) then
FormB:=TFormB.Create(Application);
FormB.ShowModal;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(FormA) then
FormA:=TFormA.Create(Application);
FormA.Show;
end;end.
//Unit2=FormA
unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TFormA = class(TForm)
Label1: TLabel;
Button1: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private public
IsSaved:Boolean;
end;var
FormA: TFormA;implementation{$R *.dfm}procedure TFormA.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if not IsSaved then
begin
Action:=caNone;
Application.MessageBox('未保存,请保存','提示',64);
end
else
begin
Action:=caFree;
FormA:=nil;
end;
end;procedure TFormA.Button1Click(Sender: TObject);
begin
IsSaved:=True;
end;procedure TFormA.FormCreate(Sender: TObject);
begin
IsSaved:=False;
end;end.
//Unit3=FormB
unit Unit3;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TFormB = class(TForm)
Label1: TLabel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;var
FormB: TFormB;implementation{$R *.dfm}procedure TFormB.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
FormB:=nil;
end;end.
procedure Tfpdcl.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if "保存标志未保存" then
begin
showmessage('未保存,请保存');
canclose:=false;
end;
end;保证只打开一个窗体可以先执行关闭所有窗体过程,再打开某个窗体
procedure Tmain.N7Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to main.MDIChildCount-1 do
try
main.MDIChildren[i].Close;
except
on EAccessviolation do ;
end;
end;
Form1.MDIChildren[I].Close;接着在打开B子窗体。
这样子应该可以,如果害怕有没有保存,我觉得你应该用一个全局变量来确认是否有做改动啦,最后再在关闭事件中判断。