Home » Tipps & Tricks » Object Pascal » Arrays » Dynamisches Array speichern

Dynamisches Array speichern

Array speichern

Mit folgender Prozedur kann ein dynamisches Array gespeichert werden.Dabei ist zu beachten, dass alle Elemente des Arrays immer gleich viel Speicher belegen müssen – ein dynamischer String als Element kommt hier also nicht in Frage. Um aber eine Liste mit Strings auf diese Art zu speichern, muss die Größe von dem String konstant bleiben. Dies erreicht man mit den Datentyp ShortString: Seine Größe bleibt konstant und wird bei der Definition über eine in eckigen Klammern eingeschlossene Zahl hinter dem Schlüsselwort string angegeben.Diese Zahl stellt die Größe bzw. die Länge des Strings dar.So sieht die Definition eines dynamischen Arrays aus, wobei jedes Element ein 20 Zeichen langer ShortString ist:

type
  TArrayData = array of string[20];

Über diese Prozedur kann ein beliebiges dynamisches Array gespeichert werden, gegebenenfalls muss die Typ-Definition von TArrayData angepasst werden:

procedure SaveArray(const AFilename: string; const AArrayData: TArrayData);
var
  FStream: TFileStream;
  i: Integer;
begin
  FStream := TFileStream.Create(AFilename, fmCreate); //Öffnen des Streams (falls er noch nicht existiert, wird er neu erzeugt)
  try
    for i := 0 to High(AArrayData) do //Schreiben der Elemente aus dem Array in den Stream
      FStream.Write(AArrayData[i], SizeOf(AArrayData[i]));
  finally
    FStream.Free;
  end;
end;

Dabei wird jedes Element aus dem Array hintereinander in den Stream geschrieben.Beispiel-Aufruf zum Speichern eines dynamischen Arrays:

var
  ArrayData: TArrayData;
begin
  SetLength(ArrayData, 5); //Befüllen des Arrays mit Daten
  ArrayData[0] := 'Herr Meier';
  ArrayData[1] := 'Max Mustermann';
  ArrayData[2] := 'Lorem Ipsum';
  ArrayData[3] := 'dolor sit amet';
  ArrayData[4] := 'sed diam nonumy';
  SaveArray(ExtractFilePath(Application.ExeName) + 'test.dat', ArrayData); //Speichern des Arrays als "test.dat" im Verzeichnis der Exe-Datei
end;

Array laden

Mit dieser Prozedur kann ein gespeichertes dynamisches Array wieder geladen werden:

procedure LoadArray(const AFilename: string; var AArrayData: TArrayData);
var
  FStream: TFileStream;
  i: Integer;
begin
  FStream := TFileStream.Create(AFilename, fmOpenRead); //Öffnen des Streams zum Lesen
  try
    SetLength(AArrayData, FStream.Size div SizeOf(AArrayData[0])); //Setzen der Anzahl der Elemente im Array
    for i := 0 to High(AArrayData) do
      FStream.Read(AArrayData[i], SizeOf(AArrayData[i])); //Einlesen der Daten in das Array
  finally
    FStream.Free;
  end;
end;

Damit das Array geladen werden kann, muss zuerst ermittelt werden, wie viele Einträge das Array haben soll.Dann kann jedes Element aus dem Array direkt geladen werden.Beispiel-Aufruf zum Laden eines dynamischen Arrays:

var
  ArrayData: TArrayData;
begin
  LoadArray(ExtractFilePath(Application.ExeName) + 'test.dat', ArrayData); //Laden des Arrays aus der Datei "test.dat" 
im Verzeichnis der Exe-Datei
end;