Hallo,
ich verstehe noch nicht, wieso das überhaupt gehen sollte. Für mich ist "konstant" und "dynamisch" ein Widerspruch.
Wenn es eine Konstante sein soll, dann kann man doch auch ein festes Arry machen - oder nicht?
Das Gegenteil von
konstant ist
variabel.
Das Gegenteil von
statisch ist
dynamisch.
Zumindest in dieser Konstellation, und es ist wichtig, dass du genau darauf achtest. Es gibt folgende Konstellationen:
- statische Array-Konstanten: const A: array [0..1] of Byte = (-128, 127)
- dynamische Array-Konstanten: const A: array of Byte = [-128, 127]
- statische Array-Variablen: var A: array [0..1] of Byte
- dynamische Array-Variablen: var A: array of Byte
Der einzige Unterschied für den Programmierer ist, dass du bei dynamischen Arrays keine Länge angeben brauchst, sondern diese automatisch gesetzt wird (damals brauchte man
SetLength
, das geht heute aber auch ohne):
Delphi-Quellcode:
var
A: array of Byte;
begin
// früher:
// SetLength(A, 2);
// A[0] := -128;
// A[1] := 127;
// oder, falls man einen Typen hatte:
// A := TBytes.Create(-128, 127);
// Braucht man heute alles nicht mehr, einfach:
A := [-128, 127];
end;
Genau das gleiche trifft auch auf die Konstanten zu: Hier ist der einzige Unterschied, dass du keine explizite Längenangabe in der Deklaration mehr brauchst.*
*) Und noch ein paar Unterschiede in der Speicherverwaltung, aber die sind jetzt mal egal.
Hinzu kommt noch ein Sonderfall:
Dynamische Array-Inline-Konstanten. Darauf wollte ich jetzt eigentlich nicht eingehen, aber weil es anscheinend doch noch zu einer belebten Diskussion gekommen ist, hier mal ein Lösungsansatz:
Delphi-Quellcode:
type
TKameraTypRec = record
Name: string;
Breite: Integer;
Hoehe: Integer;
PixelSizeX: Extended;
PixelSizeY: Extended;
// Implementierung der Factory-Methode dürfte selbsterklärend sein:
class function Create(const AName: String; const ABreite, AHoehe: Integer; const APixelsSizeX, APixelsSizeY: Extended): TKameraTypRec; static;
// Du kannst natürlich stattdessen auch eine globale Routine nehmen, ist ja das selbe wie eine statische Klassenfunktion
end;
begin
const CAM_TYPES: TKameraTypArr {Typen könntest du dank Inferenz sogar weglassen, lol} = [
TKameraTypRec.Create('GT1920', 1920, 1080, 0.00000586, 0.00000586)
];
// ...
end.
So geht das theoretisch. Ob es jetzt geiler ist als da eben eine Länge vor zu schreiben muss jeder für sich selbst entscheiden.