ShowModal窗体的ModalResult问题。(200分)

  • 主题发起人 主题发起人 雁孤行
  • 开始时间 开始时间

雁孤行

Unregistered / Unconfirmed
GUEST, unregistred user!
点击ShowModal状态窗体上ModalResult<>mrNone的Button时,如何使该窗体不关闭。
 
button不设置resultmodal就行了
 
那我还用问!问题是我现在需要设ModalResult。
 
当你以 ShowModal 方式显示一个窗体时!ResultModal 的属性值为 0,就是 mrNone,
一旦你对 ResultModal 进行付值,窗体就会关闭!
 
我想知道当ModalResult<>mrNone时,是否有办法不让窗体关闭。
 
TForm1.FormCloseQuery(Sender: TObject
var CanClose: Boolean);
begin
canclose:=not(ModalResult<>mrNone);
ModalResult:=mrnone;//可以用其他类型按钮关闭或系统按钮
end;
 
不知道你要实现怎样的功能,你不想让它关闭是想得到这个窗体上的参数吧,你可以在
这里处理:
if form1.showmodal=mryes then
begin
form1......
end;
form1.free;
还有如果有个按钮的default属性为真的话是要关闭的。
 
gz to 南宫吹云
 
本身ModalResult不等于mrNone就会被关闭,你只要自己拦载ModalResult值,然后跟据你的设
定再设定ModalResult为mrNone或其它值,使其符合你的要求.在被SHOWMODAL的那个表单中处
理.实际上楼上的ugvanxk已经说到点上了.
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCloseQuery(Sender: TObject
var CanClose: Boolean);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
bOK:Boolean;
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCloseQuery(Sender: TObject
var CanClose: Boolean);
begin
{ if bOK then CanClose:=True
else canClose:=False;}//两种方法,改变CanClose,或ModalResult
if bOK then
ModalResult:=mrOK
else ModalResult:=mrNone;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
Close;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
bOK:=True;
end;

end.
FORM1调用.
procedure TForm1.Button1Click(Sender: TObject);
begin
try
form2:=TForm2.Create(Application);
form2.ShowModal;
finally
form2.free;
end;
end;


再看CustomForm中的源代码ShowModal部分
try
Show;
try
SendMessage(Handle, CM_ACTIVATE, 0, 0);
ModalResult := 0;
repeat
Application.HandleMessage;
if Application.FTerminate then ModalResult := mrCancel else
if ModalResult <> 0 then CloseModal;//看这儿,是一个循环,ModalResult不等于0就关闭
until ModalResult <> 0;
Result := ModalResult;
SendMessage(Handle, CM_DEACTIVATE, 0, 0);
if GetActiveWindow <> Handle then ActiveWindow := 0;
finally
Hide;
end;
 
button不设置resultmodal
在点击的代码最后发送消息,带参数就行了。
 
别老是去设置参数,自己写代码吧,这样灵活哦
 
改用别的Button关闭,:)
 
Button的ModalResult=mrNone
通过消息处理,另一Button负责关闭窗体。
//=============================================
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
WM_MYMSG = WM_USER + 1;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure WMMYMSG(var Msg : TMessage);message WM_MYMSG;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses unit2;
procedure TForm1.WMMYMSG(var Msg : TMessage);//message WM_MYMSG;
begin
showmessage('在这里加入点击后所要做的事');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
frm : TForm2;
begin
frm := TForm2.Create(self);
frm.ShowModal;
end;
end.
//======================================================
unit Unit2;
interface
uses
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;
implementation
{$R *.dfm}
uses unit1;
procedure TForm2.Button1Click(Sender: TObject);
begin
sendmessage(form1.Handle,WM_MYMSG,0,0);
end;
end.
 
试过 Abort 没有?
 
没有道理啊,你这么做是如何目的?
如果你想处理或者自己用这个变量,完全可以设置成 mrnone ,
然后修改自己的变量。

想在其他单元也可以用可以在public里设置变量。
没有必要去修改人家的设计啊,设计成这个样子就是为了这样的效果,你有别的用途,
就声明自己的东西。
 
在你设了ModalResult的Button的OnClick事件里
第一行就写
ModalResult := mrNone;
就可以不关闭了。
 
应该不复杂吧,自己做个form的私有变量,在formonclose里传给ModalResult就成了
 
拦截消息
不过就更麻烦了
 
两个办法:
1、FormCloseQuery中把CanClose设为False。
2、FormClose中把Action设为caNone。
 
CLOSEQUEYR
中设置CANCLOSE := FALSE
 
后退
顶部