Messages werden in die Message-Queue eingetragen
und die Message-Loop in Application.Run, bzw. Application.ProcessMessages fragen nur über die
Ansi-APIs die Message-Queue ab und leiten dann diese Messages als "
ANSI" an die Komponenten weiter.
Delphi 7 hat eine reine
Ansi-MessageLoop, wärend in Turbo Delphi für
Unicode-Messages auf die
Unicode-
API umgeschaltet wird.
Delphi-Quellcode:
// Delphi 7-MessageLoop
function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
Handled: Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
Result := True;
if Msg.Message <> WM_QUIT then
begin
Handled := False;
if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end
else
FTerminate := True;
end;
end;
Delphi-Quellcode:
// Turbo Delphi-, bzw. Delphi 2006-MessageLoop
function TApplication.ProcessMessage(
var Msg: TMsg): Boolean;
var
Unicode: Boolean;
Handled: Boolean;
MsgExists: Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE)
then
begin
Unicode := (Msg.hwnd <> 0)
and IsWindowUnicode(Msg.hwnd);
if Unicode then
MsgExists := PeekMessageW(Msg, 0, 0, 0, PM_REMOVE)
else
MsgExists := PeekMessage(Msg, 0, 0, 0, PM_REMOVE);
if not MsgExists
then Exit;
Result := True;
if Msg.
Message <> WM_QUIT
then
begin
Handled := False;
if Assigned(FOnMessage)
then FOnMessage(Msg, Handled);
if not IsPreProcessMessage(Msg)
and not IsHintMsg(Msg)
and
not Handled
and not IsMDIMsg(Msg)
and
not IsKeyMsg(Msg)
and not IsDlgMsg(Msg)
then
begin
TranslateMessage(Msg);
if Unicode then
DispatchMessageW(Msg)
else
DispatchMessage(Msg);
end;
end
else
FTerminate := True;
end;
end;
Schon erstaunlich wann man bei Codegear anfing sich für's
Unicode vorzubereiten, wärend Einige jetzt erst rumheulen, wegen D2009+