AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Problem beim Lesen (und schreiben?) von Stream
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim Lesen (und schreiben?) von Stream

Ein Thema von e-gon · begonnen am 13. Apr 2021 · letzter Beitrag vom 14. Apr 2021
Antwort Antwort
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#1

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

  Alt 13. Apr 2021, 14:51
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.
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
493 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 13. Apr 2021, 15:20
Beim Einlesen der Strings sollte nicht Result, sondern Result[1] verwendet werden, da hier der Zeichenpuffer des Ansistrings beginnt.
Delphi-Quellcode:
 function LoadStrFromStream(const st: TMemoryStream): AnsiString;
  var l: LongInt;
  begin
    st.ReadBuffer(l, SizeOf(l)); // -> beim ersten Durchlauf knallt es hier dann
    SetLength(Result, l);
    if l>0 then st.ReadBuffer(Result[1] ,l);
  end;
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
722 Beiträge
 
Delphi XE5 Professional
 
#3

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

  Alt 13. Apr 2021, 15:31
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
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
493 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 13. Apr 2021, 15:37
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.
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
722 Beiträge
 
Delphi XE5 Professional
 
#5

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

  Alt 13. Apr 2021, 16:05
Du hast recht, BerndS: Ich habe den AnsiString nicht beachtet...
Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
722 Beiträge
 
Delphi XE5 Professional
 
#6

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

  Alt 13. Apr 2021, 16:11
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
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 (13. Apr 2021 um 16:29 Uhr)
  Mit Zitat antworten Zitat
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#7

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

  Alt 13. Apr 2021, 16:20
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.373 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 13. Apr 2021, 16:25
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.


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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (13. Apr 2021 um 16:29 Uhr)
  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 00:03 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