![]() |
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:
Jetzt knallt es hier und der Debugger zeigt mit den Parameter bei AsString "chinesisch" an.
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; 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... |
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? :?
|
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? |
AW: TStrings.SaveToStream von XE6 nach Rio
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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:
Ich habe zwar auch die DB - Zugriffskomponenten erneuert, aber da ja TParam von Delphi kommt, habe ich die als Verdächtige ausgeschlossen.
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 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 |
AW: TStrings.SaveToStream von XE6 nach Rio
Delphi-Quellcode:
Könnte es sein das hier das explizite Encoding Sinn machen würde ?
AStrings.SaveToStream(AStream);
Delphi-Quellcode:
AStrings.SaveToStream(AStream, TEncoding.UTF8);
|
AW: TStrings.SaveToStream von XE6 nach Rio
Also es wurden einige Bugs mit TStrings in
![]() |
AW: TStrings.SaveToStream von XE6 nach Rio
[QUOTE=dataspider;1428722]Hallo
Delphi-Quellcode:
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.
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; Ich würde mir in einer Watch AStrings.Text anzeigen lassen. |
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 10:38 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 by Thomas Breitkreuz