Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem beim Lesen (und schreiben?) von Stream (https://www.delphipraxis.net/207597-problem-beim-lesen-und-schreiben-von-stream.html)

Andreas13 13. Apr 2021 15:31

AW: Problem beim Lesen (und schreiben?) von Stream
 
Das erste Zeichen des Puffers ist 0 mund nicht 1. Der Positionszeiger muss auf 0 gesetzt werden:
Delphi-Quellcode:
 function LoadStrFromStream(Const St: TMemoryStream): AnsiString;
  var Len: LongInt;
  begin
    St.Position:= 0;
    St.ReadBuffer(Len, SizeOf(Len));
    SetLength(Result, Len);

    If Len > 0 Then
      St.ReadBuffer(Result[0] , Len*SizeOf(Result[0]));
  end;
Gruß, Andreas

BerndS 13. Apr 2021 15:37

AW: Problem beim Lesen (und schreiben?) von Stream
 
Bei einem Shortstring ist Index 0 das Längenbyte und danach kommen die Zeichen. Bei Strings und Ansistrings beginnt der Puffer ebenfalls bei 1.
Teste es mal im Debugger. Ich habe es natürlich zuvor getestet.

Andreas13 13. Apr 2021 16:05

AW: Problem beim Lesen (und schreiben?) von Stream
 
Du hast recht, BerndS: Ich habe den AnsiString nicht beachtet...:oops:
Andreas

Andreas13 13. Apr 2021 16:11

AW: Problem beim Lesen (und schreiben?) von Stream
 
Ganz allgemein könnte man es evtl. so schreiben:
Delphi-Quellcode:
...
If Len > 0 Then
      St.ReadBuffer(Result[Low(Result)] , Len*SizeOf(Result[Low(Result)]));
damit das Lesen für jedwenden BufferType funktioniert.
Andreas

e-gon 13. Apr 2021 16:20

AW: Problem beim Lesen (und schreiben?) von Stream
 
Hallo,

vielen Dank für Eure ganzen Antworten!

Ein kleines Problem habe ich da allerdings noch:
Weiß jemand wie ich die Einstellungen eines Font abspeichere? Font.SaveToStream gibt es leider nicht. Und auch Stream.WriteComponent will nicht funktionieren...

Gruß
e-gon

himitsu 13. Apr 2021 16:25

AW: Problem beim Lesen (und schreiben?) von Stream
 
Schau dir mal TReader und TWriter an ... das nimmt auch Delphi, um die DFM zu speichern (wobei hier das Binär raus kommt, aber in Text konvertriert werden kann)
Und es gibt auch Mapper für XML oder JSON, um Objekte zu (de)serialisieren.


Delphi-Quellcode:
ReadOrWrite(Pointer(S), Length(S)*StringElementSize(S));
funktioniert mit allen Delphi-Strings (außer ShortString)

aber generell ist es besser statt Pointer das passende PChar/PAnsiChar/PWideChar zu verwenden.


Delphi-Quellcode:
ReadOrWrite(PChar(S), Length(S)*SizeOf(Char)); // String
ReadOrWrite(PAnsiChar(A), Length(A){*SizeOf(AnsiChar)}); // AnsiString
ReadOrWrite(PWideChar(U), Length(U)*SizeOf(WideChar)); // UnicodeString und WideString
und z.B. bei typlosen VAR-Parametern noch ein ^ hinten dran, an den Cast.

KodeZwerg 13. Apr 2021 18:02

AW: Problem beim Lesen (und schreiben?) von Stream
 
Zitat:

Zitat von e-gon (Beitrag 1487060)
Hallo KodeZwerg,

Du meinst einen temporären Ordner erstellen, dort alles getrennt speichern, den kompletten Ordner zippen und diesen dann wieder löschen?

Das hätte natürlich den Vorteil, dass man zur Not auch ohne den Editor an die Daten herankäme.

Andererseits stehe ich nicht so auf Temporäre Dateien und außerdem ist die Festplatte doch langsamer als der Arbeitsspeicher.

Muss mal in mich gehen...

Zitat:

Zitat von Delphi.Narium (Beitrag 1487061)
Für die Arbeit mit ZIP-Archiven braucht man keinen temporären Ordner oder temporäre Dateien. Man kann auch einen Stream direkt ins ZIP packen.

Auf der Festplatte entsteht nur die ZIP-Datei.

da ich nicht genau weiß wie er das meint, schrieb ich's halt mit temp ordner.
.zip kann vollkommen per TStream abgewickelt werden, laden speichern löschen whatever.
ob nun text bilder oder whatever.
ich finde es ist die einfachste möglichkeit damit umzugehen, da die eigentliche datei (das archiv) eh mitgegeben werden muss. (ob nun zip zlib whatever)
eine font ist meist eine ttf datei, die einfach mit ins archiv, fertig.

e-gon 13. Apr 2021 18:28

AW: Problem beim Lesen (und schreiben?) von Stream
 
Hallo zusammen,

vielen lieben Dank für die ganzen Antworten!

Ich muss das jetzt erstmal alles ausprobieren und verstehen. Bis evtl. noch Fragen aufkommen lösche ich die Markierung zur offenen Frage.

Danke nochmals an alle! :thumb:

Gruß
e-gon

Frickler 14. Apr 2021 11:04

AW: Problem beim Lesen (und schreiben?) von Stream
 
Vielleicht anstelle einer Menge von Dateien eine einzelne Datei schreiben/lesen: eine SQLite Datenbank.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.
Seite 2 von 2     12   

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