![]() |
Einzelne Elemente aus Datei auslesen und in Datei Speichern [UPDATED QUESTION]
Erstmal hallo alle Miteinander!
Ich versuche gerade, mich in den Umgang mit Dateien in Delphi einzuarbeiten, blicke da aber nicht ganz durch. Ich habe ein Element, das ein packed record ist. Mehrere solcher Elemente sollen als typisierte Dateien gespeichert und wieder ausgelesen werden können. Ich bin mir nicht einmal sicher, womit ich am besten anfange; speichern oder laden, habe aber erstmal mit letzterem angefangen. Ich weise die Datei einer Dateivariablen zu, welchen ich dann zum lesen öffne. Nun möchte ich aus der Datei die einzelnen Elemente auslesen und mit einer Funktion (die ich bereits geschrieben habe) in einem Array von dem packed record-Typ speichern. Nur komme ich nicht darauf, wie ich am besten anstellen kann. Ich weiß nicht einmal, wie genau die packed records in einer typisierten Datei gespeichert werden und wie man dann drauaf zugreigen kann. Kann ich jedes Record als ganzes auslesen und dann in einer whileschleife (bis EoF(Datei)) jedes Element mit der passenden Funktion sofort weiter verarbeiten? Und wie genau geht das? readln liest ja soweit ich weiß´lediglich eine Zeille Text aus, nun weiß ich aber nicht, ob das dann ein ganzes (konvertiertes) Element oder lediglich ein Teil des packed Records ist. Hier ein Auszug aus meinem Code:
Delphi-Quellcode:
Schonmal danke für alle Antworten.
function readFromFile (const Filename: string): boolean;
var datavar: file of TElement; begin try AssignFile(datavar, Filename); try Reset(datavar); while not EOF(datavar) do begin //hier weiß ich nicht weiter, außer, //dass readfromFile je nach Erfolg auf true oder false gesetzt wird //(prozedur zum übernehmen ins Array liefert boolischen Wert) end; finally closeFile(datavar); end except on E: EInOutError do showmessage('Datei kann nicht gelesen werden.') end end; |
AW: Einzelne Elemente aus Datei auslesen
Hallo und Willkommen in der DP :dp:,
ich an Deiner Stelle hätte ja mit dem Schreiben angefangen, damit Du auch wieder etwas zum Auslesen hast ;). Aber Deine Vermutung ist richtig: Datei öffnen und solange lesen, bis EOF erreicht ist. Allerdings dann nicht mit Readln, sondern mit Read.
Delphi-Quellcode:
Das war jetzt aus dem Kopf getippt, eine Fehlerbehandlung überlasse ich Dir, im Groben müsste das aber so richtig sein.
AssignFile(Dateivariable, Dateiname);
Reset(Dateivariable); SetLength(RecordArray, FileSize(Dateivariable)); ArrayIndex := 0; while not Dateivariable.EOF do begin Read(Dateivariable, RecordArray[ArrayIndex]); inc(ArrayIndex); end; CloseFile(Dateivariable); |
AW: Einzelne Elemente aus Datei auslesen
Da ich eine eigene Funktion habe, nehme ich also am besten noch eine Variable vom Typ des Elements und gebe die als Prameter an die Funktion weiter.
Okay, danke. Sieht ja schon fast zu leicht aus ^^ EDIT: So, habe gedacht, das Speichern währe genau so einfach, aber denkste... An markierter Stelle verlangt er nach einer Variable, und ich wüsste jetzt nicht, was der Compiler will.
Delphi-Quellcode:
Andere Funktionen:
function writeToFile (const Filename: string): boolean;
var datavar: file of TElement; i : longint; begin writeToFile := false; try AssignFile(datavar, Filename); try Rewrite(datavar); for i := 1 to getElementCount do begin write(datavar, getElement(i)); //<======= writeToFile := true; end; finally closeFile(datavar); end except on E: EInOutError do showmessage('Datei kann nicht gespeichert werden.') end end getElementCount - liefert die Anzahl an Elementen, also auch, wie viele gespeichert werden sollen. getElement - liefert als Rückgabewert einen Wert vom Typ TElement mit dem angegebenen Index i. Ich bin schoon gespannt, wie hier die Lösung aussieht :) |
AW: Einzelne Elemente aus Datei auslesen und in Datei Speichern
Okay, habe das Problem jetzt "gelöst", indem ich eine Variable tempElement hinzugefügt habe, der dann getElement zugewiesen wird.
Diese Variable nutze ich dann im write(). |
AW: Einzelne Elemente aus Datei auslesen und in Datei Speichern
Hm, Schade, die Datenspeicherung klappt bei mir gar nicht.
Zwar bekomme ich mit nem SaveDialog das Fenster auf, die Datei scheint auch angelegt zu werden, nur ist sie trotzdem nicht existent. In der Formularunit:
Delphi-Quellcode:
isreadonly:
procedure TfrmMain.MnDateispeichernClick(Sender: TObject);
begin SaveDialog.Filter := '*lyr'; SaveDialog.DefaultExt := '*lyr'; SaveDialog.InitialDir := ExtractFilePath(Application.Exename); if SaveDialog.execute then if not isreadonly(SaveDialog.FileName) then if writeToFile(SaveDialog.FileName)then refreshLists; //Erneuert den Inhalt einer listbox, funktioniert auch end;
Delphi-Quellcode:
writetofile
function isReadOnly(fileName: string): boolean;
begin if FileExists(filename) then if FileIsReadOnly(fileName) then if MessageDlg ('Datei ist schreibgeschützt, soll der Schreibschutz entfernt werden ?', mtInformation, [mbYes, mbNo], 0) = mrYes then begin isReadOnly := not FileSetReadOnly(filename, false); end else isReadOnly := true; isReadOnly := FileIsReadOnly(fileName) end;
Delphi-Quellcode:
function writeToFile (const myFilename: string): boolean;
var handle : file of TElement; tempElement : TElement; i : longint; begin writeToFile := false; try AssignFile(handle, myFilename); try Rewrite(handle); for i := 1 to getElementCount do begin tempElement := getElement(i); write(handle, tempElement); writeToFile := true; end; finally closeFile(handle); end except on E: EInOutError do showmessage('Datei kann nicht gespeichert werden.') end end; Ich weiß, es ist viel, aber vielleicht hat ja doch wer Lust, mal reinzuschauen... |
AW: Einzelne Elemente aus Datei auslesen und in Datei Speichern [UPDATED QUESTION]
Bei isreadonly scheinen da ein paar begins und ends zu fehlen (zumindest lässt die Einrückung darauf schließen). Bei writetofile benutzt Du vermutlich einen falschen Index, da dynamische Arrays immer 0-indiziert sind, d.h. das erste Element hat den Index 0 und das letzte den Index Count - 1.
|
AW: Einzelne Elemente aus Datei auslesen und in Datei Speichern [UPDATED QUESTION]
isreadonly:
Wenn der Code sonst mehrdeutig wäre, gehört ein ELSE immer zum LETZTEN IF, zu dem es passen könnte. Wenn also FileExists(filename) oder FileIsReadOnly(fileName) als Ergebnis false liefern, wird also der Rückgabewert der Funktion undefiniert sein, die ersten beiden IF haben kein ELSE. edit: könnte man meinen, wenn man Deiner Einrückung glaubt. Aber in Wirklichkeit ist das ganze geschachtelte if statement rein dummy, weil das letzte Statement der Funktion wird immer aufgerufen und überschreibt das Result, egal was vorher bei den ifs berechnet worden ist. |
AW: Einzelne Elemente aus Datei auslesen und in Datei Speichern [UPDATED QUESTION]
Danke für die Hilfe, jetzt funktioniert alles wie es soll und ich kann mich dem nächsten Problem witmen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 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