dur*_*ara 16 windows delphi dialog z-order delphi-6
很多时候,在Windows 98时代之后,我们经历过一些对话框丢失了Z-Order并返回到之前的形式.
例如:
Dialog1.ShowModal;
Dialog1.OnClickButton() : ShowMessage('anything');
Run Code Online (Sandbox Code Playgroud)
当MessageBox出现时,它有时没有焦点,并在Dialog1下移动.用户对此感到困惑,他们说:我的申请冻结了!但是如果他们使用Alt + Tab移动到另一个应用程序并返回,焦点将返回到MessageBox,它将成为前景窗口.
我们通过ShowMessage,MessageBox,普通表单以及QuickReport表单体验过这一点.
有谁知道这个?这是一个Windows bug吗?你怎么能阻止它?怎么抓住这个?
谢谢你的帮助:dd
我真的说过,在Win98之后,所有操作系统(Win7也)都会受到这个问题的影响.我们使用Delphi 6 Prof,因此属性不能使用Default表单.
有人说使用MessageBox + MB_APPLMODAL可以控制消息对话框.这是个好消息,但我们有许多旧的表单和组件,第三方工具.
因此,通过替换表单来创建一个全新的应用程序是一项艰苦的工作.
但我们会尝试这样做.
我认为答案是这是半个应用程序问题和半个Windows问题.如果Windows有时会处理此问题,有时则不会 - 这似乎是一个Windows错误.但是,如果我们可以强制制作良好的模态窗口,那么它就是编程错误.
有人可以向我解释一下WS_POPUP标志的含义是什么?它有副作用吗?
谢谢:dd
Cra*_*ntz 16
这就是PopupMode和PopupParent属性的用途.
例如,你可以这样做:
Dialog1.PopupMode := pmExplicit;
Dialog1.PopupParent := self;
Dialog1.ShowModal;
Run Code Online (Sandbox Code Playgroud)
这告诉Windows正确的Z顺序.
War*_* P 6
对于旧版本的delphi(在Delphi 2007之前),在表单以外的表单上:
interface
TMyForm = Class(TForm)
protected
procedure CreateParams(var Para: TCreateParams); override;
end;
...
implementation
...
procedure TMyForm.CreateParams(var Para: TCreateParams);
begin
inherited;
Para.Style := Para.Style or WS_POPUP;
{ WinXP Window manager requires this for proper Z-Ordering }
// Para.WndParent:=GetActiveWindow;
Para.WndParent := Application.MainForm.Handle;
end;
Run Code Online (Sandbox Code Playgroud)
对于消息框,请在标志中包含MB_TOPMOST:
Application.MessageBox(PChar(amessage), PChar(atitle), otherflags or MB_TOPMOST);
Run Code Online (Sandbox Code Playgroud)