![]() |
Variant nach String und Zurück
Hallo,
gibt es irgendwas in Delphi um einen Variant in einen String zu konvertieren und wieder aus einen String den Variant? Also Typenkonform? Der TJsonSerializer überließt einen Variant ja einfach in einem Record. Ich muss einen Wert in ein Tabellenfeld vom Typ VarChar ablegen. Beim auslesen soll er natürlich dann nicht vom Typ String sein, sondern wieder vom ursprünglichen Typ. Der Wert kann ein Integer, Date, DateTime o.ä. sein. Bevor ich das selbst umsetze, dachte ich, frag ich mal nach. LG Oliver |
AW: Variant nach String und Zurück
Das kann nur funktionieren, wenn Du dir den ursprünglichen Typ des Variants (siehe
![]() |
AW: Variant nach String und Zurück
Zitat:
|
AW: Variant nach String und Zurück
Ich hab mal sowas Ähnliches gemacht, mit Pipe-Symbol als Type | Text Trenner, das scheint mir dafür am natürlichsten geeignet zu sein ( persönliche Meinung )
Wenn man solche unüblichen Trenner verwendet, kann man das zumindest relativ leicht, z.B. mit String.Split, wieder extrahieren. Also in etwa so:
Delphi-Quellcode:
var
LSt : String; begin // Typ Beschreibung // 1 = String // 2 = Integer LStr := '1|My Text'; // Der Typ ist ein String LStr := '2|12345'; // Der Typ ist ein Integer |
AW: Variant nach String und Zurück
Erstmal, wenn es automatisch konvertiert wird und z.B. auf einem anderen Rechner zurück, dann kann es knallen.
z.B. deutsches Windows System speichjert einen Float mit
Delphi-Quellcode:
als Dezimalseparator und im Englischen knallt es im besten Fall, aber vermutlich bekommst einfach nur den falschen Wert, weil ein englisches System das als Tausendertrennzeichen interpretiert.
,
Delphi-Quellcode:
geht meisten, aber knallt wenn NULL oder Empty oder es sich nicht nach String konvertieren lässt (Arrays und CustomTypes ohne passend registriertem Converter)
MyString := MyVariant;
Delphi-Quellcode:
geht natürlich immer
MyVariant := MyString;
und später dann z.B.
Delphi-Quellcode:
würde funktionieren, wenn es ein Byte/Word/Integer/... ist, bzw. wenn es sich dahin konverzieren lässt, wie z.B. eine Zahl '123' im String.
MyInteger := MyVariant;
Natürlich kann man auch direkt selber Konvertieren, also prüfen, ob der String einem bestimmten Format entspricht, das selbst konvertieren und dem Variant zuweisen.
Delphi-Quellcode:
if TryStrToInt(MyString, i) then
MyVariant := i else ... Na, natürlich kann man einem generischen Marker (Nummer oder Text) mit im String speicher, um zu wiessen, was es für ein Wert war. (z.B. siehe .reg-Dateien, wenn man dort DWORD oder binäre Werte exportiert/speichert) Auch die binäre Version der DFM speichert vor jedem Wert, was für ein Typ gleich folgt- |
AW: Variant nach String und Zurück
Zitat:
![]()
Delphi-Quellcode:
Bis bald...
uses
mormot.core.base, mormot.core.variants; var v: Variant; raw: RawByteString; begin v := Now; raw := VariantSave(v); VarClear(v); v := VariantLoad(raw, Nil); ShowMessage(Format('%d - %s', [VarType(v), VarTypeAsText(VarType(v))])); Thomas |
AW: Variant nach String und Zurück
Ok, danke für die Antworten.
Scheinbar hat Delphi nix im Standard, dann baue ich was selbst. Ich schau mir mal die mORMot2 an, aber eigenlich ist es ja recht simpel über den VarType. Ich dachte nur es gibt was Fertiges. Danke an alle. |
AW: Variant nach String und Zurück
|
AW: Variant nach String und Zurück
Zitat:
Bis bald... Thomas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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