Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStrings.SaveToStream von XE6 nach Rio (https://www.delphipraxis.net/200167-tstrings-savetostream-von-xe6-nach-rio.html)

dataspider 26. Mär 2019 10:18

Delphi-Version: 10.2 Tokyo

TStrings.SaveToStream von XE6 nach Rio
 
Hallo

Ich habe mein Projekt von XE6 nach Rio portiert.
Zum Setzen von Parametern des Typs Blob hatte ich mir einen Helper geschrieben:

Delphi-Quellcode:
procedure TParamHelper.LoadFromStrings(const AStrings: TStringList);
Var
  AStream: TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  try
    AStrings.SaveToStream(AStream);
    AStream.Position := 0;
    LoadFromStream(AStream, ftBlob);
  finally
    AStream.Free;
  end;
end;
Jetzt knallt es hier und der Debugger zeigt mit den Parameter bei AsString "chinesisch" an.
Hat sich diesbezüglich zwischen XE6 und Rio etwas geändert?
Ich dachte, die Unicode - Geschichte war da schon lange durch...

Ist Param.AsString := StringList.Text an dieser Stelle sinvoller?

Danke

Frank

[Edit] Bei der Version kann man Rio noch nicht auswählen...

freejay 26. Mär 2019 12:02

AW: TStrings.SaveToStream von XE6 nach Rio
 
Also wenn ich nicht völlig blind bin, kommt "AsString" doch gar nicht in Deinem Quellcode vor. Wie kann es also da krachen? :?

hoika 26. Mär 2019 12:43

AW: TStrings.SaveToStream von XE6 nach Rio
 
Hallo,
es besteht doch aber ein Unterschied zwischen

SaveToStream -> ParamByName().LoadFromStream
und
ParamByName().AsString := StringList.Text

oder irre ich mich da jetzt ?

Ich würde mal nach dem SaveToStream nachschauen, wie groß AStream.Size ist.


Und ja, was hat AsString mit dem Class helper zu tun.
Wie hast du denn TParamHelper.LoadFromStrings definiert?

dataspider 29. Mär 2019 11:05

AW: TStrings.SaveToStream von XE6 nach Rio
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von freejay (Beitrag 1428747)
Also wenn ich nicht völlig blind bin, kommt "AsString" doch gar nicht in Deinem Quellcode vor. Wie kann es also da krachen? :?

Sorry

Ich hätte es deutlicher ausdrücken sollen.
Ist eine eifache Zuweisung mit AsString sinnvoller als der Umweg über Stream.

Ich habe vor ein paar Jahren bei der Umstellung auf Unicode (Delphi 2010 auf XE4) den ParamHelper eingeführt,
da ich - nur bei Stored Procedures - alle Stellen im Code ändern musste, wo ich einem TParam (Memo) Text aus einer Stringliste zugewiesen habe.
Die Texte sahen dann aus wie im Anhang.
Paramter in Querys waren komischerweise nicht betroffen.
Der Helper hat wie gesagt bis XE6 funktioniert.

Nun hat sich das umgekehrt.
Jetzt liefert mir der Helper den String wie im Anhang.

Delphi-Quellcode:
procedure TParamHelper.LoadFromStrings(const AStrings: TStringList);
Var
  AStream: TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  try
    AStrings.SaveToStream(AStream);
    AStream.Position := 0;
    LoadFromStream(AStream, ftBlob);
    // Value liefert mir im Debugger: Variant array of Byte
    // AsString liefert mir: siehe Anhang
  finally
    AStream.Free;
  end;
end;
Ich habe zwar auch die DB - Zugriffskomponenten erneuert, aber da ja TParam von Delphi kommt, habe ich die als Verdächtige ausgeschlossen.

Ich habe jetzt wieder die direkte Zuweisung mit AsString eingeführt und es funktioniert wieder.
Ich ärgere mich nur, dass ich den Grund des Verhaltens nicht erkenne.

ALso, Danke für die Antworten. Ich hoffe, ich habe mich etwas verständlicher ausgedrückt.

Frank

Rollo62 29. Mär 2019 12:10

AW: TStrings.SaveToStream von XE6 nach Rio
 
Delphi-Quellcode:
AStrings.SaveToStream(AStream);
Könnte es sein das hier das explizite Encoding Sinn machen würde ?

Delphi-Quellcode:
AStrings.SaveToStream(AStream, TEncoding.UTF8);

Dennis07 1. Apr 2019 13:36

AW: TStrings.SaveToStream von XE6 nach Rio
 
Also es wurden einige Bugs mit TStrings in 10.3.1 behoben. Generell ja ein sehr margeres Update mit weiterhin vielen Bugs, und eventuell haben die damit etwas an anderer Stelle zerschossen.

Rudy Velthuis 1. Apr 2019 19:28

AW: TStrings.SaveToStream von XE6 nach Rio
 
[QUOTE=dataspider;1428722]Hallo

Delphi-Quellcode:
procedure TParamHelper.LoadFromStrings(const AStrings: TStringList);
Var
  AStream: TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  try
    AStrings.SaveToStream(AStream);
    AStream.Position := 0;
    LoadFromStream(AStream, ftBlob);
  finally
    AStream.Free;
  end;
end;
Was war denn der Inhalt von der TStringList? Man kann das doch ziemlich leicht debuggen, also würde ich mir mal die Debug-DCUs hinzulinken und dann mal nachsehen, was da geschieht. Debuggen in Delphi ist VIEL leichter als in anderen IDEs.

Ich würde mir in einer Watch AStrings.Text anzeigen lassen.

dataspider 2. Apr 2019 06:29

AW: TStrings.SaveToStream von XE6 nach Rio
 
Habe ich natürlich schon gemacht.
In der Stringliste ist der Text OK.
Auch von der Stringliste in den STream ist alles OK.
Erst vom Stream in TParam erfolgt die Umwandlung.

Auch AStrings.SaveToStream mit TEncoding ändert nichts.

Ich vermute, dass Änderungen in TStream die Ursache sind.
Ich habe da einige Änderungen entdeckt (z.B. ReadBufferData), die darauf hindeuten.
Das kann ich aber erst morgen an meinem alten Laptop mit XE6 checken.

Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:18 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