2014-11-04 3 views
6

Я пишу паскаль функцию с помощью Inno установки студии, которая проверяет, является ли объект недействительным и делает что-тоКак проверить, является ли объект NULL в Inno Setup Pascal Script?

до сих пор у меня есть:

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

, но я получаю ошибку invalid variant operation.

Как проверить, нет ли объекта в Inno Setup Pascal Script code?

+1

Неназначенный объект относится к 'nil'. 'NULL' - это функция, которая возвращает вариант« NULL ». Поэтому вы хотели написать 'if (XMLNode = nil) then', или' if not Assigned (XMLNode) then', который делает то же самое. – TLama

+0

@TLama Я получаю 'Тип Mistmatch' при попытке скомпилировать код, если я изменю его на то, что вы предлагаете? – user1

+0

Хорошо, давайте начнем с того, чтобы рассказать нам, что такое компилятор, который вы используете. FreePascal, Delphi или что-то еще? Измените свои теги вопросов. – TLama

ответ

10

Для проверки, если Variant является NULL использовать VarIsNull функцию:

if VarIsNull(XMLNode) then 

Однако в вашем случае, проблема немного сложнее. Метод selectSingleNode всегда возвращает вариант типа varDispatch, чей фактический указатель данных указывает на найденный узел XML DOM, или на nil, если такой узел не найден. В Delphi (язык, на котором написан скрипт Inno Setup Pascal) есть функция VarIsClear, которая также охватывает такую ​​ситуацию. К сожалению, он не опубликован в Inno Setup. Однако вы можете проверить это дело с утверждением, как это:

if (IDispatch(XMLNode) = nil) then 

Это позволит получить данные из возвращенного varDispatch варианта и те испытания данных для nil.


Мартейн Лан добавила VarIsClear функции до версии Юникода Setup Inno в this commit, поэтому с момента установки Inno 5.5.6 вы можете использовать VarIsClear вместо указанного выше хака.

+0

Я думаю, вы предвидели мою проблему. Согласно документации DOM XML (http://msdn.microsoft.com/en-us/library/ms757846 (v = vs.85) .aspx) selectSingleNode возвращает значение null. Но по какой-то причине моя программа на самом деле просто не назначает значение, если узел xpath не существует, поэтому я действительно нуждался в «VarIsEmpty», но это правильный ответ на вопрос, который я задал. Благодаря! – user1

+0

Добро пожаловать! Ну, проблема немного глубже. Значение, возвращаемое вызовом 'selectSingleNode' (при использовании позднего связывания), всегда имеет тип' varDispatch' (даже если узел не найден). Тестирование с помощью VarIsNull или VarIsEmpty приведет к сбою. Вам нужно получить доступ к этим данным значения варианта varDispatch и проверить, является ли его 'nil'. См. Обновление. – TLama

+0

Спасибо за обновление. В моем случае, если я перейду на использование IDispatch, я получаю 'Type Mismatch', но если я использую' VarIsEmpty', он действительно работает. то есть в моем приложении, если элемент не существует, я вставляю элемент else, который я обновляю и отображаю различные окна сообщений. и 'varIsEmpty', похоже, работает. Спасибо за информацию, которую я буду смотреть дальше. – user1

Смежные вопросы