2010-09-17 109 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

相關問題