2013-11-29 11 views
1

Я хотел бы знать, как определить, относится ли вариант к объекту автоматизации OLE, или нет.OLE automation: как проверить, ссылается ли вариант объекта автоматизации

Я экспортирую графики Excel в Powerpoint.

У меня есть этот код:

var PptFile: Variant; 

.... 

// PptFile _might_ be initialized: 

PptFile:=pptApp.Presentations.Open(pptFilename); 

// It depends on whether the export has items which need to be exported to 
// Powerpoint or not 

.... 

// I would like to determine if PptFile does reference an OLE automated object or not 
PptFile.SaveAs(excelFileName+'.pptx'); 

Я знаю, это может быть сделано путем размещения последней строки кода (с SAVEAS) между try...except...end, но я не чувствую, что такой подход является достаточно хорошим.

Я читал о VarIsEmpty, VarIsEmptyParam, Nothing, this question, но я не уверен в этом.

ответ

5

Для этого теста вы должны использовать VarIsClear.

Указывает, имеет ли указанный вариант неопределенное значение. Функция VarIsClear возвращает true, если значение данного варианта не определено. Значение может быть определена для любого из нескольких причин:

  • Вариант, возможно, было его значение, установленное в Unassigned.
  • Значение Variant может быть типом интерфейса, который был установлен равным nil (Delphi) или NULL (C++).
  • Вариант может быть настраиваемым вариантом, который возвращает true из его метода IsClear.

Во всех остальных случаях результат функции является ложным.

Примечание: Не путайте неназначенный вариант с вариантом Null. Вариант Null по-прежнему назначен, но имеет значение Null. В отличие от неназначенных вариантов, варианты Null могут использоваться в выражениях и могут быть преобразованы в другие типы вариантов.


Однако, я вопрос, является ли она или нет необходимости. Как могло случиться так, что PptFile не был назначен? Это может произойти только в случае сбоя вызова pptApp.Presentations.Open(), и это вызовет исключение. Или я неправильно понимаю это? В настоящий момент я не могу увидеть какой-либо сценарий, в котором вы могли бы позвонить до PptFile.SaveAs(), для которого PptFile не был назначен.

+0

Кажется, что у моего Delphi 5 нет функции VarIsClear. – beerwin

+0

Тогда вы можете бросить свои собственные. Код читает примерно так: 'Результат: = (VType = varEmpty) или (((VType = varDispatch) или (VType = varUnknown)) и (VDispatch = nil))' Теперь, как насчет моего последнего абзаца? Вам действительно нужно выполнить эту проверку? –

+0

Спасибо. Я соглашусь с этим ответом, поскольку у него есть все (даже больше того), в котором я нуждаюсь. 'PptFile' не назначается, когда нет графиков для экспорта. Я знаю, это небрежное кодирование (не написанное мной, мне просто нужно что-то добавить к нему, и эта проблема остается на моем пути). Я мог бы рассчитывать экспортированные диаграммы, а если число равно нулю, пропустите этот 'PptFile.SaveAs (...)'. Спасибо за ваши усилия. – beerwin

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