Поскольку ваше Field2 является указателем на метод, вы должны использовать это:
Этот код
type
RRecord = record
Field1: Integer;
Field2: procedure (Sender: TObject) of object;
Field3: Integer;
end;
var
rec: RRecord;
begin
Memo1.Lines.Add(Format('@rec.Field1 %d', [Integer(@rec.Field1)]));
Memo1.Lines.Add(Format('@rec.Field2 %d', [Integer(@rec.Field2)]));
Memo1.Lines.Add(Format('@TMethod(rec.Field2).Code %d', [Integer(@TMethod(rec.Field2).Code)]));
Memo1.Lines.Add(Format('@TMethod(rec.Field2).Data %d', [Integer(@TMethod(rec.Field2).Data)]));
Memo1.Lines.Add(Format('@rec.Field3 %d', [Integer(@rec.Field3)]));
end;
, помещенный в OnCreate формы с памяткой, выдает:
@rec.Field1 1244820
@rec.Field2 4052
@TMethod(rec.Field2).Code 1244828
@TMethod(rec.Field2).Data 1244832
@rec.Field3 1244836
Вторая строка показывает случайное значение, так как ничего не было назначено локальной переменной записи. Третья и четвертая строки показывают адреса членов TMethod.
Обратите внимание, что запись (возможно) заполняется из-за того, что методы, кажется, всегда выровнены на 8 байт. (По крайней мере, в D2009 / D2010).