AGB  ·  Datenschutz  ·  Impressum  







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

TStrings.SaveToStream von XE6 nach Rio

Ein Thema von dataspider · begonnen am 26. Mär 2019 · letzter Beitrag vom 2. Apr 2019
Antwort Antwort
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#1

TStrings.SaveToStream von XE6 nach Rio

  Alt 26. Mär 2019, 10:18
Delphi-Version: 10.2 Tokyo
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...
Frank Reim

Geändert von dataspider (26. Mär 2019 um 10:21 Uhr)
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
269 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TStrings.SaveToStream von XE6 nach Rio

  Alt 26. Mär 2019, 12:02
Also wenn ich nicht völlig blind bin, kommt "AsString" doch gar nicht in Deinem Quellcode vor. Wie kann es also da krachen?
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TStrings.SaveToStream von XE6 nach Rio

  Alt 26. Mär 2019, 12:43
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?
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TStrings.SaveToStream von XE6 nach Rio

  Alt 29. Mär 2019, 11:05
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
Miniaturansicht angehängter Grafiken
paramasstring.png  
Frank Reim
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.901 Beiträge
 
Delphi 12 Athens
 
#5

AW: TStrings.SaveToStream von XE6 nach Rio

  Alt 29. Mär 2019, 12:10
AStrings.SaveToStream(AStream); Könnte es sein das hier das explizite Encoding Sinn machen würde ?

AStrings.SaveToStream(AStream, TEncoding.UTF8);
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
481 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TStrings.SaveToStream von XE6 nach Rio

  Alt 1. Apr 2019, 13:36
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.
Dennis
  Mit Zitat antworten Zitat
Rudy Velthuis

Registriert seit: 10. Sep 2011
Ort: Gelsenkirchen
42 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: TStrings.SaveToStream von XE6 nach Rio

  Alt 1. Apr 2019, 19:28
[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.
Rudy Velthuis
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: TStrings.SaveToStream von XE6 nach Rio

  Alt 2. Apr 2019, 06:29
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
Frank Reim
  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 19:49 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