OLE автоматизация: Как да проверите дали даден вариант препраща към обект за автоматизация

Бих искал да знам как мога да определя дали даден вариант препраща към OLE обект за автоматизация или не.

Експортирам някои графики на 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, Нищо, този въпрос, но не съм сигурен за това.


person beerwin    schedule 29.11.2013    source източник


Отговори (1)


Трябва да използвате VarIsClear за този тест.

Показва дали посоченият вариант има недефинирана стойност. VarIsClear връща true, ако стойността на дадения вариант е недефинирана. Стойността може да бъде недефинирана поради няколко причини:

  • Възможно е стойността на варианта да е зададена на Неприсвоено.
  • Стойността на варианта може да бъде тип интерфейс, който е зададен на нула (Delphi) или NULL (C++).
  • Вариантът може да е персонализиран вариант, който връща true от своя метод IsClear.

Във всички останали случаи резултатът от функцията е false.

Забележка: Не бъркайте неприсвоен вариант с нулев вариант. Вариант Null все още е присвоен, но има стойност Null. За разлика от неприсвоените варианти, нулевите варианти могат да се използват в изрази и могат да се преобразуват в други типове варианти.


Питам се обаче дали има нужда или не. Как е възможно PptFile да не е присвоено? Това може да се случи само ако извикването на pptApp.Presentations.Open() е неуспешно и това би предизвикало изключение. Или погрешно разбирам това? Понастоящем не виждам сценарий, при който бихте могли да стигнете до повикването до PptFile.SaveAs(), за което PptFile не е било присвоено.

person David Heffernan    schedule 29.11.2013
comment

std::array има семантика на стойността, докато необработените масиви нямат. Това означава, че можете да копирате std::array и да го третирате като примитивна стойност. Можете да ги получите по стойност или препратка като аргументи на функцията и можете да ги върнете по стойност.

Ако никога не копирате std::array, тогава няма разлика в производителността от необработен масив. Ако трябва да правите копия, тогава std::array ще направи правилното нещо и все пак трябва да дава еднаква производителност.

- person beerwin; 29.11.2013
comment
Тогава може да навиете своя собствена. Кодът гласи нещо подобно: Result := (VType = varEmpty) or (((VType = varDispatch) or (VType = varUnknown)) and (VDispatch = nil)) Сега, какво ще кажете за последния ми параграф? Наистина ли трябва да извършите тази проверка? - person David Heffernan; 29.11.2013
comment
Благодаря ти. Ще приема този отговор, тъй като има всичко (дори повече от това), от което имам нужда. PptFile не се присвоява, когато няма диаграми за експортиране. Знам, това е небрежно кодиране (не е написано от мен, просто трябва да добавя нещо към него и този проблем остава на пътя ми). Може да се наложи да преброя експортираните диаграми и ако броят е нула, пропуснете това PptFile.SaveAs(...). Благодаря ви за вашите усилия. - person beerwin; 29.11.2013
comment
Ако просто искате да откриете, че никога не сте присвоявали стойност, използвайте VarIsEmpty. Със сигурност това е в D5. - person David Heffernan; 29.11.2013
comment
Взех VarIsClear от библиотеката за изпълнение на FPC и работи извън кутията. Благодаря ти. - person beerwin; 29.11.2013