Delphi编的程序的第一个 Message 窗口不能 TOPMOST 或 SYSTEMMODAL 吗?(50分)

  • 主题发起人 主题发起人 wddelphi
  • 开始时间 开始时间
W

wddelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序在执行时先连数据库,如果连不上,则给个消息框提示“不能连接数据库”,然后
自动建DSN,建成功后,再给个消息提示“数据源成功建立”,然后再连,所以,
我用Application.MessageBox('','消息',MB_TOPMOST)语句给提示,希望提示窗总在最顶
端提示,醒目,但是,没有用,我又用了MB_SYSTEMMODAL参数,还是不行,但是发现,第二
个消息框却可以保持在顶端,这是为什么?难道Delphi编的程序的第一个 Message 窗口不能
TOPMOST 或 SYSTEMMODAL 吗?

下面这个例子可以演示:

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.MessageBox('1','消息',MB_TOPMOST);
Application.MessageBox('2','消息',MB_TOPMOST);
end;

你会发现,在FormCreate中,第一个消息框是会被其它窗口遮盖掉的,但第二个消息框却
不会被其它窗体遮盖住,(在DataModule的Create事件中也是),但
Application.MessageBox('1','消息',MB_TOPMOST);在Create事件后的其它事件或其它控件
的事件中使用是能保持在顶端的,为什么?

我需要让程序的第一个消息框 TOPMOST 或 SYSTEMMODAL ,能做到吗?该怎么做?

多谢!
 
MessageBox(GetActiveWindow(),'消息','标题',MB_OK);
 
我想你大概没有自己试过你给出的代码吧,没有用的。

我看过TApplication.MessageBox的源码,它最终当然也是调用Windows.MessageBox的,
其中也调用了Windows.SetWindowPos,但在这个函数中MB_SYSTEMMODAL、MB_TOPMOST对
程序的第一个MessageBox好像最终也没有起什么用!
 
我很菜!不太明白你的意思。
我试过你的代码就是两个提示信息,没什么特殊。
你是想通过提示框控制什么呢?
 
唉,我以为我已经说得很明白了,这么说吧,你打开一个窗口,比如“资源管理器”,把
它最大化,然后在你的程序的mainform的create事件中写以下代码:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.MessageBox('1','消息',MB_TOPMOST);
Application.MessageBox('2','消息',MB_TOPMOST);
end;
运行,当第一个消息框出现时,你把窗口切换到刚才最大化的“资源管理器”(任何方
法,alt+tab、mouse_click),你是否发现最大化的“资源管理器”窗口把你的消息框
遮盖掉了,而第二个消息框出现时,任你切换到其他什么窗口,消息框2始终显示在所有
窗口的最上方。

这就是我的问题,我不希望我程序的消息框被其它窗口遮蔽掉,事实上基本上也是可以
做到的,唯独在mainform的create事件中创建的第一个消息框做不到,而这个消息框对
程序而言是比较重要的,因为它往往要提示些重要信息,如果被遮蔽掉了,用户会以为
程序没有被执行而产生误解,请各位大侠帮帮忙吧!
 
不知是这个问题太难了,还是这根本就是delphi的bug,抑或是没有人肯帮我?
 
procedure TForm1.FormCreate(Sender: TObject);
begin
MessageBox(handle,'1','消息',MB_TOPMOST);
Application.MessageBox('2','消息',MB_TOPMOST);
end;
 
xiao_min,非常感谢你的帮助,little_five_gqw,你的回答方向也是对的,只是我没有好好
区分Application.handle和self.handle的区别。

再次谢谢二位了!
 
后退
顶部