Thema: Delphi Fehlersuche...

Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#5
  Alt 19. Okt 2002, 10:12
So, ausgehend von folgendem Record:
Code:
type
  CDrec = record
    name,
    pos,
    comment : string[50];
    maxentry,
    nr      : integer;
    entry   : array[1..24]of string[70];
  end;
habe ich zuerst einen einfachen Versuch gestartet:
Code:
var
  CD : CDrec =
    (name:'Brandenburg Concertos 1 - 3';
     pos:'1'; // mangels besseres Wissen habe ich ´ne Eins benutzt
     comment:'Johann Sebastian Bach';
     maxentry:9;
     nr:1; // auch hier habe ich keine Ahnung, was dies ist
     entry:('Allegro',
      'Adagio',
      'Allegro',
      'Menuetto-Trio-Polacca',
      'Allegro',
      'Andante',
      'Allegro assai',
      'Allegro',
      'Allegro', // das Stück ist das bekannteste, IMHO :o)
      '','','','','','','','','','','','','','',''));

procedure TForm1.SaveSimpleClick(Sender: TObject);
var
  datei : file of CDrec;
begin
  {$I-}
  AssignFile(datei,'bc1-3.cd');
  ReWrite(datei);
  Write(datei,CD);
  CloseFile(datei);
  {$I+}
end;
Ergebnis: Null Fehler, Datei "bc1-3.cd" ist mit 1,82k vorhanden.

Und nun die Variante, bei der ich das CD-Record seinerseits in ein Array gepackt habe, wobei ich mich aber auf 2 Arrayfelder beschränkt und das zweite auch leergelassen habe:
Code:
var
  CDarray : array[1..2]of CDrec = (   // wir wollen ma´ nich´ übertreiben
    (name:'Brandenburg Concertos 4 - 6';
     pos:'1';
     comment:'Johann Sebastian Bach';
     maxentry:9;
     nr:1;
     entry:('Allegro',
      'Andante',
      'Presto',
      'Allegro',
      'Affetuoso',
      'Allegro',
      'Allegro',
      'Adagio ma non tanto',
      'Allegro',
      '','','','','','','','','','','','','','','')),
    // und ein leeres
    (name:'';
     pos:'';
     comment:'';
     maxentry:0;
     nr:0;
     entry:('','','','','','','','','','',
       '','','','','','','','','','',
       '','','','')));

procedure TForm1.SaveAsRecordClick(Sender: TObject);
var
  datei : file of CDrec;
begin
  {$I-}
  AssignFile(datei,'bc4-6.cd');
  ReWrite(datei);
  Write(datei,CDarray[2]); // <-- das leere zuerst!
  Write(datei,CDarray[1]);
  CloseFile(datei);
  {$I+}
end;
Ergebnis: Null Fehler, Datei "bc4-6.cd" hat naturgemäß die doppelte Größe, weil ich beide Arrays gespeichert habe.

Und nun zum Einlesen der zuletzt gespeicherten Datei:
Code:
procedure TForm1.GetItClick(Sender: TObject);
var
  datei : file of CDrec;
  mycd : CDrec;
begin
  {$I-}
  AssignFile(datei,'bc4-6.cd');
  Reset(datei);
  while(not(eof(datei))) do
    begin
      Read(datei,mycd);

      ShowMessage(mycd.name + #13#10 +
        mycd.comment);
    end;
  CloseFile(datei);
  {$I+}
end;
Beim ersten Mal wird logischerweise nichts zurückgeliefert, weil ich das leere Array ja auch gespeichert habe. Beim zweiten Durchlauf sollte aber der JSB erscheinen, und dann ist die Datei auch schon zu Ende.

Damit habe ich mal wieder meine Bürgerpflicht erfüllt und kann wohl ins Wochenende gehen? 8)

<-------------->

PS: Eins fehlt ja noch; das Ändern -
Also, ich habe als neue Datei "bc1-6.cd" mit allen drei CD-Records erzeugt:
Code:
  {$I-}
  AssignFile(datei,'bc1-6.cd');
  ReWrite(datei);

  Write(datei,CD);
  Write(datei,CDarray[2]); // <-- das leere in der Mitte
  Write(datei,CDarray[1]);

  CloseFile(datei);
  {$I+}
Und dann ergänze ich einfach mal den Titel #24 im ersten Record:
Code:
procedure TForm1.ChangeClick(Sender: TObject);
var
  datei : file of CDrec;
  mycd : CDrec;
  fp   : longint;
begin
  {$I-}
  AssignFile(datei,'bc1-6.cd');
  Reset(datei);
  while(not(eof(datei))) do
    begin
      // Position des aktuellen Feldes
      fp := filepos(datei);

      // Feld lesen
      Read(datei,mycd);

      if(CompareText('Brandenburg Concertos 1 - 3',mycd.name) = 0) then
        begin
          // eindeutige Copyright-Verletzung :o)
          mycd.entry[24] := 'Mondschein-Sonate in C#m';

          // zum Anfang des Feldes zurück
          Seek(datei,fp);

          // und schreiben
          Write(datei,mycd);
        end;
    end;
  CloseFile(datei);
  {$I+}
end;
Jetzt is´ aber Schluss.
  Mit Zitat antworten Zitat