Dynamische Arrays

Wenn man sich eine Datenbank anlegt, dann möchte man mehr als sich nur die Daten anschauen und wieder abspeichern. Daten müssen hinzugefügt, gelöscht und editiert werden. Oft ist es auch sinnvoll, die Daten nach bestimmten Kriterien zu filtern oder zu sortieren. Diese Operationen auf der Festplatte auszuführen, wäre eine ziemlich mühsame und langwierige Angelegenheit.  Deswegen hält man sich i.a. eine aktuelle Kopie der Datenbank im Speicher des Rechners und bemüht die Festplatte nur zum Sichern der Daten.

Dazu benötigt man allerdings einen entsprechenden Behälter. Arrays hatten - wie besprochen - bislang einen schwerwiegenden Nachteil: Man musste sich für eine feste Länge des Arrays während der Entwicklungszeit entscheiden. Diese  Länge konnte während der Laufzeit nicht mehr geändert werden. Inzwischen gibt es bei Delphi allerdings sogenannte dynamische Arrays, deren Länge während der Laufzeit (dynamisch) durch die Anweisung SetLength(MeineDatei,10) vergrößert werden kann, wenn man einen Datensatz hinzufügen möchte. Dazu definiert man sich zunächst seinen Datensatz-Typ wie gehabt:

type
TDatensatz = record
               name, vorname : string;
               alter : integer;
             end;

var
  MeineDatei : array of TDAtensatz
 ;

Im Gegensatz zu den bisherigen Array-Deklarationen gibt man keine Dimension (also z.B. otto : array[1..10] of TDatensatz) an. Die Funktion Length(MeineDatei) gibt die Anzahl der zur Verfügung stehenden Felder an. Das erste Feld wird mit MeineDatei[0] adressiert. Ist das Array mit den bisherigen Einträgen gefüllt, so muss man mitr der Anweisung SetLength(MeineDatei, Length(MeineDatei)+1) ein zusätzliches Feld für den neuen Eintrag schaffen. Der Speicherplatz für diesen neuen Eintrag wird dann (dynamisch) erzeugt. Um eine Datei von der Festplatte in dieses dynamische Array zu laden, wären folgende Anweisungen notwendig:

procedure TForm1.LadenBtnClick(Sender: TObject);
var ds : TDatensatz;
begin
z := 1;  // z ist der globale Datensatzzähler
SetLength(DatenArray,z);
Assignfile(datei,'otto.db');
reset(datei);
while not eof(datei) do begin
read(datei,ds);
  DatenArray[z-1] := ds;  //erster Eintrag:DatenArray[0]
  inc(z);
  SetLength(DatenArray,z);
end;
CloseFile(datei);
end;

Man erhält dadurch eine Kopie der Datenbank im Hintergrund, an der man bestimmte Manipulationen vornehmen kann, wie z.B. Sortieren und Filtern. In der Anzeige erscheint nur die gewünschte 'Sicht' der Datei. Die Hintergrundkopie sollte durch die Manipulationen nicht beeinflusst werden.

Will man z.B. nur die Datensätze anzeigen für die gilt DatenSatz.alter > 12 , so schreibt man nur diejenigen Datensätze in das Ausgabefenster, die dieser Filterbedingung genügen:

 

procedure TForm1.Filter1BtnClick(Sender: TObject);
var n,zz : integer;
ds : TDatenSatz;
begin
  zz := 1;
  for n := 0 to Length(DatenArray)-2 do begin
    ds := DatenArray[n];
    if ds.Alter > 20 then begin
      StringGrid1.Cells[0,zz] := ds.name ;
      StringGrid1.Cells[1,zz] := ds.vorname;
      StringGrid1.Cells[2,zz] := IntToStr(ds.alter) ;
      inc(zz);
    end;
  end;
end;

 

Im Programm datei1.pas ist das Laden der Datei in das dynamische Array implementiert. Als Aufgabe sollten verschiedene Filterbedingungen (auch logische Verknüpfungen von Filterbedingungen wie z.B. Alter <12 and Anfangsbuchstabe ='M' ) implementiert werden.

Zurück zu Delphi

© Dietrich Praclik