2014-11-04 3 views
6

Ich schreibe eine pascal Funktion Studio mit Inno Setup, der überprüft, ob ein Objekt null ist und tut etwasWie überprüft man, ob ein Objekt in Inno Setup Pascal Script NULL ist?

so weit ich habe:

XMLDocument.setProperty('SelectionLanguage', 'XPath'); 
XMLNode := XMLDocument.selectSingleNode(APath); 
if (XMLNode=Null) then 
begin 
//do stuff 
End 
Else 
//do other stuff 
End 

aber ich erhalte immer invalid variant operation Fehler.

Wie überprüfe ich, ob ein Objekt im Inno Setup Pascal Script-Code null ist?

+1

Nicht zugewiesenes Objekt bezieht sich auf "Null". 'NULL' ist eine Funktion, die eine 'NULL'-Variante zurückgibt. Sie wollten also 'if (XMLNode = nil) then 'oder' falls nicht Assigned (XMLNode) then' schreiben, was dasselbe tut. – TLama

+0

@TLama Ich bekomme 'Type Mistmatch', wenn ich versuche, den Code zu kompilieren, wenn ich ihn zu dem ändere, was Sie vorschlagen? – user1

+0

Nun, beginnen wir damit, uns zu sagen, was der Compiler ist, den Sie verwenden. FreePascal, Delphi oder etwas anderes? Bitte editiere deine Frage-Tags. – TLama

Antwort

10

Zur Überprüfung, ob ein Variant ist NULL die VarIsNull Funktion:

if VarIsNull(XMLNode) then 

in Ihrem Fall jedoch ist das Problem etwas komplizierter. Die selectSingleNode-Methode gibt immer eine Variante des Typs varDispatch zurück, deren tatsächlicher Datenzeiger auf einen gefundenen XML-DOM-Knoten zeigt, oder nil, falls kein solcher Knoten gefunden wird. In Delphi (Sprache, in der Inno Setup Pascal Script geschrieben ist) gibt es die VarIsClear Funktion, die auch solche Situationen abdeckt. Leider wird es nicht in Inno Setup veröffentlicht. Sie können jedoch diesen Fall testen mit einer Aussage wie folgt aus:

if (IDispatch(XMLNode) = nil) then 

, dass die Daten aus dem zurück varDispatch Variante und diese Daten Test für nil bekommen.


Martijn Laan hinzugefügt, um die VarIsClear Funktion Unicode-Version von Inno Setup in this commit, so da Inno Setup 5.5.6 Sie VarIsClear anstelle des oben Hack verwenden können.

+0

Ich denke, du hast mein Problem vorausgesehen. Laut der [DOM XML-Dokumentation] (http://msdn.microsoft.com/en-us/library/ms757846 (v = vs.85) .aspx) gibt selectSingleNode null zurück. Aber aus irgendeinem Grund gibt mein Programm gerade keinen Wert zu, wenn der Xpath-Knoten nicht existiert, deshalb brauchte ich 'VarIsEmpty', aber das ist die richtige Antwort für die Frage, die ich gestellt habe. Vielen Dank! – user1

+0

Gern geschehen! Nun, das Problem ist ein bisschen tiefer. Der vom Aufruf 'selectSingleNode' zurückgegebene Wert (bei Verwendung der späten Bindung) hat immer den Typ 'varDispatch' (selbst wenn der Knoten nicht gefunden wird). Das Testen mit 'VarIsNull' oder' VarIsEmpty' wird trotzdem fehlschlagen. Sie müssen auf diese Wertdaten der Variablen 'varDispatch' zugreifen und prüfen, ob sie 'nil' ist. Siehe das Update. – TLama

+0

Danke für das Update. In meinem Fall, wenn ich IDispatch verwende, bekomme ich 'Type Mismatch', aber wenn ich' VarIsEmpty' verwende, funktioniert es tatsächlich. d. h. in meiner Anwendung, wenn das Element nicht existiert, füge ich Element ein, sonst aktualisiere ich und zeige verschiedene Meldungsfelder an. und 'varisEmpty' scheint zu funktionieren. Danke für die Info, ich werde weiter darauf schauen – user1

Verwandte Themen