Announcement

Collapse
No announcement yet.

TFilestream funktioniert nicht mit Records

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TFilestream funktioniert nicht mit Records

    Tach auch...

    also... ich habe letztens die Wahnsinns idee gehabt eine Datei und ein Record in eine Neue Datei zu schreiben... da Dachte ich mir das
    TFilestream ja genau das wäre was ich dazu bräuchte...

    gesagt getan... Allerdings funktioniert beim auslesen des record das ganze genau 1 mal,
    danach kommt es zu unerklärlichen Exceptions
    die man nichtmal mit dem Debugger verfolgen kann...

    IDE ist Delphi 5 EE

    Ich hoffe ja das mir irgendjemand helfen kann,
    deshalb hier mal der Code

    <PRE>
    Function TExcelExImport.ImportTemplate(ImportFile : String; FileName: String): TTemplateRecord;
    Var FOutStream,FInStream : TFileStream;
    ExSize,i : LongInt;
    begin
    FOutStream:=TFileStream.Create(ImportFile,FmOpenRe adWrite 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,F mOpenReadWrite 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;

    </PRE>

  • #2
    Hallo,

    wie sieht die Definition von TTemplateRecord aus?

    Tschüß

    Torste

    Comment


    • #3
      Öhm

      TTemplateRecord = record
      ID : Integer;
      ExportID : Integer;
      Titel : String;
      Ben1 : String;
      Ben2 : String;
      Ben3 : String;
      Von : String;
      VonID : String;
      Filename : String;
      Macro : String;
      Am : TDateTime;
      end;

      so... also nix besondere

      Comment


      • #4
        <PRE>

        TTemplateRecord = record
        ID : Integer;
        ExportID : Integer;
        Titel : String;
        Ben1 : String;
        Ben2 : String;
        Ben3 : String;
        Von : String;
        VonID : String;
        Filename : String;
        Macro : String;
        Am : TDateTime;
        end;

        </PRE&gt

        Comment


        • #5
          Hallo DLT-Member,

          ich sehe meine Vermutung bestätigt.

          Du verwendest Strings in Deinem Record. Die Strings werden aber nur als Pointer in Deinem Record gespeichert.

          Mit Deiner Methode speicherst Du nur diese Pointer(Zeiger) in die Datei, nicht jedoch den String-Inhalt.

          Nach dem Auslesen Deiner Records aus der Datei zeigen diese Pointer auf einen ungültigen Speicherbereich und verursachen so die Zugriffsverletzungen.

          Tschüß

          Torste

          Comment


          • #6
            Hab ichs mir doch fast gedacht... sonste wäre der ja nicht nur 4byte gross... ist eigentlich mega peinlich... hätte ich mir auch selber denken können *grml*

            trotzdem dank

            Comment

            Working...
            X