Varianten machen immer Spaß, was?
Ich arbeite an einer Legacy-Anwendung, die zuletzt in D2007 war, um sie nach Delphi XE zu migrieren.
Die Varianten haben sich in der Zwischenzeit ziemlich verändert.
Diese Codezeile:
%Vor%hat in D2007 True zurückgegeben und ist beendet, in Delphi XE jedoch nicht.
Ich habe es so geändert:
%Vor%Ich bin nicht überzeugt, dass dies der "beste" Weg ist. Die Variants-Einheit hat keinen speziellen Aufruf, um dies zu tun, und ich erinnere mich sicher, dass dies ein Problem für Leute in der Vergangenheit ist. Eine Suche ergab jedoch keine Bibliotheksfunktion oder irgendeinen anderen akzeptierten Weg.
Gibt es einen "richtigen" oder besseren Weg?
Aktualisiert: String-spezifisch, um Ausnahmen zu vermeiden:
%Vor%Update3: Wenn Sie eine bessere Leistung und weniger String-Heap-Speicherverschwendung wünschen, versuchen Sie dies. Stellen Sie sich vor, dass die Strings 64K lang sind. Der obige Code tut eine VarToStr und reserviert vielleicht 64K UnicodeString-Heap-Speicher, um die Daten zu halten, nur so können wir nur nach dem Null-Terminator am Ende der Zeichenfolge für BSTR und nach Null-Zeigern für andere Typen suchen.
Der unten stehende Code ist insofern etwas merkwürdig, als man nicht häufig in die interne Darstellung von Varianten eingreift, aber David hat auf die Fehler hingewiesen und ich habe es erneut getestet und es scheint zu funktionieren, obwohl keine Garantie gegeben wird oder angedeutet. Ein Unit Test für diesen Welpen wäre gut. Zu einem späteren Zeitpunkt, wenn sich Delphi RTL-Götter dazu entschlossen haben, die interne Repräsentation der Variant-Strukturfelder umzubenennen, müsste der folgende Code geändert werden.
%Vor% VarIsStr
ist ein vollkommen plausibler Weg, dies zu tun. Dies wird implementiert als:
Die Änderung, die Sie sehen, liegt natürlich an den Unicode-Änderungen in D2009 und nicht an den Varianten. Ihre Zeichenfolge lautet varUString
, aka UnicodeString
. Natürlich nimmt VarIsStr
auch AnsiString/varString
und WideString/BSTR/varOleStr
auf.
Wenn Sie eine wirklich originalgetreue Konvertierung Ihres Delphi 2007-Codes wünschen, dann schreiben Sie:
%Vor% Genau das, was Sie tun müssen, können Sie nur wissen, aber das Wichtigste ist, dass Sie die neu angekommene varUString
berücksichtigen müssen.