У меня есть эта запись (кстати, это также может быть класс, но с записями этот код имеет больше смысла):
interface
type
TMyRecord = record
A: Integer;
constructor Initialize(V: Integer);
procedure InitOne;
end;
implementation
constructor TMyRecord.Initialize(V: Integer);
begin
A := V;
end;
(реализация метода InitOne пока опущена).
Насколько я знаю, конструкторы записей можно вызывать как в функциональной форме, например, в обычных конструкторах для классов, так и в процедурной форме, непосредственно в переменной записи (ссылка: Конструкторы записей в Delphi).
Учитывая это, этот код компилируется и работает как положено:
procedure DoSomething;
var
pMyRec: TMyRecord;
begin
pMyRec.Initialize(1); // constructor called in procedural form
pMyRec := TMyRecord.Initialize(1); // constructor called in functional form
end;
Хотя эта реализация InitOne не:
procedure TMyRecord.InitOne;
begin
Self.Initialize(1); // constructor called in procedural form <-- E2382
Self := TMyRecord.Initialize(1); // constructor called in functional form
end;
Почему? Разве Self.Initialize(1)
не должен быть идентичным pMyRec.Initialize(1)
, оба вызваны как процедура, действующая на его "экземпляр"?