РЕШЕНИЕ НИЖЕ
Я искал по всей сети, чтобы найти решение для этого, но мне кажется довольно сложно получить ответ на этот вопрос в Delphi...
Пропустите это, если вы знакомы с Outlook
Некоторое объяснение перед: Папка контактов в Outlook организована как дерево папок в Windows. Контакты хранятся в самой папке контактов или во вложенных папках.
Мой код добавляет контакты из внешней базы данных в базу данных контактов Outlook. Чтобы предотвратить двойные записи, программа должна проверять все контакты и смотреть, может ли она найти «более старую» версию записи контакта и обновить ее, или, если нет, создать новую.
Поэтому я написал рекурсию, которая зацикливается. по папкам и проверяет контакты.
В папке вы можете получить подпапку (помимо следующей, предыдущей и последней)
Contacts:= Contacts.Folders.Getfirst
//Теперь выбранная папка является первой подпапкой в предыдущей выбранной папке
Если я пытаюсь получить какое-либо свойство этой подпапки, например «Items.Count» или что-то еще, возникает ошибка, потому что эта папка не существует.
Поэтому я хочу проверить, существует ли папка или нет, и перейти к зациклить эту подпапку, потому что в противном случае цикл прервется здесь и программа остановится.
Пропустите до этого места, если вы знакомы с работой Outlook
ПРОБЛЕМА:
В отладчике эта переменная контактов/папки (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)
var
val:TVarRec;
code:
val:=Contacts;
string(Contacts.VWideChar) = '$00000000'
var
vntNothing: OLEVariant;
code:
TVarData(vntNothing).VType := varDispatch;
TVarData(vntNothing).VDispatch := Nil;
Contacts = vntNothing
Контакты = не назначены
...
...
В VBA эта проблема имеет простое решение
если контакты = ничего
Но в Delphi нет "Ничего"...
Идеи?