AGB  ·  Datenschutz  ·  Impressum  







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

Daten an Datei anhängen

Ein Thema von svenwel.de · begonnen am 25. Mai 2005 · letzter Beitrag vom 26. Mai 2005
 
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Daten an Datei anhängen

  Alt 26. Mai 2005, 10:43
Ich als professioneller kleiner Klugscheisser würde sagen, das Sizeof(IntegerVariable) = SizeOf (Integer), aber egal:
Ich hatte das Posting von svenwel.de nicht richtig gelesen.

Also sven: Was Du da geschrieben hast, stammt nicht von meinem Pseudocode.
Teil 1: Code zerreissen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
// ***** TStream ist eine abstrakte Basisklasse. Nimm TFileStreams.
var FStream : TStream;
    Mstream : TMemoryStream;
    iMSize : integer;
begin
    Mstream := TMemoryStream.Create;
    opendialog1.Execute;
    FStream := TFileStream.Create(opendialog1.FileName,fmOpenReadWrite);

// *** Was ist, wenn hier schon was angehängt wurde ?
    FStream.Seek(0,soFromEnd);
 
    Memo1.Lines.SaveToStream(MStream);

    FStream.CopyFrom(MStream,0);
    iMSize := MStream.Size+sizeof(integer);
    Fstream.Write(iMSize,SizeOf(IMSize));

    MStream.Free;
    Fstream.Free;

end;

procedure TForm1.Button2Click(Sender: TObject);
var FStream : TStream;
    LStream : Tstream;
begin
   opendialog1.Execute;

   LStream := TStream.Create;

   FStream := TFileStream.Create(opendialog1.FileName,fmOpenReadWrite);

// **** Denkfehler, Du gehst ja nicht zum letzten DWORD, sondern zum VORLETZTEN!
// richtig sollte es heissen : FStream.Seek (SizeOf (Integer), soFromEnd);
   FStream.Seek(sizeof(integer)+4,soFromEnd);

// ***** Du musst doch erstmal die Datenlänge (iMSize) auslesen, das geht mit
// ***** FStream.Read (iMSize, SizeOf (Integer));
   LStream.CopyFrom(Fstream,SizeOf(Integer)-4);

// ***** Dann musst Du doch an den Anfang der Daten im FStream und DANN erst LStream einlesen, also:
// ***** FStream.Seek (iMSize, soFromEnd);
// ***** und dann iMSize-SizeOf (Integer) Bytes in LStream kopieren, also:
// ***** LStream.CopyFrom (FStream, iMSize - SizeOf (Integer));
   Memo2.Lines.LoadFromStream(LStream);

// ***** IMMER mit Try...Finally schützen...
   LStream.Free;
   Fstream.Free;

end;

Teil 2: Klugscheissen...
Also sieht der Code so aus:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  FStream : TFileStream;
  LStream : TStringStream;
  iMSize : Integer;

begin
   opendialog1.Execute;
   LStream := TStringStream.Create('');
   Try
     FStream := TFileStream.Create(opendialog1.FileName,fmOpenReadWrite);
     Try
// Wieviel Bytes sind denn in der angehängten Nachricht? Gehe zum letzen DWORD im Stream.
// Der fängt 4 Bytes von hinten gezählt an (sonst wärs ja nicht der letzte Integer)
       FStream.Seek (SizeOf (Integer), soFromEnd);
       FStream.Read (iMSize, SizeOf (Integer));
// So, dann setzen wir uns auf den Anfang der Daten.
       FStream.Seek (iMSize, soFromEnd);

// Wir haben ja 'Länge + 4 Bytes' in iMSize reingeschrieben (siehe oben), also lesen wir
// auch genau die Bytes wieder raus.
       LStream.CopyFrom (FStream, iMSize - SizeOf (Integer));

// Ein TStringstream ist ein bisserl schneller, weil ich den gelesenen String nicht *nochmal*
// kopiere. Soweit ich weiss, arbeiten die Strings mit Referenzzählern...
       Memo2.Lines.Text := LStream.DataString;
    Finally
      FStream.Free;
      End;
  Finally
    LStream.Free;
    End;
end;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
 


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:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz