AGB  ·  Datenschutz  ·  Impressum  







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

Variant nach String und Zurück

Ein Thema von backdraft · begonnen am 20. Apr 2023 · letzter Beitrag vom 20. Apr 2023
Antwort Antwort
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
335 Beiträge
 
Delphi 11 Alexandria
 
#1

Variant nach String und Zurück

  Alt 20. Apr 2023, 15:23
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
Oliver
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
702 Beiträge
 
Delphi 12 Athens
 
#2

AW: Variant nach String und Zurück

  Alt 20. Apr 2023, 17:43
Das kann nur funktionieren, wenn Du dir den ursprünglichen Typ des Variants (siehe VarType Funktion) irgendwo merkst, woher soll man sonst an einem String erkennen ob und wenn ja welcher Datentyp er mal war? Es gibt auch eine VarAsType-Funktion, mit der man den Inhalt eines Variant konvertieren kann, aber das kann natürlich fehlschlagen...
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: Variant nach String und Zurück

  Alt 20. Apr 2023, 18:53
woher soll man sonst an einem String erkennen ob und wenn ja welcher Datentyp er mal war?
Indem man den Datentyp in den String schreibt?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.094 Beiträge
 
Delphi 12 Athens
 
#4

AW: Variant nach String und Zurück

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

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

AW: Variant nach String und Zurück

  Alt 20. Apr 2023, 19:26
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 , 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.

MyString := MyVariant; geht meisten, aber knallt wenn NULL oder Empty oder es sich nicht nach String konvertieren lässt (Arrays und CustomTypes ohne passend registriertem Converter)

MyVariant := MyString; geht natürlich immer
und später dann z.B. MyInteger := MyVariant; 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.


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-
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (20. Apr 2023 um 19:28 Uhr)
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#6

AW: Variant nach String und Zurück

  Alt 20. Apr 2023, 21:22
gibt es irgendwas in Delphi um einen Variant in einen String zu konvertieren und wieder aus einen String den Variant?
Also Typenkonform?
Gibt es in mORMot2.
Delphi-Quellcode:
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))]));
Bis bald...
Thomas

Geändert von mytbo (20. Apr 2023 um 21:26 Uhr)
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
335 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Variant nach String und Zurück

  Alt 20. Apr 2023, 22:04
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.
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Variant nach String und Zurück

  Alt 20. Apr 2023, 22:40
Delphi-Referenz durchsuchenTValue
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#9

AW: Variant nach String und Zurück

  Alt 20. Apr 2023, 23:02
Ich schau mir mal die mORMot2 an, aber eigenlich ist es ja recht simpel über den VarType.
Die Funktionen sind nur Wrapper für BinarySave und BinaryLoad. Es gibt auch BinarySaveBytes, BinarySaveBase64, BinaryLoadBase64. mORMot gibt es seit fast 15 Jahren (nicht unter diesem Namen). Es ist bei mir immer dabei. Bei äquivalenten Funktionen sehen die Delphi Bordmittel oft ganz schön alt aus. Außerdem hat mORMot vieles, was Delphi gar nicht kennt.

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Alt 22. Jun 2023, 10:08     Erstellt von dilpot
Dieser Beitrag wurde von TBx gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
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 01:07 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