![]() |
Delphi-Version: 10.2 Tokyo
Record helper für statische Arrays
Hallo Leute,
ich wollt mal fragen ob euch ein triftiger Grund einfällt, wieso ich für statische Arrays keine Helperklassen definieren kann. Das geht ja sowohl bei dynamischen Arrays als auch bei Records und sogar bei kurzen Strings! Mir fällt beim besten Willen kein Grund ein, warum das nicht auch bei statischen Arrays demnach gehen sollte. Ist es einfach nur ein Compiler-Bug, oder spricht da eures Wissens nach irgendetwas gegen? Danke! |
AW: Record helper für statische Arrays
Der Grund dass es nicht geht liegt wohl daran, dass es nicht implementiert ist und das vielleicht weil bislang keiner einen Grund fand das zu wollen. Wozu brauchst du das denn?
|
AW: Record helper für statische Arrays
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:
Notfalls kann der Compiler hier auch einfach implizit einen Records drumrum legen.
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 Über einen Cast in den Record verschieben, oder direkt als Array-Record deklarieren.
Delphi-Quellcode:
Aber dann braucht man den Helper nicht unbedingt und kann es auch direkt in den Record reintun.
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;
Delphi-Quellcode:
Nun nochmal mit implizitem Cast versucht, aber Delphi möchte nicht die möglichen Casts durchprobieren.
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;
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:
Für dynamische Arrays geht es ja.
type
TTest = array[0..10] of Byte; TTestHelper = array helper for Byte procedure DoWhatever; end;
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; |
AW: Record helper für statische Arrays
Zunächst einmal danke für die Antworten.
Zitat:
Zitat:
Zitat:
Trotzdem Danke für den gut formulierten Hinweis. ;-) |
AW: Record helper für statische Arrays
"Zumal der Mehraufwand hier wohl wirklich minimal gewesen wäre" - das sagen meine Kunden auch immer :wink:
Ich kann mir vorstellen dass es doch etwas mehr Aufwand ist. Ein record hat per see schon mehrere unterschiedliche Elemente, da noch etwas hinzufügen ist einfacher als bei etwas, das nur aus lauter gleichen Elementen besteht. Aber das ist nur eine Vermutung, ich kenne die Internas nicht. "Naja, wozu mal Helper nunmal "braucht". Als Erweiterung für Typen, die man nicht ableiten will oder kann." - zu kann fallen mir alle Typen aus der RTL, VCL u.a. ein. Statische arrays sind mit da noch nicht untergekommen. Selber haben wir öffentliche statische arrays nur bei Vektoren und Matrizen. Das gilt bei uns auch schon veraltet, man sollte den Record nehmen der das kapselt. So hat das ja auch himitsu vorgeschlagen. In anderen Fällen würde ich eh immer eine Klasse drum rum bauen. |
AW: Record helper für statische Arrays
Zitat:
Wobei es so bei statischen Arrays und Records davon abhängt, was für Typen drin sind. Strings und Interfaces und schon werden dieses Records/Arrays auch initialisiert und finalisiert (bzw. sie müssen es, sonst Preng und/oder Speicherlecks) @freimats: Delphi verwaltet Records wie ein Array mit der Länge 1 (entsprechend
Delphi-Quellcode:
bzw.
array of record
Delphi-Quellcode:
),
array[...] of record
was man in der System.pas gern seinen Augen antun kann. |
AW: Record helper für statische Arrays
Zitat:
Zitat:
Zitat:
|
AW: Record helper für statische Arrays
Vererbung gibt es bei Helpern.
Zum Glück, denn sonst wären Helper zu nichts zu gebrauchen, wenn man selber Typen erweitern will und dann mit den vordefinierten Helpern kollidiert. Ich hoffe aber noch, dass der Entwickler irgendwann mal den gravierenden Bug behebt, wonach immer nur der letzte Helper nutzbar ist, denn Helper aus Fremdkomponenten können nicht voneinander erben, vor allem nicht firemübergreifend. |
AW: Record helper für statische Arrays
Zitat:
|
AW: Record helper für statische Arrays
Na das ist dann ja richtig doof.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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