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? |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Zitat:
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; |
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! |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Welche gewünschte Exeption?
Ratte |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Zitat:
Delphi-Quellcode:
Aber eigentlich kann doch keine (interne, also nicht eigene) Exception in einem try-Block ausgelöst werden :gruebel: .
raise Exception.Create(FileName + ' ist keine gültige Datei vom Typ TMyArray.');
|
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! |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Zitat:
|
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! |
Re: 2 dimensionalen Array in Datei speichern und wieder lade
Zitat:
Wo genau liegt jetzt dein Problem? |
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. |
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