Moin, ich hab da ein kleines Problemchen mit DFMs.
Bei einer Klasse TReader.ReadComponent/TWriter.WriteComponent speichert manchmal keine Events.
Delphi-Quellcode:
published
procedure miTestClick(Sender: TObject);
Beides sind normale Published-EventMethoden, aber Adresse-zu-Name wird nicht aufgelöst.
TObject.MethodName liefert einen Leerstring.
Rausgefunden hab ich jetzt, dass MethodAddress eine andere Adresse liefert, als die Code-Adresse in der EventVariable.
Mit einer "falschen" Adresse kann natürlich kein Name geliefert werden, aber die Adresse ist richtig, denn das Event kann ja aufgerufen werden. (Button.OnClick)
Und die betroffene Komponente liegt in einem anderem Laufzeitpackage.
Das Einzige, was ich mir da erklären könnte, dass dord die Code-Realocation vergessen wurde, aber eigenartig wäre dann, dass dieser "vermeintliche" Fehler dann seit Jahrzehnten noch keinem aufgefallen wäre.
> Delphi XE
Frame.miTest > $03CB27D0 | $10E3C590 $0DC43674 > ""
miTemplateClick > $0DC45930 | $0EBBB800 $0DC45930 > "miTemplateClick"
TestCode:
Delphi-Quellcode:
var X: TNotifyEvent;
X := Frame.miTestClick;
ShowMessage('Frame.miTestClick > ' + Format('$%p | $%p $%p > "%s"', [Frame.MethodAddress('miTestClick'),
TMethod(X).Data, TMethod(X).Code, Frame.MethodName(TMethod(X).Code)]));
X := Self.miTemplateClick;
ShowMessage('miTemplateClick > ' + Format('$%p | $%p $%p > "%s"', [Self.MethodAddress('miTemplateClick'),
TMethod(X).Data, TMethod(X).Code, Self.MethodName(TMethod(X).Code)]));