Ich verstehe die Implementation von TObject.Dispatch(var Message)
zwar nicht im Geringsten (so viel Assembler)
Die habe ich mir auch vor kurzem zu Gemüte geführt.
Delphi-Quellcode:
procedure TObject.Dispatch(var Message);
type
THandlerProc = procedure(var Message) of object;
var
MsgID: Word;
Addr: Pointer;
M: THandlerProc;
begin
MsgID := TDispatchMessage(Message).MsgID;
if (MsgID <> 0) and (MsgID < $C000) then
begin
Addr := GetDynaMethod(PPointer(Self)^, MsgID);
if Addr <> nil then
begin
TMethod(M).Data := Self;
TMethod(M).Code := Addr;
M(Message);
end
else
Self.DefaultHandler(Message);
end
else
Self.DefaultHandler(Message);
end;
Im Prinzip holt er sich mit GetDynaMethod nur per
RTTI(?) die Adresse der Funktion, welche mit einem MESSAGE Keyword und der entsprechenden MessageId getaggt ist und ruft diese dann im Kontext der aktuellen Instanz auf.
Warum die Nachricht nicht größer als $C000 sein darf, verstehe ich allerdings nicht.