Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array als Datei speichern (https://www.delphipraxis.net/14599-array-als-datei-speichern.html)

Mr_Anderson 7. Okt 2004 19:05

Re: Array als Datei speichern
 
ich habe ein ähnliches Problem. Bei mir ist der Array mit dem Typ Record verknüpft:
Delphi-Quellcode:
type
    zeiten= record
      name: string;
      bzeit: string;
      versuch: integer;
    end;
im Privat Bereich :
Delphi-Quellcode:
testr            : array[1..20] of zeiten;
Danach werden die Werte jeweils durch die Aktionen des Users gesetzt. Danach möchte ich, dass er es speichern und auch wieder laden kann, jedoch funktioniert das nicht mit den oben aufgeführten Möglichkeiten.

Ich habe auch schon Tutorials wie Tut1 durchgelesen, jedoch bringt es mich nicht wirklich weiter.

Ich hoffe ihr könnt mich einen kleinen Tipp geben.

MfG

Keldorn 7. Okt 2004 19:27

Re: Array als Datei speichern
 
Hallo

dann würd ich auch einen Stream nehmen und die Daten mit Hier im Forum suchenTReader und Hier im Forum suchenTwriter lesen und schreiben. Du solltest mit den 2 Suchbegriffen auch Codebsp im forum finden. wenn nicht, meld dich wieder.

Mfg Frank

Luckie 7. Okt 2004 19:29

Re: Array als Datei speichern
 
Nimm mal ShortStrings in deinem Record.

Mr_Anderson 7. Okt 2004 22:39

Re: Array als Datei speichern
 
Zitat:

Zitat von Keldorn
Hallo

dann würd ich auch einen Stream nehmen und die Daten mit Hier im Forum suchenTReader und Hier im Forum suchenTwriter lesen und schreiben. Du solltest mit den 2 Suchbegriffen auch Codebsp im forum finden. wenn nicht, meld dich wieder.

Mfg Frank

Ich habe die 14 Ergebnisse abgesucht und bin doch nicht schlauer geworden. :( den einzigen code, den ich gefunden habe ist der hier:
Delphi-Quellcode:
procedure WriteStringToStream(stream: TFileStream; str: string);
var
len: integer;
begin
len := length(str);            // Länge des strings ermitteln
stream.write(len, SizeOf(len)); // Länge des Strings speichern
stream.write(PChar(str)^, len); // String mittels PChar speichern
end;


procedure ReadStringFromStream(stream: TFileStream; var str: string);
var
len: integer;
begin
stream.read(len, SizeOf(len)); // Länge des Strings auslesen
SetLength(str, len);          // Länge des Srings setzen
stream.read(PChar(str)^, len); // Strings mittels PChar auslesen
end;
Jedoch speichert dieser code nur 'normale' record und keinen, der mit einem Array in verbindung steht. Außerdem wird hier auch kein TWriter oder TReader benutzt, was ich ja gerade benutzten sollte, wegen der Strukturen. Auch die Delphi Hilfe schweigt bei der eingabe von TWriter....
--> nur unter der Wortsuche fand ich einen kleinen Artikel der jediglich die eigenschaften beschrieb, jedoch nicht auf die Syntaxs einging.



MfG

Luckie 7. Okt 2004 23:02

Re: Array als Datei speichern
 
So geht es:
Delphi-Quellcode:
// unser Record
type
  TScoreRecord = packed record
    Player: string[25];
    Score: Cardinal;
  end;

// unser Array vom Typ unseres Records
var
  ScoreRecord: array[0..2] of TScoreRecord;

procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;
begin
  // Array fülllen
  ScoreRecord[0].Player := 'Hans';
  ScoreRecord[0].Score := 5;
  ScoreRecord[1].Player := 'Fritz';
  ScoreRecord[1].Score := 6;
  ScoreRecord[2].Player := 'Lieschen';
  ScoreRecord[2].Score := 4;
  // abspeichern
  fs := TFileStream.Create('d:\HighScore.hs', fmCreate);
  try
    try
      // Array in Datei schreiben
      fs.WriteBuffer(ScoreRecord, sizeof(ScoreRecord));
    except
      // Schreibfehler aufgetreten
      on E: EWriteError do
        ShowMessage(E.Message);
    end;
  finally
    // fs wieder freigeben
    FreeAndNil(fs);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  fs: TFileStream;
  i: Integer;
begin
  fs := TFileStream.Create('d:\HighScore.hs', fmOpenRead);
  try
    try
      // erstmal wieder leeren
      for i := 0 to length(ScoreRecord) - 1 do
      begin
        ScoreRecord[i].Player := '';
        ScoreRecord[i].Score := 0;
      end;
      // aus Datei einlesen
      fs.ReadBuffer(ScoreRecord, sizeof(ScoreRecord));
      // und kucken was drinne steht
      for i := 0 to length(ScoreRecord) - 1 do
      begin
        ShowMessage(ScoreRecord[i].Player+#13#10+IntToStr(ScoreRecord[i].Score));
      end;
    except
      // Lesefehler aufgetreten
      on E: EReadError do
        ShowMessage(E.Message);
    end;
  finally
    // fs wieder freigeben
    FreeAndNil(fs);
  end;
end;

maximov 8. Okt 2004 09:34

Re: Array als Datei speichern
 
Zitat:

Zitat von Keldorn
Hallo

dann würd ich auch einen Stream nehmen und die Daten mit Hier im Forum suchenTReader und Hier im Forum suchenTwriter lesen und schreiben. Du solltest mit den 2 Suchbegriffen auch Codebsp im forum finden. wenn nicht, meld dich wieder.

Mfg Frank

Das ist ein sehr guter rat! Damit lassen sich dynamische strukturen viel transparenter speichern.

Tu dir selbst einen gefallen und fang garnicht erst an, records direkt binär zu speichern, erst recht nicht wenn da shortStrings drinn sind (platzverschwendung). Wenn du zB. die lange des strings, oder daten hinzufügen willst, dann ist das format deiner alten daten inkompatibel.

Ich mach es oft so, das ich erst eine signatur, versions-nummer und ein schema speichere, das besagt welche daten geschrieben werden. Beim auslesen weiss man dann genau, was man wohin laden muss.

Mr_Anderson 8. Okt 2004 14:11

Re: Array als Datei speichern
 
Zitat:

Zitat von maximov
Zitat:

Zitat von Keldorn
Hallo

dann würd ich auch einen Stream nehmen und die Daten mit Hier im Forum suchenTReader und Hier im Forum suchenTwriter lesen und schreiben. Du solltest mit den 2 Suchbegriffen auch Codebsp im forum finden. wenn nicht, meld dich wieder.

Mfg Frank

Das ist ein sehr guter rat! Damit lassen sich dynamische strukturen viel transparenter speichern.

Tu dir selbst einen gefallen und fang garnicht erst an, records direkt binär zu speichern, erst recht nicht wenn da shortStrings drinn sind (platzverschwendung). Wenn du zB. die lange des strings, oder daten hinzufügen willst, dann ist das format deiner alten daten inkompatibel.

Ich mach es oft so, das ich erst eine signatur, versions-nummer und ein schema speichere, das besagt welche daten geschrieben werden. Beim auslesen weiss man dann genau, was man wohin laden muss.

So langsam habe ich es ja verstanden, jedoch fehlt mir ein konkretes Beispiel mit TReader und TWriter. Das einzige, was ich in der CL und im Forum finde, beschreibt niemals die genaue Verwendung der Syntaxs.

habt ihr vieleicht einen Konkreten link etc...
MfG

@Luckie thx, werde ich sofort mal testen

Luckie 8. Okt 2004 14:16

Re: Array als Datei speichern
 
Zitat:

Zitat von Mr_Anderson
@Luckie thx, werde ich sofort mal testen

Da gfibt es nichts zum testen, das läuft. ;)

Mr_Anderson 8. Okt 2004 14:42

Re: Array als Datei speichern
 
nunja funktionieren stelle ich mir anders vor :P

Also es funktioniert nur einmal. Bei einem erneuten ausführen der laden funktion stüzt delphi komplett ab :D, wegen einer "Zugriffsverletzung".
Außerdem zeigt er mir nicht die Werte an, er zeigt nichts an im "showmessage":

Code sieht so aus:
Delphi-Quellcode:
type
    zeiten= packed record
      name: string;
      bzeit: string;
      versuch: integer;
    end;
var testr            : array[1..20] of zeiten;

procedure TForm1.SpeedButton3Click(Sender: TObject);
var
    fs: TFileStream;
  i: Integer;
begin

  fs := TFileStream.Create('d:\HighScore.hs', fmOpenRead);
  try
    try
      // erstmal wieder leeren
      for i := 0 to length(testr) - 1 do
      begin
        testr[i].bzeit := '';
        testr[i].name := '';
        testr[i].versuch := 0;
      end;
      // aus Datei einlesen
      fs.ReadBuffer(testr, sizeof(testr));
      // und kucken was drinne steht
      for i := 0 to length(testr) - 1 do
      begin
        ShowMessage('Bzeit:'+testr[i].bzeit+#13#10+'Verusch:'+IntToStr(testr[i].versuch)+#13#10+'name'+testr[i].name);
      end;
    except
      // Lesefehler aufgetreten
      on E: EReadError do
        ShowMessage(E.Message);
    end;
  finally
    // fs wieder freigeben
    FreeAndNil(fs);
  end;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
var outputfile : textfile;
    i : word;
    StrList: TStrings;
    y: integer;
    fs: TFileStream;
begin
  testr[1].name := 'muh';
  testr[2].name := 'jta';
  fs := TFileStream.Create('d:\HighScore.hs', fmCreate);
  try
    try
      // Array in Datei schreiben
      fs.WriteBuffer(testr, sizeof(testr));
    except
      // Schreibfehler aufgetreten
      on E: EWriteError do
        ShowMessage(E.Message);
    end;
  finally
    // fs wieder freigeben
    FreeAndNil(fs);
  end;
end;

Luckie 8. Okt 2004 14:47

Re: Array als Datei speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir definitiv nicht, sonst hätte ich das hier nicht gepostet.

Demo im Anhang.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz