AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream Fehler ???

Offene Frage von "jonny"
Ein Thema von jonny · begonnen am 8. Mär 2004 · letzter Beitrag vom 10. Mär 2004
Antwort Antwort
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#1

TFileStream Fehler ???

  Alt 8. Mär 2004, 22:28
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;
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: TFileStream Fehler ???

  Alt 9. Mär 2004, 07:32
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: TFileStream Fehler ???

  Alt 9. Mär 2004, 13:01
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!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: TFileStream Fehler ???

  Alt 9. Mär 2004, 19:43
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:

FS.Read(Result[1], Laenge);
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: TFileStream Fehler ???

  Alt 10. Mär 2004, 00:25
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?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:24 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