Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi LoadFromFile (https://www.delphipraxis.net/140087-loadfromfile.html)

Klaus01 11. Sep 2009 14:22

Re: LoadFromFile
 
Zitat:

Beim Laden sollen die Daten der Datei in eine Liste eingetragen werden.
Aber es wird nie was eingetragen.
Er geht immer gleich zu CloseFile.
.. nun, das verstehe sogar ich.

Delphi-Quellcode:
procedure TAutoList.LoadFromFile(const FileName: string);
var
  datensatz: TFahrzeugdaten;
  MyFile: file of TFahrzeugdaten;
  Auto: IAuto;
begin
  begin
    AssignFile(MyFile, FileName);
    try
      Reset(MyFile);
          ShowMessage(inttostr(FileSize(MyFile)));
     Seek(MyFile,0);                             // hilft das?
      while not EOF(MyFile) do
      begin
        Auto := TBackupClassesFactory.Auto;
        read(MyFile, datensatz);
        Auto.SetValue(floattostr(datensatz.kw),avps);
//        Auto.ps := datensatz.ps;
//        Auto.KW := datensatz.kw;
//        Auto.Name := datensatz.fahrzeugName;
//        Auto.kmh := 0;
//        Auto.mph := 0;
        add(Auto);
        Count;
      end;
    finally
      CloseFile(MyFile);
    end;
  end;
end;
end.
Grüße
Klaus

Schnittcher 11. Sep 2009 14:23

Re: LoadFromFile
 
Hallo,

was heißt denn:

Delphi-Quellcode:
Seek(MyFile,0);
???

Es läd die Datei ja nicht in die Variable.

Gruß,
Schnittcher

Klaus01 11. Sep 2009 14:25

Re: LoadFromFile
 
Zitat:

Zitat von Schnittcher
Hallo,

was heißt denn:

Delphi-Quellcode:
Seek(MyFile,0);
???

Es läd die Datei ja nicht in die Variable.

Gruß,
Schnittcher

Der einfachste Weg das herauszufinden ist ,mit der Maus
auf die Routine zu gehen einmal klicken und dann F1 drücken.

Aus der Hilfe:
Zitat:

Unit
System

Syntax


[Delphi] procedure Seek(var F: file; N: Integer);


Description
Use Seek in Delphi code to move to a specified position in open typed or untyped files. The current file position of F moves to component number N, where the number of the first component of a file is 0.

In the above syntax, F is a typed or untyped file variable. The file specified by F must be open. N is an expression of type Longint

To expand a file, seek one component beyond the last component; that is, the statement Seek(F, FileSize(F)) moves the current file position to the end of the file.
Grüße
Klaus

Schnittcher 11. Sep 2009 14:28

Re: LoadFromFile
 
Hallo,

das ganze Hilft mir auch nicht weiter.

Das Programm springt gleich von

Delphi-Quellcode:
 while not EOF(MyFile) do
zu

Delphi-Quellcode:
    finally
      CloseFile(MyFile);
Gruß,
Schnittcher

nahpets 11. Sep 2009 14:32

Re: LoadFromFile
 
Hallo,

mach mal bitte folgende Änderungen in deinen Code:
Delphi-Quellcode:
{$I+} // Expcetion werfen, wenn Fehler bei Reset... auftreten.
procedure TAutoList.LoadFromFile(const FileName: string);
var
  datensatz: TFahrzeugdaten;
  MyFile: file of TFahrzeugdaten;
  Auto: IAuto;
begin
  begin
    // erstmal prüfen, ob's die Datei tatsächlich gibt, wenn nicht liegt der Hund woanders begraben.
    if not FileExists(FileName) then begin
      ShowMEssage('Uups: Die Datei ' + FileName + ' gibt es ja garnicht.');
      Exit;
    end;
    ShowMessage(FileName); // Wir wollen wissen, ob es der von uns erwartete Dateiname ist.
    AssignFile(MyFile, FileName);
    try
      try // Einen zusätzlichen Try-Except-Block, damit wir Fehler abfangen können.
        Reset(MyFile);
        // Wie groß ist die Datei?
        // Hier wird angegeben, wieviele Sätze vom Typ TFahrzeugdaten in der Datei sind.
        // Hier wird nicht angegeben, wie groß die Datei in Byte ist!!!
        ShowMessage(inttostr(FileSize(MyFile)));
        If EoF(MyFile) then begin
          ShowMessage('EoF(MyFile) ist der Meinung, dass keine Fahrzeugdaten in der Datei sind.');
          Exit;
        end;
        while not EOF(MyFile) do
        begin
          Auto := TBackupClassesFactory.Auto;
          read(MyFile, datensatz);
          Auto.SetValue(floattostr(datensatz.kw),avps);
//          Auto.ps := datensatz.ps;
//          Auto.KW := datensatz.kw;
//          Auto.Name := datensatz.fahrzeugName;
//          Auto.kmh := 0;
//          Auto.mph := 0;
          add(Auto);
          Count;
        end;
      except
        // Wenn's irgendwo kracht, wollen wir wissen was passiert ist.
        on e : Exception do
        begin
          ShowMessage(e.Message);
        end;
    finally
      CloseFile(MyFile);
    end;
  end;
end;
end.
und erzähl' uns dann für jedes ShowMessage, was da ausgegeben wird und ob das, was da ausgegeben wird mit deinen Erwartungen übereinstimmt.

Wenn FileSize 0 liefert, dann liegt die Vermutung nahe, dass die Daten in der Datei nicht zum TFahrzeugdaten passen, dann prüfe bitte, ob die Typedefinition mit den Daten übereinstimmt.

Klaus01 11. Sep 2009 14:37

Re: LoadFromFile
 
Die Routine sollte aber nur aus der While Schleife herausspringen
wenn das Dateiende erreicht worden ist.
Und das eof fehlerhaft arbeitet kann ich mir kaum vorstellen.

Kann es sein, dass das File auf irgendeine Weise zerschossen wurde?

Tritt das Problem schon immer auf, oder erst seit kurzem?

Grüße
Klaus

Schnittcher 11. Sep 2009 14:41

Re: LoadFromFile
 
Hallo,

ich habe es schon mit mehreren Dateien versucht.

@nahpets

Meldungen:

1. Dateiname (mit Pfad),
2. 0
3. Keine Daten vorhanden. (Das wusste ich schon das er das denkt.)

Also ist vll. beim speichern ein Fehler?

So speicher ich die Dateien:

Delphi-Quellcode:
procedure TAutoList.SaveToFile(const FileName: string);
var
  Datei: file of TFahrzeugdaten;
  i: integer;
  datensatz: TFahrzeugdaten;
  Auto: IAuto;
begin
  AssignFile(Datei, Filename);
  Rewrite(Datei);
  try
    for i := 0 to Count - 1 do
    begin
      Auto := Items[i];
      datensatz.fahrzeugName := Auto.ErgebnisName;
      datensatz.kw := Auto.kw;
      datensatz.ps := Auto.ps;
      write(Datei, datensatz);
    end;
  finally
    CloseFile(Datei);
  end;
end;
Gruß,
Schnittcher

Medium 11. Sep 2009 14:49

Re: LoadFromFile
 
Lad die betreffende Datei doch am besten mal hier hoch. Weil wenn FileSize 0 liefert, dürfte eigentlich genau nichts in der Datei stehen. Könnte es evtl. sein, dass du die Datei woanders hin speicherst als von wo du sie versuchst zu öffnen? Nicht dass du korrekt irgendwo hin speicherst, aber versuchst eine leere Datei von ganz wo anders zu öffnen und dich wunderst. Kann ja schnell mal passieren wenn man in sehr ähnlich benannten Unterverzeichnissen arbeitet.

nahpets 11. Sep 2009 14:50

Re: LoadFromFile
 
Hallo,

ergänze bitte mal die Speichermethode um:
Delphi-Quellcode:
AssignFile(MyFile, FileName);
try
  try // Einen zusätzlichen Try-Except-Block, damit wir Fehler abfangen können.
    Reset(MyFile);
    // Wie groß ist die Datei? 
    // Hier wird angegeben, wieviele Sätze vom Typ TFahrzeugdaten in der Datei sind.
    // Hier wird nicht angegeben, wie groß die Datei in Byte ist!!! 
    ShowMessage(inttostr(FileSize(MyFile)));
  except
    on e : Exception do ShowMessage(e.Message);
  end;
  finally
    CloseFile(Datei);
  end;
end;
Kommt da eine Exception oder ist FileSize = 0? FileSize müsste eigentlich Count sein, ist dem nicht so, dann passt das Schreiben in die Datei irgendwie nicht zum Typ TFahrzeugdaten.

Wenn möglich, zeig' uns mal die Definition von TFahrzeugdaten und den Inhalt der von Dir geschriebenen Datei, eventuell können wir ja daran was erkennen.

QuickAndDirty 11. Sep 2009 15:15

Re: LoadFromFile
 
Bitte einmal
Delphi-Quellcode:
{$I+}
Direkt als erstes in die Prozedur schrieben.


EDIT:

und versuche mal am Anfang der Prozedur
Delphi-Quellcode:
FileMode := 0;
und am ende, in einem Finaly block
Delphi-Quellcode:
FileMode := 2;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:02 Uhr.
Seite 2 von 3     12 3      

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