Hallo zusammen,
ich kämpfe schon seit ein paar Stunden mit einem eigenartigen Fehler, der vom Delphi-Compilers geworfen wird. Der Fehler kommt sowohl in Delphi 10 als auch 11. Ich habe den Code mal soweit reduziert wie irgend möglich um den Fehler zu reproduzieren:
Delphi-Quellcode:
program RecTest;
uses
System.SysUtils,
System.Variants;
type
TMyClass = class
public type
TRec = record
class operator Initialize(out Dest: TRec);
end;
private
FRecs: TArray<TMyClass.TRec>;
public
procedure DoSomething;
end;
class operator TMyClass.TRec.Initialize(out Dest: TRec);
begin
end;
procedure TMyClass.DoSomething;
procedure PerformRec(ARec: TRec);
begin
end;
var
V: Variant;
begin
V.A.B := 5;
for var Rec in FRecs do
PerformRec(Rec);
end;
var
MyClass: TMyClass;
begin
MyClass := TMyClass.Create;
try
MyClass.DoSomething;
finally
MyClass.Free;
end;
end.
Die Fehlermeldung lautet "[dcc32 Error] RecTest.dpr(34): E2010 Incompatible types: 'TVarData' and 'Pointer'" und wird immer beim "end" von "DoSomething" ausgegeben, uanabhängig was noch an Code in der Methode ist. Das "AVariant.A.B" ist im echten Programm z.B. ein Range-Object aus Excel. Sieht z.B. so aus:
AExcel.Range(2, Line, 3, Line).Borders[xlEdgeBottom].LineStyle := xlContinuous;
Ändere ich den Quelltext wie folgt, dann funktioniert es und es kommt keine Fehlermeldung:
Delphi-Quellcode:
procedure TMyClass.DoSomething;
type
PRec = ^TRec;
procedure PerformRec(ARecPtr: PRec);
begin
end;
var
V: Variant;
begin
V.A.B := 5;
for var Rec in FRecs do
PerformRec(@Rec);
end;
Auch wenn ich die Initialisierung aus TRec nehme kommt kein Fehler:
Delphi-Quellcode:
type
TMyClass = class
public type
TRec = record
end;
private
FRecs: TArray<TMyClass.TRec>;
public
procedure DoSomething;
end;
Scheint also auch irgendwas mit managed Records zu tun zu haben.
Hat irgendwer eine Idee was das sein kann? Der Fehler wird sowohl vom Comiler als auch vom LSP angezeigt.
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)