Delphi-PRAXiS

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)

Schnittcher 11. Sep 2009 13:52


LoadFromFile
 
Hallo,

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)));
      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.
Ich rufe die Prozedur so auf:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
//  datensatz: TFahrzeugdaten;
//  MyFile: file of TFahrzeugdaten;
begin
  AutoList := TbackupClassesFactory.AutoList;
  if OpenDialog1.Execute then
  begin
    AutoList.LoadFromFile(OpenDialog1.FileName);
  end;
end;
Delphi-Quellcode:
AutoList.LoadFromFile(OpenDialog1.FileName);
Hier habe ich gerade gesehen, dass FileName diesen Inhalt hat: "E2003 Undeclared identifier: 'OpenDialog1'"

Sieht hier jemand einen Fehler?
Die Datei soll immer leer sein, das ist sie aber nicht.

Gruß,
Schnittcher

Klaus01 11. Sep 2009 13:55

Re: LoadFromFile
 
Zitat:

Zitat von Schnittcher

Sieht hier jemand einen Fehler?
Die Datei soll immer leer sein, das ist sie aber nicht.

Gruß,
Schnittcher

..nun, wenn niemand den Inhalt der Datei löscht warum sollte
sie dann leer sein.

Grüße
Klaus

Schnittcher 11. Sep 2009 13:56

Re: LoadFromFile
 
Hallo,

sorry.
Die Datei ist angeblich leer, dass ist Sie aber nicht.

Gruß,
Schnittcher

Klaus01 11. Sep 2009 14:01

Re: LoadFromFile
 
.. wie stellst Du denn fest ob die Datei leer ist oder nicht?

Ist FileSize(MyFile) = 0?

Wenn Du dir die Datei mit einem (Hex)Editor anschaust, ist dann nichts drinnen?

Grüße
Klaus

Schnittcher 11. Sep 2009 14:02

Re: LoadFromFile
 
Hallo,

doch da ist ja was drin.

Delphi-Quellcode:
ShowMessage(inttostr(FileSize(MyFile)));
So lasse ich mir die Größe der Datei anzeigen.

Gruß,
Schnittcher

Klaus01 11. Sep 2009 14:04

Re: LoadFromFile
 
Zitat:

Zitat von Schnittcher
Hallo,

doch da ist ja was drin.

Delphi-Quellcode:
ShowMessage(inttostr(FileSize(MyFile)));
So lasse ich mir die Größe der Datei anzeigen.

Gruß,
Schnittcher

Erklär mal Dein Problem etwas genauer.
Ich denke wir schreiben aneinander vorbei.

Wenn FileSize(MyFile) > 0 ist, dann ist die Datei nicht leer.
Wieso bist Du dann der Meinung das sie leer sein sollte?

Grüße
Klaus

Schnittcher 11. Sep 2009 14:06

Re: LoadFromFile
 
Hallo,

nochmal, ich will nicht das die Datei leer ist, sie enthält Daten, aber wenn ich das Programm starte wird mir immer gesagt, dass die Datei leer ist. Sie also eine Dateigröße von 0 hat. Aber das hat sich ja nicht. Sie hat ja Inhalt.

Gruß,
Schnittcher

Klaus01 11. Sep 2009 14:10

Re: LoadFromFile
 
Zitat:

Zitat von Schnittcher
Hallo,

nochmal, ich will nicht das die Datei leer ist, sie enthält Daten, aber wenn ich das Programm starte wird mir immer gesagt, dass die Datei leer ist. Sie also eine Dateigröße von 0 hat. Aber das hat sich ja nicht. Sie hat ja Inhalt.

Gruß,
Schnittcher

Wie prüfst Du das beim Starten des Programms?

(Es ist Freitagnachmittag, das Denken fällt mir schwer)
Grüße
Klaus

Fussball-Robby 11. Sep 2009 14:10

Re: LoadFromFile
 
Zitat:

Zitat von Schnittcher
wird mir immer gesagt, dass die Datei leer ist. Sie also eine Dateigröße von 0 hat.

Ich denke die Frage ist hier, wie dir das gesagt wird. In einer Fehlermeldung? Oder per ShowMessage? Irgendwas funktioniert ja nicht, wir können aber nur helfen, wenn wir wissen, welcher Teil des Codes nicht richtig funktioniert.

Schnittcher 11. Sep 2009 14:14

Re: LoadFromFile
 
Hallo,

ich versuche es nochmal.

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

Gruß,
Schnittcher

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;

DeddyH 11. Sep 2009 16:44

Re: LoadFromFile
 
Ich hab die Datei hier, sie ist 0 Byte groß, also muss sie leer sein.

[edit] Das erklärt somit auch den Sprung zum CloseFile, weil das Programm nie in die for-Schleife kommt. [/edit]

Luckie 11. Sep 2009 17:42

Re: LoadFromFile
 
Zitat:

Zitat von Schnittcher
Hier habe ich gerade gesehen, dass FileName diesen Inhalt hat: "E2003 Undeclared identifier: 'OpenDialog1'"

Wie? Hat die Variable Filename den den Inhalt der Fehlermeldung? Also für mich ist das eine Fehlermeldung der IDE und der Code dürfte sich gar nicht kompilieren lassen, weil du anscheinen entweder keine entsprechende Komponente auf dem Formular hast oder aber sie in deiner Klasse nicht bekannt ist.

Zitat:

Sieht hier jemand einen Fehler?
Siehe oben.

Zitat:

Die Datei soll immer leer sein, das ist sie aber nicht.
Wie stellst du das fest, wenn der Code wahrscheinlich gar nicht kompiliert? Oder wird uns hier schon wieder die Hälfte vorenthalten?

Schnittcher 14. Sep 2009 07:07

Re: LoadFromFile
 
Hallo,

es tut mir leid, ich habe jetzt nichts geändert, am Freitag hat nichts funktioniert und heute starte ich das Programm und habe es nochmal versucht und es ging.
Also kann ich euch nicht sagen wo der Fehler war.

Gruß,
Schnittcher


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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