Klar, im Prinzip gäbe es keinen Grund, warum der Record-Helper nicht an einen statischen Array-Typen dran geht.
Ein statisches Array ist Verwaltungstechnisch nichts anderes, wie ein Record,
und für native Typen oder dynamische Arrays funktioniert der Record-Helper jedenfalls auch.
Delphi-Quellcode:
type
TTest1 = Byte;
TTest2 = array[0..10] of Byte;
TTest3 = record x: array[0..10] of Byte end;
TTest4 = record x: TTest2 end;
TTest1Helper = record helper for TTest1 end; // RecordHelper für nativen Typen geht
TTest2Helper = record helper for TTest2 end; // [dcc32 Fehler] E2474 Record-Typ erforderlich
TTest3Helper = record helper for TTest3 end; // RecordHelper an Record geht natürlich
TTest4Helper = record helper for TTest4 end; // und hier ebenfalls
Notfalls kann der Compiler hier auch einfach implizit einen Records drumrum legen.
Über einen Cast in den Record verschieben, oder direkt als Array-Record deklarieren.
Delphi-Quellcode:
type
TTest = array[0..10] of Byte;
TTestX = record x: TTest end;
TTestHelper = record helper for TTestX
procedure DoWhatever;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
x: TTest;
begin
TTestX(x).DoWhatever;
end;
Aber dann braucht man den Helper nicht unbedingt und kann es auch direkt in den Record reintun.
Delphi-Quellcode:
type
TTest = array[0..10] of Byte;
TTestX = record
X: TTest
procedure DoWhatever;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
x: TTest;
begin
TTestX(x).DoWhatever;
end;
Nun nochmal mit implizitem Cast versucht, aber Delphi möchte nicht die möglichen Casts durchprobieren.
Delphi-Quellcode:
type
TTest = array[0..10] of Byte;
TTestI = record
X: TTest;
class operator Implicit(Source: TTest): TTestI;
procedure DoWhatever;
end;
class operator TTestI.Implicit(Source: TTest): TTestI;
begin
Result.X := Source;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
X: TTest;
begin
X.DoWhatever; // [dcc32 Fehler] E2018 Record, Objekt oder Klassentyp erforderlich
end;
Ein Array-Helper wäre was, für statische Arrays. (und auch für dynamische Arrays, notfalls ohne die Möglichkeit der Längenänderung, also behandelt wie statisch)
Delphi-Quellcode:
type
TTest = array[0..10] of Byte;
TTestHelper = array helper for Byte
procedure DoWhatever;
end;
Für dynamische Arrays geht es ja.
Delphi-Quellcode:
type
TTest = TArray<Byte>;
TTestHelper = record helper for Test
procedure DoWhatever;
end;
TTestHelper2 = record helper for TArray<Byte> // das geht zwar auch, aber die Klassenvervollständigung wunderschön ab
procedure DoWhatever; // Messagebox: END erwartet, aber '<' gefunden in Klasse TTestHelper2.
end;