AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Probleme beim Einlesen von einem File über Stream
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme beim Einlesen von einem File über Stream

Ein Thema von GuenterS · begonnen am 18. Jun 2005 · letzter Beitrag vom 18. Jun 2005
Antwort Antwort
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#1

Probleme beim Einlesen von einem File über Stream

  Alt 18. Jun 2005, 13:00
Hallo,

ich sitze gerade über einem Code für ein Informationsverwaltungssystem ähnlich wie Scribbles Papers und such und such und seh den Fehler nicht.

Ich versuch meine Objekte in einen FileStream zu schreiben und von dort wieder zu lesen

Meine Klasse:
Delphi-Quellcode:
  TEntryType = (etCATEGORY, etNOTICE, etURL, etFILE);

  TEntry = class(TObject)
  private
    FCaption: string;
    FEntryType: TEntryType;
    FEntryFolder: string;
    FEntryFilename: string;
    function getEntryFullFileName: string;
    function getDataSize: integer;
  public

    procedure SaveMeToFile(aSourceComponent: TComponent); virtual;
    procedure LoadMeFromFile(aTargetComponent: TComponent; const aFilename: string); virtual;

    property EntryType: TEntryType read FEntryType write FEntryType;
    property Caption: string read FCaption write FCaption;
    property EntryFolder: string read FEntryFolder write FEntryFolder;
    property EntryFilename: string read FEntryFilename write FEntryFilename;
    property EntryFullFileName: string read getEntryFullFileName;
    property DataSize: integer read getDataSize;
  end;
Probleme machen eigentlich nur die Methoden SaveMeToFile bzw. LoadMeFromFile. Die Parameter aSourceComponent und aTargetComponent spielen bei dieser Klasse nicht mit, dieser wird erst bei von TEntry abgeleiteten Klassen verwendet.

Methode SaveMeToFile:
Delphi-Quellcode:
procedure TEntry.SaveMeToFile(aSourceComponent: TComponent);
var
  lIntegerData: integer;
begin
  with TFileStream.Create(getEntryFullFileName, fmCreate) do
  try
    Seek(0, soFromBeginning);
    lIntegerData := Ord(FEntryType);
    WriteBuffer(lIntegerData, sizeOf(lIntegerData));
    lIntegerData := length(FCaption);
    WriteBuffer(lIntegerData, sizeOf(lIntegerData));
    WriteBuffer(FCaption, lIntegerData);
    lIntegerData := length(FEntryFolder);
    WriteBuffer(lIntegerData, sizeOf(lIntegerData));
    WriteBuffer(FEntryFolder, lIntegerData);
    lIntegerData := length(FEntryFilename);
    WriteBuffer(lIntegerData, sizeOf(lIntegerData));
    WriteBuffer(FEntryFilename, lIntegerData);
  finally
    Free;
  end;
end;
Es soll also zuerst der EntryType gespeichert werden, danach die Länge der Caption, dann die Caption selber, danach Länge des Foldernamen, Foldernamen, Länge des Filenamens, Filename.

Wenn ich mir die Textdatei anschau, seh ich eigentlich nicht das was ich erwartet habe. Ich bin schon durchgesteppt und habe mir zur Laufzeit die Werte von FEntryType und FCaption angeschaut, die sind zu diesem Zeitpunkt richtig.

Die Methode LoadMeFromFile mit der ich versuche das Objekt wieder zu laden:
Delphi-Quellcode:
procedure TEntry.LoadMeFromFile(aTargetComponent: TComponent; const aFilename: string);
var
  lIntegerData: integer;
begin
  with TFileStream.Create(aFilename, fmOpenRead) do
  try
    Seek(0, soFromBeginning);
    ReadBuffer(FEntryType, sizeOf(lIntegerData));
    ReadBuffer(lIntegerData, sizeOf(lIntegerData));
    setLength(FCaption, lIntegerData);
    ReadBuffer(FCaption[1], lIntegerData);
    ReadBuffer(lIntegerData, sizeOf(lIntegerData));
    setLength(FEntryFolder, lIntegerData);
    ReadBuffer(FEntryFolder[1], lIntegerData);
    ReadBuffer(lIntegerData, sizeOf(lIntegerData));
    setLength(FEntryFilename, lIntegerData);
    ReadBuffer(FEntryFileName[1], lIntegerData);
  finally
    Free;
  end;
end;
Da gehe ich wieder an den Anfang und lese zuerst den EntryType raus, danach die Länge der Überschrift, setze die Überschrift auf die Entsprechende Länge und lese sie dann aus, das geht für die anderen Properties sinngemäß so weiter.

Nur stimmen die Inhalte der Variablen nach dem Auslesen nicht mehr mit den Inhalten überein die ich geschrieben habe.


Vielleicht kann mir ja wer einen Tip geben, oder sagen (schreiben) was ich falsch mache.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#2

Re: Probleme beim Einlesen von einem File über Stream

  Alt 18. Jun 2005, 13:44
WriteBuffer(PChar(FCaption)^, lIntegerData); Mit deiner Variante schreibst du nur den Zeiger.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Probleme beim Einlesen von einem File über Stream

  Alt 18. Jun 2005, 13:57
Dankeschön, das funktioniert einwandfrei.

An und Für sich klar neuer Thread, aber es würd so gut dazupassen, dass ich doch hier eine zweite Frage stelle.


Wenn ich die String Variable in einen Record gebastelt hätte..

z.B.: so
Delphi-Quellcode:
   TData = record
      Caption: string;
   end;
Warum hätte dann
Delphi-Quellcode:
 ...
   var
     lData: TData;
     lIntegerData: integer;
   begin
      with TFileStream.Create(getEntryFullFileName, fmCreate) do
      try
        lData.Caption := 'TEST';
        lIntegerData := length(lData.Caption);
        WriteBuffer(lData.Caption, lIntegerData);
      finally
        Free;
      end;
   end;
 ...
funktioniert? So hatte ich es nämlich schon an anderer Stelle, in einer anderen Unit.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  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 05:06 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