Entwickler-Ecke
Dateizugriff - TFileStream funktioniert nicht
Shmidt_dlt - Mo 02.06.03 16:58
Titel: TFileStream funktioniert nicht
Guten tach auch,
ich hatte vor einiger zeit eine Wahnsinns idee...
ich wollte aus einem Programm heraus eine Datei exportieren und da noch ein Record anhängen. Da dachte ich mir das sich da TFilestream am
günstigsten macht. Funktioniert auch... der export und der import... der Import allerdings nur beim 1. mal danach liest der nur noch schrott in den record und bringt exceptions usw...
Ich hoffe es gibt jemanden der mir helfen kann... wo liegt da der fehler
der Code ist quasi nur mal ein auszug das mit der Datei hab ich mal weggelassen weil das eh funktioniert.. nur der blöde record macht müll
Export:
Delphi-Quelltext
1: 2: 3: 4: 5:
| FInStream:=TFileStream.Create('abc.str',fmCreate); with FInStream do begin Write(Record,Sizeof(Record)); Free; end; |
Import:
Delphi-Quelltext
1: 2: 3: 4: 5:
| FOutStream:=TFileStream.Create('abc.str',fmCreate); with FOutStream do begin Read(Record,Sizeof(Record)); Free; end; |
BungeeBug - Mo 02.06.03 17:09
Hi,
versuch mal beim Import fmReadOpen als Zugriffsmodus :)
dann sollte das schon mal besser gehen ....
MfG BungeeBug
P.S.: Wenn du an den Stream was anhängen willst dann würd ich als Zugriffsmodus fmOpenReadWrite benutzen ... aber das sagt die die OH auch :)
w3seek - Mo 02.06.03 17:15
TFileStream.Create loest eine Exception aus wenn die Datei nicht in dem gewuenschten Modus geoeffnet werden kann, oder die Datei nicht existiert oder sie nicht erstellt werden kann.
Am besten immer in etwa so loesen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| try fs := TFileStream.Create(...); except fs := nil; end; if Assigned(fs) then begin .... fs.Free; end; |
Shmidt_dlt - Di 03.06.03 08:04
upsi.. sollte ja auch fmopenread heissen, ein klassicher Copy-Paste-error
ich probier das mal aus...
Shmidt_dlt - Di 03.06.03 08:56
Titel: geht immernoch nciht
Also ich hab jetzt das ganze in zig varianten ausprobiert... funktionieren tut es aber immernoch nicht. wenn ich allerdings statt des Records einen string reinschreibe geht es... sollte aber nicht sinn und zweck der übung sein...
in dem Record sind nur strings und Integer deklariert. deshalb hier mal der komplette code
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| Function TExcelExImport.ImportTemplate(ImportFile : String; FileName: String): TTemplateRecord; Var FOutStream,FInStream : TFileStream; ExSize,i : LongInt; begin FOutStream:=TFileStream.Create(ImportFile,FmOpenReadWrite and fmShareDenyNone); FInStream:=TFileStream.Create(FileName,FmCreate); with FOutStream do begin Read(ExSize,SizeOf(Longint)); FInStream.CopyFrom(FOutStream,ExSize); Read(Result,Sizeof(Result)); Result.FileName:=FileName; free; end; FInStream.Free; end;
Procedure TExcelExImport.ExportTemplate(ExportFile : String; Template: TTemplateRecord); Var FOutStream,FInStream : TFileStream; ExSize : LongInt; begin FOutStream:=TFileStream.Create(Template.Filename,FmOpenReadWrite and fmShareDenyNone); FInStream:=TFileStream.Create(ExportFile,FmCreate); with FInStream do begin ExSize:=FOutStream.Size; Write(ExSize,SizeOf(ExSize)); CopyFrom(FOutStream,FOutStream.Size); Write(Template,Sizeof(Template)); Free; end; FOutStream.Free; end; |
Moderiert von
Tino: Absätze entfernt & Delphi-Tags eingefügt.
tommie-lie - Di 03.06.03 18:20
Titel: lphi
Was denn für Strings (im record)?
Wenn es "normale" LongStrings sind (als Typ String), dann sind die von variabler Länge und haben soweit ich weiß nur eine Größe von 4 Byte, nämlich die eines Pointers. Beim Schreiben wird das dann zu wenig sein, und beim Lesen erst Recht.
LongString ist so ziemlich der schlechteste Typ um ihn in eine Datei zu schreiben ;-)
Am Besten du nimmst statische Strings, nämlich Shortstrings (Typ: String[123]). Die haben eine fest Länge und sind kein Pointer, machen also keine Probleme beim Schreiben und Lesen in und aus Dateien.
Ansonsten wäre der Inhalt der Datei, zumindest die Stelle an der der Record sein sollte, hilfreich zur Fehleranalyse.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!