AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Record helper für statische Arrays

Ein Thema von Dennis07 · begonnen am 5. Mär 2020 · letzter Beitrag vom 5. Nov 2022
 
Benutzerbild von himitsu
himitsu

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

AW: Record helper für statische Arrays

  Alt 5. Mär 2020, 13: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;
Ein Therapeut entspricht 1024 Gigapeut.

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz