Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.034 Beiträge
 
Delphi 12 Athens
 
#3

AW: Record helper für statische Arrays

  Alt 5. Mär 2020, 14:56
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Mär 2020 um 15:12 Uhr)
  Mit Zitat antworten Zitat