Einzelnen Beitrag anzeigen

Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
496 Beiträge
 
Delphi 12 Athens
 
#5

AW: Konstantes Array of Record deklarieren

  Alt 10. Jul 2025, 12:24
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.
Dennis
  Mit Zitat antworten Zitat