Die Prüfung für die Variante mit dem Wert "Nichts"
Dies ist etwas, das ich lief in letzten Jahr, und SO scheint wie ein guter Ort, um es zu dokumentieren 🙂
Q: Bei der Automatisierung von Excel/Word/...) von Delphi, wie kann ich überprüfen, ob eine Excel-Funktion zurückgegeben, die Variante Nothing
(wie es heißt in VBA)?
InformationsquelleAutor |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
VarIsClear
Funktion umfasst Ihre situation, wo der Typ istvarDispatch
und der Wert istnil
. Es enthält auch leer und "unbekannt" Werte und benutzerdefinierte variant-Typen. Ich sehe es in meinem Delphi 2005 Quelle; ich weiß nicht, wie viel früher es war.InformationsquelleAutor
Neugierig, VBA ist
Nothing
ist nicht das gleiche wieUnassigned
,Null
oderEmpty
, so dass Sie nicht verwenden können, z.B.:Stattdessen verwenden Sie diese Funktion:
Update
Offenbar die Quellen der RTL-Einheit
Variants.pas
geändert haben zwischen Delphi 5 und 2007. Laut @mghie (siehe Kommentare), um die FunktionVarIsEmpty
hätte die Arbeit getan, in D5. Jedoch, in D2007, scheint dies nicht mehr der Fall, so dass Sie wahrscheinlich benötigen die oben beschriebenen Funktionen wieder.Beachten Sie auch, dass VBA die
Nothing
ist wohl ein Sonderfall; ich denke nicht, dass trifft es zu oft mit der Automatisierung.Ich bin mir ziemlich sicher, dass Sie nicht die Arbeit mit diesen lästigen
Nothing
Wert 🙂Gut, haben einen Blick auf den Quellcode von VarIsEmpty() - es ist eine Obermenge des Codes, zumindest in der Delphi 5-version ich freue mich auf jetzt...
Neugierig... Mein D2007 Quellen sagen
Result := FindVarData(V)^.VType = varEmpty;
, das ist definitiv etwas anderes... Ist es das?In der Tat. Delphi 5 hat, was die Funktion tut, aber darüber hinaus prüft varEmpty und varUnknown. Trotzdem habe ich Zweifel, dass eine solche Veränderung hätte das gemacht, wenn es führte zu veränderten Verhaltens. Oder wäre das mir zu blauäugig?
InformationsquelleAutor
Tut VarIsEmpty (anders als VarIsNull) nicht tun, was Sie wollen?
Nein, ich bin mir ziemlich sicher, dass
Empty
ist etwas ganz anderes alsNothing
--- letzteres scheint nicht zu haben beliebiger äquivalent in Delphi. (Ich könnte falsch sein, natürlich, aber ich bin mir ziemlich sicher, dass ich geprüft). Danke, aber!InformationsquelleAutor