Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Einzelne Elemente aus Datei auslesen und in Datei Speichern [UPDATED QUESTION] (https://www.delphipraxis.net/152366-einzelne-elemente-aus-datei-auslesen-und-datei-speichern-%5Bupdated-question%5D.html)

Obelisk2k5 20. Jun 2010 16:43


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:
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;
Schonmal danke für alle Antworten.

DeddyH 20. Jun 2010 17:08

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:
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);
Das war jetzt aus dem Kopf getippt, eine Fehlerbehandlung überlasse ich Dir, im Groben müsste das aber so richtig sein.

Obelisk2k5 20. Jun 2010 17:47

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:
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
Andere Funktionen:
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 :)

Obelisk2k5 20. Jun 2010 19:45

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().

Obelisk2k5 20. Jun 2010 23:59

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:
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;
isreadonly:

Delphi-Quellcode:
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;
writetofile

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...

DeddyH 21. Jun 2010 08:15

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.

idefix2 22. Jun 2010 19:31

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.

Obelisk2k5 23. Jun 2010 14:44

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 13:19 Uhr.

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