Внешнее приложение: проверьте, существует ли папка Outlook - PullRequest
1 голос
/ 17 сентября 2010

РЕШЕНИЕ НИЖЕ

Я искал всю сеть, чтобы найти решение для этого, но мне кажется, довольно сложно получить ответ на этот вопрос в Delphi ...

Пропустите это, если вы знакомы с Outlook

Некоторое объяснение раньше: Папка контактов в Outlook организована как дерево папок в Windows. Контакты хранятся в самой папке контактов или в подпапках.

Мой код добавляет контакты из внешней базы данных в базу данных контактов Outlook. Для предотвращения двойных записей программа должна проверить все контакты и посмотреть, сможет ли она найти «старую» версию записи контакта и обновить ее, или, если нет, создать новую.
Поэтому я написал рекурсию, которая просматривает папки и проверяет контакты.

Внутри папки вы можете получить подпапку (кроме Next, Previous и Last)

Contacts:= Contacts.Folders.Getfirst

// Выбранная папка является первой подпапкой в ​​предыдущей выбранной папке

Если я пытаюсь получить какое-либо свойство этой подпапки, например «Items.Count» или что-то еще, возникает ошибка, поскольку эта папка не существует.
Поэтому я хочу проверить, существует папка или нет, и пропустить, чтобы перебрать эту подпапку, потому что в противном случае цикл прервется и программа остановится.

Пропустите здесь, если вы знакомы с работой Outlook
ПРОБЛЕМА:

В отладчике эта переменная Contacts / Folder (OleVariant, указатель на выбранную папку) содержит значения, подобные этому: '$ 0074974C'.
Если подпапка отсутствует, это значение возвращает «$ 00000000». Это похоже на указатель.

Как проверить, существует папка или нет?

const
  olFolderContacts = $0000000A;
var
  outlook, NameSpace, Contact, ContactsRoot, Contacts: OleVariant;

begin
Outlook := CreateOleObject('Outlook.Application');
NameSpace := Outlook.GetNameSpace('MAPI');
ContactsRoot := NameSpace.GetDefaultFolder(olFolderContacts);
Contacts:= ContactsRoot;
//We're now in the Contacts Folder
Contacts:= Contacts.folders.getfirst;
//First Subfolder

Что не сработало: Проверьте, если

Контакты = '$ 00000000' (в виде строки)

Контакты = '$ 00000000' (как OleVariant)

вар
Вал: TVarRec;
код:
Вал: = Контакты;
string (Contacts.VWideChar) = '$ 00000000'

вар * * тысяча пятьдесят один vntNothing: OLEVariant;
код:
TVarData (vntNothing) .VType: = varDispatch;
TVarData (vntNothing) .VDispatch: = ноль;
Контакты = vntNothing

Контакты = неназначенные
...
...

В VBA эта проблема имеет простое решение

если Контакты = Ничего

Но в Delphi нет «Ничего» ...

Идеи

Ответы [ 3 ]

4 голосов
/ 17 сентября 2010

Сначала вы можете проверить счет в коллекции папок:

if Contacts.Folders.Count = 0 then

или

Contacts := Contacts.Folders.GetFirst;
if VarIsClear(Contacts) then
1 голос
/ 17 сентября 2010

Вы можете попробовать это:

if IUnknown(Contacts) = nil then
  //
0 голосов
/ 17 сентября 2010
var  
x: string;  

в коде:

x:= format('%p%',[Pointer(TVarData(contacts).VDispatch)]);
if x = '00000000' then  
   'New Contact'  
else  
   'open folder and search within this one'

Сотрудник нашел решение

...