Autor Beitrag
Shmidt_dlt
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Mo 02.06.03 16:58 
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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  FInStream:=TFileStream.Create('abc.str',fmCreate);
  with FInStream do begin
     Write(Record,Sizeof(Record));
     Free;
  end;

Import:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  FOutStream:=TFileStream.Create('abc.str',fmCreate);
  with FOutStream do begin
     Read(Record,Sizeof(Record));
     Free;
  end;
BungeeBug
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 901



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 64

Win XP; Win 2k; Suse 9.0
D5 Std, D6 Personal
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Di 03.06.03 08:04 
upsi.. sollte ja auch fmopenread heissen, ein klassicher Copy-Paste-error
ich probier das mal aus...
Shmidt_dlt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: 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
ausblenden volle Höhe 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 user profile iconTino: Absätze entfernt & Delphi-Tags eingefügt.
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert