AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Einzelne Elemente aus Datei auslesen und in Datei Speichern [UPDATED QUESTION]
Thema durchsuchen
Ansicht
Themen-Optionen

Einzelne Elemente aus Datei auslesen und in Datei Speichern [UPDATED QUESTION]

Ein Thema von Obelisk2k5 · begonnen am 20. Jun 2010 · letzter Beitrag vom 23. Jun 2010
Antwort Antwort
Obelisk2k5

Registriert seit: 20. Jun 2010
14 Beiträge
 
Delphi 2 Desktop
 
#1

Einzelne Elemente aus Datei auslesen und in Datei Speichern [UPDATED QUESTION]

  Alt 20. Jun 2010, 16:43
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.

Geändert von SirThornberry (21. Jun 2010 um 08:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Einzelne Elemente aus Datei auslesen

  Alt 20. Jun 2010, 17:08
Hallo und Willkommen in der 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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Obelisk2k5

Registriert seit: 20. Jun 2010
14 Beiträge
 
Delphi 2 Desktop
 
#3

AW: Einzelne Elemente aus Datei auslesen

  Alt 20. Jun 2010, 17:47
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

Geändert von SirThornberry (21. Jun 2010 um 08:54 Uhr)
  Mit Zitat antworten Zitat
Obelisk2k5

Registriert seit: 20. Jun 2010
14 Beiträge
 
Delphi 2 Desktop
 
#4

AW: Einzelne Elemente aus Datei auslesen und in Datei Speichern

  Alt 20. Jun 2010, 19:45
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().
  Mit Zitat antworten Zitat
Obelisk2k5

Registriert seit: 20. Jun 2010
14 Beiträge
 
Delphi 2 Desktop
 
#5

AW: Einzelne Elemente aus Datei auslesen und in Datei Speichern

  Alt 20. Jun 2010, 23:59
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...

Geändert von SirThornberry (21. Jun 2010 um 08:55 Uhr) Grund: code-tags durch delphi-tags ersetzt - nächstes mal bitte delphi-tags wählen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Einzelne Elemente aus Datei auslesen und in Datei Speichern [UPDATED QUESTION]

  Alt 21. Jun 2010, 08:15
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#7

AW: Einzelne Elemente aus Datei auslesen und in Datei Speichern [UPDATED QUESTION]

  Alt 22. Jun 2010, 19:31
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.
  Mit Zitat antworten Zitat
Obelisk2k5

Registriert seit: 20. Jun 2010
14 Beiträge
 
Delphi 2 Desktop
 
#8

AW: Einzelne Elemente aus Datei auslesen und in Datei Speichern [UPDATED QUESTION]

  Alt 23. Jun 2010, 14:44
Danke für die Hilfe, jetzt funktioniert alles wie es soll und ich kann mich dem nächsten Problem witmen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:17 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