TApplication.MessageBox - это оболочка для функции WinAPI MessageBox . Код первого показывает, как он называется:
function TApplication.MessageBox(const Text, Caption: PChar; Flags: Longint): Integer;
var
ActiveWindow, TaskActiveWindow: HWnd;
MBMonitor, AppMonitor: HMonitor;
MonInfo: TMonitorInfo;
Rect: TRect;
FocusState: TFocusState;
WindowList: TTaskWindowList;
begin
ActiveWindow := ActiveFormHandle;
if ActiveWindow = 0 then
TaskActiveWindow := Handle
else
TaskActiveWindow := ActiveWindow;
{ ... }
try
Result := Winapi.Windows.MessageBox(TaskActiveWindow, Text, Caption, Flags);
finally
Обратите внимание, что HWND, переданный на вызов WinAPI, равен TaskActiveWindow
, который принимается как активное окно во время вызова (если только его нет, и в этом случае вместо него используется дескриптор приложения). Поскольку вы только что создали свой TFrmSpla sh, он будет активным окном, и окно сообщения будет удалено, когда его родитель (окно spla sh) будет закрыт.
Когда вы просто вызываете MessageBox напрямую:
MessageBox(Handle, 'Hi', nil, MB_OK); // This remains on screen
Вы передаете Handle
, который неявно является дескриптором формы, из которой вы вызываете код, в данном случае ваш TMainForm
, поэтому основная форма становится владельцем в этом случае и не имеет отношения к экрану spla sh.