Delphi messagebox appearing behind other form
Asked Answered
S

3

9

I am using the code below to create a messagebox in Delphi 7. However I also have another form on screen who's FormStyle is set to fsStayOnTop and the messagebox appears behind this form.

Is there any way to force the messagebox to appear in front?

    if Application.MessageBox('Amessage here','Title', +MB_APPLMODAL + MB_ICONQUESTION + MB_YESNO) = IDNO then
Slog answered 4/11, 2011 at 9:55 Comment(2)
Related: #2997579Regurgitation
Avoid using Application.MessageBox. Instead use WinAPI MessageBox function and pass it a HWND of your topmost form. Additionally, you can use MB_TASKMODAL flag to make sure the dialog will popup on top of every other form.Little
B
8

Call NormalizeTopMosts prior to showing the message box.

Use NormalizeTopMosts to allow a message box or dialog box that is displayed using the Windows API functions (such as MessageBox and MessageDlg) directly, appear on top of a topmost form. Otherwise the topmost form remains on top, and may obscure the message box.

(Hope it's available in Delphi 7.)

Edit: Not sure about the downvote. If it hints in the direction that OP should use the native MessageBox function and set its parent HWND to the topmost window - I would agree. But maybe this is not possible for some reason.

Basrhin answered 4/11, 2011 at 10:24 Comment(3)
Hmm. There are downvotes on all 3 answers so far, with no explanation/justification. Not sure what's up with that. SO doesn't have a "hit-and-run" badge.Scyphus
Without a hint these downvotes are so pointless. +1 for the badge :)Basrhin
I'm not seeing down votes, however as indicated, it may have been because the question specifically asks about using application.messagebox - there is a lot of code in that method before the windows.messagebox is called - mostly dealing with multiple monitors and task windows. Replacing the current call as specified in the question may cause undesirable results in the environment.Jovian
N
2

In Windows.pas you can find more flags to MessageBox():

MB_APPLMODAL = $00000000;
MB_SYSTEMMODAL = $00001000;
MB_TASKMODAL = $00002000;

Read about them in MessageBox documentation

You can even use MB_TOPMOST flag.

Nelsonnema answered 4/11, 2011 at 10:6 Comment(0)
A
0

Try MB_TASKMODAL flag instead of MB_APPLMODAL.

Ayn answered 4/11, 2011 at 10:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.