【问题标题】:External App: Check if an Outlook Folder exists外部应用程序:检查 Outlook 文件夹是否存在
【发布时间】:2011-04-13 14:37:16
【问题描述】:

以下解决方案

我一直在网上寻找解决方案,但在 Delphi 中似乎很难找到答案......

如果您熟悉 Outlook,请跳过此步骤

之前的一些解释: Outlook 中的联系人文件夹的组织方式类似于 Windows 中的文件夹树。联系人存储在联系人文件夹本身或子文件夹中。

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

在文件夹中,您可以通过(除了 Next、Previous 和 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)

变量
val:TVarRec;
代码:
val:=联系人;
string(Contacts.VWideChar) = '$00000000'

变量
vntNothing: OLEVariant;
代码:
TVarData(vntNothing).VType := varDispatch;
TVarData(vntNothing).VDispatch := Nil;
联系人 = vntNothing

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

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

如果联系人 = 无

但 Delphi 中没有“无”...

想法?

【问题讨论】:

    标签: delphi outlook directory exists


    【解决方案1】:

    您可以先检查 Folders 集合的计数:

    if Contacts.Folders.Count = 0 then
    

    Contacts := Contacts.Folders.GetFirst;
    if VarIsClear(Contacts) then
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      if IUnknown(Contacts) = nil then
        //
      

      【讨论】:

        【解决方案3】:
        var  
        x: string;  
        

        在代码中:

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

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

        【讨论】:

        • 为什么要格式化成字符串?如果可行,为什么不直接使用Pointer(TVarData(Contacts).VDispatch) = nil
        • 认为这是我之前尝试寻找解决方案的遗留问题,您的解决方案有点短但也能正常工作,谢谢 :)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多