如何在关闭一个窗口时将调用它的窗口也给关闭? void __fastcall TForm2::FormCloseQuery(TObject *Sender, bool &CanClose){ Form1->Close();} 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 if Form2.modalresult = mrok then form1.close; unit1unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementationuses unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin form2.ShowModal;end;end.unit2:unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form2: TForm2;implementationuses unit1 ;{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);begin form2.Close; form1.Close;end;end. 没反应,对了,我的FORM2是在FORM1的ONACTIVATE事件中用SHOWMODAL显示的 关键是在unit2中uses unit1 ;之后就可以用: form1.Close; 请大家看清,我的FORM2是在FORM1的ONACTIVATE事件中用SHOWMODAL显示的 Unit1.pasunit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type TForm1 = class(TForm) procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementationuses Unit2;{$R *.DFM}procedure TForm1.FormActivate(Sender: TObject);begin Form2.ShowModal;end;end.Unit2.pasunit Unit2;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm2 = class(TForm) Button1: TButton; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form2: TForm2;implementationuses Unit1;{$R *.DFM}procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);begin Form1.Close;end;procedure TForm2.Button1Click(Sender: TObject);begin Close;end;end. 大家误解了,如果程序中只有两个窗口,方法是可行的,但我的FORM1本身也是其它窗口通过按下一个BUTTON来SHOWMODAL的。 if Form2.ModalResult=mrCancel then form1.close; 在FORM1的ONACTIVATE事件中form2:=Tform2.Create(self);showmodal(form2);freeandnil(form2);self.close;我在网吧没法测试,记得以前也遇到过类似问题,不记得当初是放在OnActivate事件不是放在OnShow事件中了,反正好像有一个不行。另外,最好不要把上述代码放在Onactivate事件或OnShow事件中,你可以放在OnCreate事件中! delphi5.0 测试通过unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation uses Unit2;{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);var fm:TForm2;begin fm:=TForm2.Create(Application); fm.ShowModal; fm.Free; close;end;end.unit Unit2;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form2: TForm2;implementation{$R *.DFM}procedure TForm2.Button1Click(Sender: TObject);begin close;end;end. procedure TForm2.Button1Click(Sender: TObject);begin ModalResult:=mrCancel;end;procedure TForm1.Button1Click(Sender: TObject);var fm:TForm2;begin fm:=TForm2.Create(Application); if fm.ShowModal=mrCancel then close;end; 弟兄们,两个窗体是可以实现,但我的FORM1本身也是在别的窗体中通过SHOWMODAL调用的 而且我的FORM2窗体是在FORM1的OnActivate事件中调用的,并不是通过FORM1中的某个BUTTON实现的。(但很奇怪,代码放在BUTTON事件中便成功) 当然了,OnActivate事件之后还有其他的事件,所以你无法成功。你必须换一种程序的思路,不要放到 OnActivate之中或者,你这样:将代码放到一个button中(先别管他),然后在OnActivate中调用button的代码如何? 在执行ONACTIVATE事件时,modalform的消息循环还没有开始,所以在此时执行close,它的效果等于让modalresult=mrcancel,而modalform的消息循环开始前它会设置modalresult=0,也就使你前面的close白做了。showmodal源码摘要:function TCustomForm.ShowModal: Integer;var ... ...begin ... ... try Show; try SendMessage(Handle, CM_ACTIVATE, 0, 0);///这里会执行OnActivate事件,close时ModalResult:=...; ModalResult := 0;//清空了ModalResult repeat Application.HandleMessage; if Application.FTerminate then ModalResult := mrCancel else if ModalResult <> 0 then CloseModal; until ModalResult <> 0; Result := ModalResult; SendMessage(Handle, CM_DEACTIVATE, 0, 0); if GetActiveWindow <> Handle then ActiveWindow := 0; finally Hide; end; finally .... .... end;end;如果一定要在showmodal的form的OnActivate事件内close这个form,可以这样做。(见unit2)//******************* Unit1 form1 *********************unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementationuses unit2;{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);begin form2.ShowModal;end;end.//******************* Unit2 form2 *********************unit Unit2;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;const WM_CLOSEMODAL = WM_USER + 100;type TForm2 = class(TForm) Button1: TButton; procedure FormActivate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } procedure WmCloseModal(var Message:TMessage);message WM_CLOSEMODAL; public { Public declarations } end;var Form2: TForm2;implementationuses Unit3;{$R *.DFM}procedure TForm2.WmCloseModal(var Message: TMessage);begin close;//在自定义消息中closeend;procedure TForm2.FormActivate(Sender: TObject);begin if mrok = Form3.ShowModal then PostMessage(Handle,WM_CLOSEMODAL,0,0);//发一个自定义的消息,一定要用PostMessageend;procedure TForm2.Button1Click(Sender: TObject);begin close;end;end.//******************* Unit3 form3 *********************unit Unit3;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm3 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form3: TForm3;implementation{$R *.DFM}procedure TForm3.Button1Click(Sender: TObject);begin close; ModalResult := mrok;end;end. 问个简单的问题(100分) 关于函数CopyFile的问题,急待解决,各位帮帮忙 求MySQLDAC 2.0以上的D7可用版本,最好是FS! string,AnsiString类型的长度怎么设定 请教一个邮件发送问题??? 如何判断剪贴板中的内容是不是图形呢?????????,我在线等待. 英文XP下,IDE编辑代码时写不上汉字了 如何确定注册表中uninstall键下一个子键的键值是有效的卸载? 出现httpodbc.dll的文件是什么病毒啊? 控件Actionlist有什么用??? 急,急,急客户端与应用服务器连不上,报‘拒绝访问’错误 编写dcom程序时如何让客户端使用此程序?
form1.close;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
form2.ShowModal;
end;
end.
unit2:unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form2: TForm2;implementationuses unit1 ;
{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);
begin
form2.Close;
form1.Close;
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
TForm1 = class(TForm)
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses Unit2;{$R *.DFM}procedure TForm1.FormActivate(Sender: TObject);
begin
Form2.ShowModal;
end;end.Unit2.pas
unit Unit2;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm2 = class(TForm)
Button1: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form2: TForm2;implementationuses Unit1;{$R *.DFM}procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.Close;
end;procedure TForm2.Button1Click(Sender: TObject);
begin
Close;
end;end.
form1.close;
form2:=Tform2.Create(self);
showmodal(form2);
freeandnil(form2);
self.close;
我在网吧没法测试,记得以前也遇到过类似问题,不记得当初是放在OnActivate事件不是放在OnShow事件中了,反正好像有一个不行。另外,最好不要把上述代码放在Onactivate事件或OnShow事件中,你可以放在OnCreate事件中!
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation
uses Unit2;
{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
var
fm:TForm2;
begin
fm:=TForm2.Create(Application);
fm.ShowModal;
fm.Free;
close;
end;end.
unit Unit2;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form2: TForm2;implementation{$R *.DFM}procedure TForm2.Button1Click(Sender: TObject);
begin
close;
end;end.
begin
ModalResult:=mrCancel;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
fm:TForm2;
begin
fm:=TForm2.Create(Application);
if fm.ShowModal=mrCancel then
close;
end;
你必须换一种程序的思路,不要放到 OnActivate之中或者,你这样:
将代码放到一个button中(先别管他),然后在OnActivate中调用button的代码如何?
在执行ONACTIVATE事件时,modalform的消息循环还没有开始,
所以在此时执行close,它的效果等于让modalresult=mrcancel,
而modalform的消息循环开始前它会设置modalresult=0,也就使你前面的close白做了。showmodal源码摘要:
function TCustomForm.ShowModal: Integer;
var
...
...
begin
...
...
try
Show;
try
SendMessage(Handle, CM_ACTIVATE, 0, 0);///这里会执行OnActivate事件,close时ModalResult:=...;
ModalResult := 0;//清空了ModalResult
repeat
Application.HandleMessage;
if Application.FTerminate then ModalResult := mrCancel else
if ModalResult <> 0 then CloseModal;
until ModalResult <> 0;
Result := ModalResult;
SendMessage(Handle, CM_DEACTIVATE, 0, 0);
if GetActiveWindow <> Handle then ActiveWindow := 0;
finally
Hide;
end;
finally
....
....
end;
end;
如果一定要在showmodal的form的OnActivate事件内close这个form,可以这样做。(见unit2)//******************* Unit1 form1 *********************
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses
unit2;{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
begin
form2.ShowModal;
end;end.
//******************* Unit2 form2 *********************
unit Unit2;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;const
WM_CLOSEMODAL = WM_USER + 100;type
TForm2 = class(TForm)
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure WmCloseModal(var Message:TMessage);message WM_CLOSEMODAL;
public
{ Public declarations }
end;var
Form2: TForm2;implementationuses
Unit3;{$R *.DFM}procedure TForm2.WmCloseModal(var Message: TMessage);
begin
close;//在自定义消息中close
end;procedure TForm2.FormActivate(Sender: TObject);
begin
if mrok = Form3.ShowModal then
PostMessage(Handle,WM_CLOSEMODAL,0,0);//发一个自定义的消息,一定要用PostMessageend;procedure TForm2.Button1Click(Sender: TObject);
begin
close;
end;end.//******************* Unit3 form3 *********************
unit Unit3;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm3 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form3: TForm3;implementation{$R *.DFM}procedure TForm3.Button1Click(Sender: TObject);
begin
close;
ModalResult := mrok;
end;end.