2010-09-17 163 views
1

SOLUTION低于外部应用程序:检查是否Outlook文件夹存在

我一直在寻找所有网找到了一个解决方案,但它似乎很很难得到这个答案的德尔福...

跳过此,如果你熟悉的Outlook

一些解释之前: Outlook中的联系人文件夹的组织像Windows中的foldertree。联系人存储在联系人文件夹本身或子文件夹中。

我的代码确实将外部数据库中的联系人添加到Outlook联系人数据库中。为了防止重复输入,程序应该检查所有联系人并查看它是否可以找到联系人条目的“旧”版本并更新它,如果没有,则创建一个新联系人条目。
因此我写了一个循环遍历文件夹并检查联系人的递归。

中的文件夹,你可以得到的子文件夹(除了下一首,上和Last)

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.VWideChar)= '$ 00000000'

变种
vntNothing:OLEVariant;
code:
TVarData(vntNothing)。VType:= varDispatch;
TVarData(vntNothing).VDispatch:= Nil;
联系人= vntNothing

联系=未分配
...
...

在VBA这个问题有一个简单的解决方案

如果联系人=无

但德尔福没有'Nothing'...

想法?

回答

4

,你可以先检查文件夹集合上的计数:

if Contacts.Folders.Count = 0 then 

Contacts := Contacts.Folders.GetFirst; 
if VarIsClear(Contacts) then 
0
var 
x: string; 

代码:

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

同事有解决方案..感谢您的时间:)

+1

为什么格式化字符串?如果可行,为什么不使用'Pointer(TVarData(Contacts).VDispatch)= nil'? – 2010-09-17 08:31:41

+0

认为它是我以前尝试寻找解决方案的剩余部分,您的解决方案稍微短一点,但也可以工作,谢谢:) – fps 2010-09-17 08:40:13

1

你可以试试这个:

if IUnknown(Contacts) = nil then 
    // 
+0

您的解决方案也适用,谢谢您的帮助。 – fps 2010-09-17 08:36:36

相关问题