![]() |
Re: Array als Datei speichern
ich habe ein ähnliches Problem. Bei mir ist der Array mit dem Typ Record verknüpft:
Delphi-Quellcode:
im Privat Bereich :
type
zeiten= record name: string; bzeit: string; versuch: integer; end;
Delphi-Quellcode:
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.
testr : array[1..20] of zeiten;
Ich habe auch schon Tutorials wie ![]() Ich hoffe ihr könnt mich einen kleinen Tipp geben. MfG |
Re: Array als Datei speichern
|
Re: Array als Datei speichern
Nimm mal ShortStrings in deinem Record.
|
Re: Array als Datei speichern
Zitat:
Delphi-Quellcode:
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....
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; --> nur unter der Wortsuche fand ich einen kleinen Artikel der jediglich die eigenschaften beschrieb, jedoch nicht auf die Syntaxs einging. MfG |
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; |
Re: Array als Datei speichern
Zitat:
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. |
Re: Array als Datei speichern
Zitat:
habt ihr vieleicht einen Konkreten link etc... MfG @Luckie thx, werde ich sofort mal testen |
Re: Array als Datei speichern
Zitat:
|
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; |
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 10:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz