OSZ Handel I
Informatik
Anwalt 2004 - Version 3.0
    Persistenz

S. Spolwig
J. Penon

[Home | Wirtschaftsgymnasium | Informatik | Unterrichtsmaterialien | Seitenende]

Laden und Speichern der Objekte aus der Mandantenliste

Es gibt sehr unterschiedliche Verfahren, um Daten auf ein Speichermedium zu schreiben. Es wird eine OOP-gerechte Methode verwendet, bei der die Objekte selbst wissen, wie sie sich in einen Filestream schreiben und ihn lesen. Dabei wird unabhängig von der Struktur des Objektes jedes Zeichen einfach nacheinander auf die Festplatte geschrieben oder gelesen.

Um alle Mandantendaten zu speichern, wird die Liste vom 1. bis zum letzten Element abgeklappert und jedes Element (Objekt) schreibt seine Daten in den Filestream. 

Laden (Lesen) funktioniert genauso, nur anders herum.

Den Filestream kann man sich als eine Art Speicherliste vorstellen, in die die Attributwerte der persistenten (d.h. dauerhaften) Objekte Zeichen für Zeichen hinein geschrieben werden oder herausgelesen werden. Der Filestream weiß, wie er seinen Inhalt auf die Festplatte bringt.

W r a n g e l s t r 9 6 1 0 9 9 7 B e r l i n . .

Dazu sind folgende Schritte in dieser Reihenfolge erforderlich:

In TMandant

  1. Ergänzen Sie uPerson, uAdresse, uSListe und uMandant um den Import (uses) von Classes und uSliste um den Import von Sysutils.
     
  2. Ergänzen Sie die Klasse TPerson um die Methoden InDateiSchreiben und AusDateiLesen, sowohl im Klassendiagramm als auch im Programm.
    Hier der entsprechende Quellcode:

    Im Interfaceteil:

    procedure InDateiSchreiben (var fs : TFilestream); virtual;
    procedure AusDateiLesen (var fs : TFilestream); virtual;
     

    Im Implementationteil:

    procedure TPerson.InDateiSchreiben (var Fs : TFileStream);
    (* -------------------------------------------------------------------- *)
    var
       len : integer;
    begin
      Len := Length(Name);
      FS.write(Len, SizeOf(Len));
      FS.write(PChar(Name)^, Len);

      Len := Length(VorName);
      FS.write(Len, SizeOf(Len));
      FS.write(PChar(VorName)^, Len);

      Len := Length(Geburtstag);
      FS.write(Len, SizeOf(Len));
      FS.write(PChar(Geburtstag)^, Len);

      Len := Length(Geschlecht);
      FS.write(Len, SizeOf(Len));
      FS.write(PChar(Geschlecht)^, Len);
    end;

    procedure TPerson.AusDateiLesen (var Fs : TFileStream) ;
    (* -------------------------------------------------------------------- *)
    var
       len : integer;
    begin
      FS.read(Len, SizeOf(Len));
      SetLength(Name, Len);
      FS.read(PChar(Name)^, Len);

      FS.read(Len, SizeOf(Len));
      SetLength(VorName, Len);
      FS.read(PChar(VorName)^, Len);

      FS.read(Len, SizeOf(Len));
      SetLength(Geburtstag, Len);
      FS.read(PChar(Geburtstag)^, Len);

      FS.read(Len, SizeOf(Len));
      SetLength(Geschlecht, Len);
      FS.read(PChar(Geschlecht)^, Len);
    end;
     

  3. Ergänzen Sie die Klasse TAdresse um die Methoden InDateiSchreiben und AusDateiLesen, sowohl im Klassendiagramm als auch im Programm.
    Hier der entsprechende Quellcode:
    procedure TAdresse.InDateiSchreiben (var Fs : TFilestream);
    (* -------------------------------------------------------------------- *)
    var
       len : integer;
    begin
      Len := Length(Strasse);
      FS.write(Len, SizeOf(Len));
      FS.write(PChar(Strasse)^, Len);
    
      Len := Length(Ort);
      FS.write(Len, SizeOf(Len));
      FS.write(PChar(Ort)^, Len);
    
      Len := Length(PLZ);
      FS.write(Len, SizeOf(Len));
      FS.write(PChar(PLZ)^, Len);
    
      Len := Length(TelefonNr);
      FS.write(Len, SizeOf(Len));
      FS.write(PChar(TelefonNr)^, Len);
    end;
    
    procedure TAdresse.AusDateiLesen (var Fs : TFilestream) ;
    (* -------------------------------------------------------------------- *)
    var
       len : integer;
    begin
      FS.read(Len, SizeOf(Len));
      SetLength(Strasse, Len);
      FS.read(PChar(Strasse)^, Len);
    
      FS.read(Len, SizeOf(Len));
      SetLength(Ort, Len);
      FS.read(PChar(Ort)^, Len);
    
      FS.read(Len, SizeOf(Len));
      SetLength(PLZ, Len);
      FS.read(PChar(PLZ)^, Len);
    
      FS.read(Len, SizeOf(Len));
      SetLength(TelefonNr, Len);
      FS.read(PChar(TelefonNr)^, Len);
    end;
  4. Ergänzen Sie die Klasse TMandant um die zwei neuen Methoden

    Im Interfaceteil:
    procedure InDateiSchreiben (var Fs : TFilestream);        override;
    procedure AusDateiLesen (var Fs : TFilestream);           override;

    Bei der Implementation müssen Sie die entsprechenden Methoden aus TPerson und TAdresse aufrufen und das Schreiben und Laden von Rechtsschutzversicherung und Vorstrafen regeln:

    procedure TMandant.InDateiSchreiben (var Fs : TFilestream);
    (* -------------------------------------------------------------------- *)
    var
       len : integer;
    begin
       inherited InDateiSchreiben(Fs);
       Adresse.InDateiSchreiben(Fs);
    
       Len := Length(Rechtsschutz);
       FS.write(Len, SizeOf(Len));
       FS.write(PChar(Rechtsschutz)^, Len);
    
       Len := Length(Vorstrafen);
       FS.write(Len, SizeOf(Len));
       FS.write(PChar(Vorstrafen)^, Len);
    end;
    
    procedure TMandant.AusDateiLesen (var Fs : TFilestream);
    (* -------------------------------------------------------------------- *)
    var
       len : integer;
    begin
       inherited AusDateiLesen(Fs);
       Adresse.AusDateiLesen(Fs);
    
       FS.read(Len, SizeOf(Len));
       SetLength(Rechtsschutz, Len);
       FS.read(PChar(Rechtsschutz)^, Len);
    
       FS.read(Len, SizeOf(Len));
       SetLength(Vorstrafen, Len);
       FS.read(PChar(Vorstrafen)^, Len);
    end;

     

  5. In TLISTE ergänzen Sie gemäß der Vorlage die Methoden "Load" und "Store". Nicht vergessen die Methoden im Interface- und im Implementationsteil einzutragen.
     
  6. In UFENSTER implementieren Sie die Methoden Mandantenliste.Load('man.dat')und Mandantenliste.Store('man.dat') durch einen Aufruf beim Start bzw. beim Beenden des Programms. Der Dateiname ist frei wählbar, z.B. "man.dat", muss in einfachen Hochkomma stehen und bei Load() und Store() identisch sein. Da in der Anforderungsdefinition festgelegt wurde, dass Laden und Speichern automatisch laufen soll, gehört der Laden in die Methode "FormCreate" und das Speichern in "EndeBtnClick".

©   10. August 2005    Siegfried Spolwig

page_top