(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:
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.
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.
Auch nicht sehr schön, aber Sie könnten den Compiler so austricksen:
%Vor%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.
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%Tags und Links arrays delphi casting open-array-parameters