КМК, MessageLoop работает на более низком уровне, принимая все оконные сообщения (типа кликанья мыши, нажатия клавиш и пр.), а OnEvent - это стандартные события (которые построены на обработке всё тех же сообщений системы), т.е. грубо говоря более удобные оболочки. Вот пример из mianform:
function THIMainForm._onMessage;
var
sControl: PControl;
i: integer;
// acc: boolean;
begin
Result := false;
if (Msg.message = WM_INNERMESSAGE) and not isMain and
(_prop_FormFastening <> nil){ and isWindowVisible(Control.Handle)} then
begin
sControl := _prop_FormFastening.ctrlpoint;
MoveWindow(Control.Handle, sControl.Left + _prop_ShiftLeft, sControl.Top + _prop_ShiftTop,
Control.Width, Control.Height, true);
end
else
case Msg.message of
WM_ERASEBKGND:
if not Bitmap.Empty then begin
Result := true;
Rslt := 1;
end;
WM_ACTIVATE:
if Msg.WParam > 0 then _hi_OnEvent(_event_onActivate)
else if Msg.WParam = 0 then _hi_OnEvent(_event_onDeActivate);
WM_CLOSE: Result := _onClose(Control,(Msg.lParam=0));
WM_SIZE:
begin
if isMain and Assigned(Applet) then Applet.Width := Control.Width;
if _prop_Name <> '' then
for i := 0 to FormList.Count - 1 do
PostMessage(FormList.Objects[i], WM_INNERMESSAGE, 0, 0);
end;
WM_MOVE:
begin
if isMain and Assigned(Applet) then
Applet.SetPosition(Control.Left,Control.Top);
// if _prop_Name <> '' then
for i := 0 to FormList.Count - 1 do
PostMessage(FormList.Objects[i], WM_INNERMESSAGE, 0, 0);
_hi_OnEvent(_event_onMove);
end;
end;
Result := Result or inherited _onMessage(Msg,Rslt);
end;
Тут, например, отлавливаем WM_CLOSE. А вместо этого можно было написать:
Applet.OnClose := onCloseApp;
В HiAsm используется и так и так. Просто не на все сообщения есть события, иногда приходится (или удобнее) использовать сообщения.
Вроде так.