Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TFileStream Fehler ??? (https://www.delphipraxis.net/17711-tfilestream-fehler.html)

jonny 8. Mär 2004 21:28


TFileStream Fehler ???
 
Hallo alle zusammen.
Ich schreibe ein Programm für Videoarchivierung und möchte gerne einzelne Filme importieren und exportieren zu können.
Habe dazu folgende zwei Prozeduren aber es klappt nicht ich bekomme immer einen Fehler und zwar beim Importieren. Der Fehler Lautet: Fehler beim lesen von Adresse ....... usw.

Delphi-Quellcode:
procedure TForm1.ExportMovieData(FileName: String);
var FS: TFileStream;
    Titel: String;

  procedure WriteString(S: String);
  var Laenge: Integer;
  begin
    Laenge:=Length(S);
    FS.Write(Laenge, SizeOf(Laenge));
    FS.Write(S, Laenge);
  end;

  procedure WriteInt(Int: Integer);
  begin
    FS.Write(Int, SizeOf(Int));
  end;

  procedure WriteStream(Blob: TBlobField);
  var Laenge: Integer;
      Strm: TMemoryStream;
  begin
    Strm:=TMemoryStream.Create;
    Strm.Clear;
    Blob.SaveToStream(Strm);
    Laenge:=Strm.Size;
    Strm.Position:=0;
    FS.Write(Laenge, SizeOf(Laenge));
    If Laenge > 0 Then
      FS.CopyFrom(Strm, Laenge);
    Strm.Free;
  end;

begin
  FS:=TFileStream.Create(FileName, fmCreate);

  WriteString(ClientDataSet1.FieldByName('Titel').AsString);
  WriteString(ClientDataSet1.FieldByName('Beschreibung').AsString);
  WriteString(ClientDataSet1.FieldByName('Genre').AsString);
  WriteString(ClientDataSet1.FieldByName('Filmformat').AsString);
  WriteInt(ClientDataSet1.FieldByName('Produktionsjahr').AsInteger);
  WriteString(ClientDataSet1.FieldByName('Produktionsland').AsString);
  WriteInt(ClientDataSet1.FieldByName('Filmlaenge').AsInteger);
  WriteString(ClientDataSet1.FieldByName('Bildformat').AsString);
  WriteString(ClientDataSet1.FieldByName('Darsteller').AsString);
  WriteString(ClientDataSet1.FieldByName('Regie').AsString);
  WriteString(ClientDataSet1.FieldByName('Sprachen').AsString);
  WriteString(ClientDataSet1.FieldByName('Filmgesellschaft').AsString);
  WriteString(ClientDataSet1.FieldByName('URL').AsString);
  WriteString(ClientDataSet1.FieldByName('FSK').AsString);
  WriteStream(TBlobField(ClientDataSet1.FieldByName('Bild1')));
  WriteStream(TBlobField(ClientDataSet1.FieldByName('Bild2')));
  WriteStream(TBlobField(ClientDataSet1.FieldByName('Bild3')));
  WriteStream(TBlobField(ClientDataSet1.FieldByName('Bild4')));

  FS.Free;
end;

procedure TForm1.ImportMovieData(FileName: String);
var FS: TFileStream;
    MyStream: TStream;

  function ReadString: String;
  var Laenge: Integer;
  begin
    Result:='';
    FS.Read(Laenge, SizeOf(Laenge));
    FS.Read(Result, Laenge);
  end;

  function ReadInt: Integer;
  begin
    Result:=0;
    FS.Read(Result, SizeOf(Result));
  end;

  procedure ReadStream(Strm: TStream);
  var Laenge: Integer;
  begin
    FS.Read(Laenge, SizeOf(Laenge));
    If Laenge > 0 Then
      Strm.CopyFrom(FS, Laenge)
    else
      Strm:=nil;
  end;

begin
  FS:=TFileStream.Create(FileName, fmOpenRead OR fmShareDenyNone);
  FS.Position:=0;
  ClientDataSet1.Insert;

  ClientDataSet1.FieldByName('Titel').AsString:=ReadString;
  ClientDataSet1.FieldByName('Beschreibung').AsString:=ReadString;
  ClientDataSet1.FieldByName('Genre').AsString:=ReadString;
  ClientDataSet1.FieldByName('Filmformat').AsString:=ReadString;
  ClientDataSet1.FieldByName('Produktionsjahr').AsInteger:=ReadInt;
  ClientDataSet1.FieldByName('Produktionsland').AsString:=ReadString;
  ClientDataSet1.FieldByName('Filmlaenge').AsInteger:=ReadInt;
  ClientDataSet1.FieldByName('Bildformat').AsString:=ReadString;
  ClientDataSet1.FieldByName('Darsteller').AsString:=ReadString;
  ClientDataSet1.FieldByName('Regie').AsString:=ReadString;
  ClientDataSet1.FieldByName('Sprachen').AsString:=ReadString;
  ClientDataSet1.FieldByName('Filmgesellschaft').AsString:=ReadString;
  ClientDataSet1.FieldByName('URL').AsString:=ReadString;
  ClientDataSet1.FieldByName('FSK').AsString:=ReadString;

  MyStream:=ClientDataSet1.CreateBlobStream(Form1.ClientDataSet1.FieldByName('Bild1'), bmReadWrite);
  ReadStream(MyStream);
  MyStream.Free;
  MyStream:=ClientDataSet1.CreateBlobStream(Form1.ClientDataSet1.FieldByName('Bild2'), bmReadWrite);
  ReadStream(MyStream);
  MyStream.Free;
  MyStream:=ClientDataSet1.CreateBlobStream(Form1.ClientDataSet1.FieldByName('Bild3'), bmReadWrite);
  ReadStream(MyStream);
  MyStream.Free;
  MyStream:=ClientDataSet1.CreateBlobStream(Form1.ClientDataSet1.FieldByName('Bild4'), bmReadWrite);
  ReadStream(MyStream);
  MyStream.Free;
  ClientDataSet1.Post;

  FS.Free;
end;

SirThornberry 9. Mär 2004 06:32

Re: TFileStream Fehler ???
 
Eine Fehlerursache ist
Delphi-Quellcode:
 function ReadString: String;
  var Laenge: Integer;
  begin
    Result:='';
    FS.Read(Laenge, SizeOf(Laenge));
    FS.Read(Result, Laenge);
  end;
du Solltest vorher die länge von result setzen, ansonsten ist der buffer nicht groß genug um das was du aus der datei liest darein zu schreiben. Also so:
Delphi-Quellcode:
 function ReadString: String;
  var Laenge: Integer;
  begin
    FS.Read(Laenge, SizeOf(Laenge));
    setLength(Result, Laenge);
    FS.Read(Result, Laenge);
  end;

jonny 9. Mär 2004 12:01

Re: TFileStream Fehler ???
 
Du hast schon recht der fehler trat wirklich beim lesen eines Strings auf aber auch mit der änderung hab ich keinen Erfolg. Immer noch der Fehler!

Christian Seehase 9. Mär 2004 18:43

Re: TFileStream Fehler ???
 
Moin Zusammen,

wenn man ein Array als Buffer nimmt, muss man immer den Index des ersten Elementes mit angeben, ab dem der Buffer gefüllt werden soll, bei einem String also i.d.R. [1], so dass das Ganze dann so aussieht:

Delphi-Quellcode:
FS.Read(Result[1], Laenge);

jonny 9. Mär 2004 23:25

Re: TFileStream Fehler ???
 
Danke schon mal soweit.

Es gibt jetzt keine Fehlermeldung aber das dumme ist das Alle Stringwerte nicht mehr die sind die ich reingeschrieben habe und alle anderen felder wie Integer und BlobStreams die passen alle.

Jemand ne Idee?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 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