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 2 dimensionalen Array in Datei speichern und wieder laden (https://www.delphipraxis.net/42531-2-dimensionalen-array-datei-speichern-und-wieder-laden.html)

mytar 28. Mär 2005 18:51

Re: 2 dimensionalen Array in Datei speichern und wieder lade
 
@gekmihesg: Danke, aber möchte es mit Streams machen!

@Sprint: Dein Code funktioniert einwandfrei, wenn ich ihn auf Dateien die ich vorher mit SaveToFile gespeichert habe. Will ich aber irgendeine Datei, z.B. *.zip öffnen, sollte er ja
FileName + ' ist keine gültige Datei vom Typ TMyArray ausgeben.

Leider kommt er nicht zu der Exception-Instanzierung sondern wirft beim Einlesen schon nach dem ReadSignature eine Exception, lass ich diese Anweisung weg, wirft er auch in der nächten Zeile einen ERead-Exception.

Zusammenfassend: Der Compiler kommt nicht erst dorthin, um die gewünschte Exception auszuwerfen.

Was kann ich dagegen tun?

Sprint 28. Mär 2005 19:10

Re: 2 dimensionalen Array in Datei speichern und wieder lade
 
Zitat:

Zitat von mytar
Dein Code funktioniert einwandfrei, wenn ich ihn auf Dateien die ich vorher mit SaveToFile gespeichert habe. Will ich aber irgendeine Datei, z.B. *.zip öffnen, sollte er ja
FileName + ' ist keine gültige Datei vom Typ TMyArray ausgeben.

Also geht es dir jetzt um eine Fehlerbehandlung?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  IDENT_TMYARRAY = 'TMyArray';
  BUF_SIZE = 4096;
type
  TMyArray = array[1..12, 1..2] of String;

  procedure LoadFromFile(var MyArray: TMyArray; const FileName: String);
  var
    Stream: TFileStream;
    Reader: TReader;
    I, J: Integer;
  begin
    Stream := TFileStream.Create(FileName, fmOpenRead);
    try
      Reader := TReader.Create(Stream, BUF_SIZE);
      try
        Reader.ReadSignature;
        if Reader.ReadIdent <> IDENT_TMYARRAY then
          raise Exception.Create(FileName + ' ist keine gültige Datei vom Typ TMyArray.');
        for I := 1 to 12 do
          for J := 1 to 2 do
            MyArray[I, J] := Reader.ReadString;
      finally
        Reader.Free;
      end;
    finally
      Stream.Free;
    end;
  end;

var
  MyArray: TMyArray;
begin

  if OpenDialog1.Execute then
  begin
    try
      LoadFromFile(MyArray, OpenDialog1.FileName);
    except
      on E: Exception do
        ShowMessage('Folgender Fehler ist aufgetreten: ' + E.Message);
    end;
  end;

end;

mytar 29. Mär 2005 16:26

Re: 2 dimensionalen Array in Datei speichern und wieder lade
 
Habs getestet. Funktioniert leider trotzdem nicht!

Die Anweisungen in der letzten if manipuliert ja glaub ich nur
die Exception-Message!

Ich glaub du hast mich falsch verstanden, muss mich dafür entschuldigen!

Wie bereits gesagt funktioniert der Code einwandfrei, für dateien die
die Signature und den Ident enthalten.

Bei anderen beliebigen Dateien, wie einem jpeg z.b., wird bereits nach dem
ReadSignature eine Exception "Unbekanntes Stream-Format" geworfen, was ich ja
auf keinen Fall will. Ich möchte ja bis zu "meiner" Exception die ich selbst auslöse.

Lass ich nun das ReadSignature weg, wirft er mir statt der einen Exception "Unbekannter
Eigenschaftswert".

D.h. ReadSignature und ReadIdent lösen bereits Exceptions aus. Der Compiler kommt
gar nicht mehr zur gewünschten auszulösenden Exception!

Bitte um Hilfe!

Danke

P.S. Bitte den Code einmal auf einen beliebige Datei testen! Bei mir werden dann leider die beiden ungewünschten Exceptions ausgelöst!

Ratte 29. Mär 2005 16:30

Re: 2 dimensionalen Array in Datei speichern und wieder lade
 
Welche gewünschte Exeption?

Ratte

Khabarakh 29. Mär 2005 16:37

Re: 2 dimensionalen Array in Datei speichern und wieder lade
 
Zitat:

Zitat von Ratte
Welche gewünschte Exeption?

Ratte

Delphi-Quellcode:
raise Exception.Create(FileName + ' ist keine gültige Datei vom Typ TMyArray.');
Aber eigentlich kann doch keine (interne, also nicht eigene) Exception in einem try-Block ausgelöst werden :gruebel: .

mytar 29. Mär 2005 16:47

Re: 2 dimensionalen Array in Datei speichern und wieder lade
 
ReadSignature löst sehrwohl eine Exception aus, sowie ReadIdent!

Der Try-Block verhilft nur zu einer geregelten Fehlerbehandlung (glaub ich) !


Erbitte weiter Hilfe!

Sprint 29. Mär 2005 17:01

Re: 2 dimensionalen Array in Datei speichern und wieder lade
 
Zitat:

Zitat von mytar
Bei anderen beliebigen Dateien, wie einem jpeg z.b., wird bereits nach dem
ReadSignature eine Exception "Unbekanntes Stream-Format" geworfen, was ich ja
auf keinen Fall will. Ich möchte ja bis zu "meiner" Exception die ich selbst auslöse.

Du kannst die Exception doch so abfangen, wie ich es in dem Beispiel mit dem OpenDialog gemacht habe.

mytar 29. Mär 2005 18:59

Re: 2 dimensionalen Array in Datei speichern und wieder lade
 
Statt "Unbekanntes Stream-Format" gibt er mir halt "Folgender Fehler ist aufgetreten: Unbekanntes Stream-Format" aus.

Bitte probier es mit einer beliebigen Datei, du wirst sehen, er gibt dir diese Meldung aus. Diese Exception wird vom ReadSignature ausgelöst, "Unbekannter Eigenschaftwert" von ReadIdent vom Type EReadError wenn ein unbekannter ReadValue im Objekt vorhanden ist!

Bitte unbedingt testen! Danke!

Sprint 29. Mär 2005 19:04

Re: 2 dimensionalen Array in Datei speichern und wieder lade
 
Zitat:

Zitat von mytar
Statt "Unbekanntes Stream-Format" gibt er mir halt "Folgender Fehler ist aufgetreten: Unbekanntes Stream-Format" aus.

Ich weiß immer noch nicht was du willst. Wenn die Datei nicht gelesen werden kann, dann wird halt ein Fehler ausgelöst. Diesen kannst du abfangen. Auswerten. Anzeigen oder halt auch nicht.

Wo genau liegt jetzt dein Problem?

mytar 29. Mär 2005 19:07

Re: 2 dimensionalen Array in Datei speichern und wieder lade
 
Mein Ziel: LoadFromFile soll für jeden Dateityp funktionieren.
Falls er nicht vom Format IDENT_TMYARRAY ist, soll die gewünschte Exception ausgelöst
werden, ansonsten der Inhalt in die Variable MyArray geladen werden.

Am besten ist wirklich das Ziel mitteilen! :wall:


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

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