Cast static array zum Öffnen eines Arrays mit unterschiedlichem Elementtyp

8

(Ich habe dies bereits bei CodeReview gefragt , wo es als Off-Thema geschlossen wurde. Hoffentlich ist es ein Thema hier.)

Ich habe statische Arrays eines abgeleiteten Typs (wie LabelsA: array[0..3] of TLabel; im folgenden Beispielcode) und eine Routine, die ein offenes Array des Basistyps akzeptiert (wie procedure DoSomethingWithControls(const AControls: array of TControl); ), und ich möchte DoSomethingWithControls mit aufrufen diese statischen Arrays. Bitte sehen Sie mein Beispiel:

%Vor%

Es gibt einige mögliche Varianten zum Aufruf von DoSomethingWithControls :

  • Variante 1 ist ziemlich einfach, benötigt aber einen "Adapter" -Typ wie TArray1 für jede Größe des TLabel-Arrays. Ich möchte, dass es flexibler ist.

  • Variante 2 ist flexibler und einheitlicher, aber hässlich und fehleranfällig.

  • Variante 3 (mit freundlicher Genehmigung von TOndrej ) ist ähnlich Variante 1 - es benötigt keine explizite Besetzung, aber Variante 1 bietet eine ein bisschen mehr Compiler-Sicherheit, wenn Sie etwas durcheinander bringen (z.B. Beim Kopieren und Einfügen die Array-Grenzen falsch setzen.

Irgendwelche Ideen, wie ich diese Aufrufe ohne diese Nachteile formulieren kann (ohne die Elementtypen der Arrays zu ändern)? Es sollte mit D2007 und XE6 funktionieren.

    
Uli Gerhardt 22.07.2015, 07:59
quelle

5 Antworten

3

Diese Abgüsse sind alle ziemlich hässlich. Sie werden alle funktionieren, aber wenn du sie benutzt, fühlst du dich schmutzig. Es ist durchaus sinnvoll, eine Hilfsfunktion zu verwenden:

%Vor%

Und dann rufst du deine Funktion so auf:

%Vor%

Natürlich wäre das so viel sauberer, wenn Sie Generika verwenden könnten.

    
David Heffernan 22.07.2015, 10:48
quelle
1

Auch nicht sehr schön, aber Sie könnten den Compiler so austricksen:

%Vor%     
Ondrej Kelle 22.07.2015 08:22
quelle
1

Deklarieren Sie eine überladene Prozedur:

%Vor%

Dies ist eine allgemeine Lösung für Ihre Variante2. Eine Deklaration für alle Fälle, also weniger fehleranfällig.

    
LU RD 22.07.2015 18:30
quelle
1

Das folgende Beispiel basiert darauf, wie offene Array-Parameter intern implementiert werden. Es funktioniert jedoch nicht mit "typed @ operator".

%Vor%

Die Übergabe von High(Labels) für HighBound ist vielleicht besser, solange alle statischen Arrays auf 0 basieren.

    
Sertac Akyuz 22.07.2015 18:49
quelle
0

Da ein dynamisches Array als offenes Array in die Methode übergeben werden kann, besteht die Option darin, das statische Array in ein dynamisches Array zu konvertieren.

Wenn Ihnen der Aufwand beim Kopieren des Arrays nichts ausmacht, beachten Sie Folgendes:

Schreiben Sie eine Funktion, um ein offenes Array von Labels in ein dynamisches TControlArray-Array zu konvertieren.

%Vor%

Nun kann Variante 4 wie folgt geschrieben werden:

%Vor%

Testfälle:

%Vor%     
Craig Young 22.07.2015 11:08
quelle