Delphi Outlook Contact Automation - 遍历 ContactItem 的所有属性

Delphi Outlook Contact Automation - Iterate thru ALL properties of a ContactItem

我目前正在编写一个小程序来将我的 Outlook 联系人的所有数据元素提取到新的 CRM 数据库中。我已经导入了必要的类型库,并得到了以下代码(快到了!!!)

`

 Contacts := NameSpace.GetDefaultFolder(olFolderContacts);

  for i := 1 to Contacts.Items.Count do
  begin
    Contact := Contacts.Items.Item(i);
    {now you can read any property of contact. For example, full name and
     email address}
//    ShowMessage(Contact.FullName + ' <' + Contact.Email1Address + '>');
    Memo1.Lines.Add(Contact.FullName + ' <' + Contact.Email1Address + '>');
    Memo1.Lines.Add(IntToStr(Contact.ItemProperties.Count) + '>');

for j := 0 to Contact.ItemProperties.Count -1 do
 if Contact.ItemProperties.Item(j) <> null then
   Memo1.Lines.Add(Contact.ItemProperties.Item(j));

结束;

通过联系人迭代工作正常(我在备忘录中看到它们)。我的问题是第二个 "for" 循环试图检查联系人的所有 168 个字段(备忘录中也显示了 168 个字段)

任何人都可以帮助阐明迭代每个联系人项目的每个 属性 吗?我找到了一些答案,但我 need/want 进一步深入研究。

提前致谢

比尔

您以这种方式与 null 进行比较可能是问题所在。尝试:

for j := 0 to Contact.ItemProperties.Count -1 do
  Memo1.Lines.Add(Contact.ItemProperties.Item(j).Name);

甚至:

for j := 0 to Contact.ItemProperties.Count -1 do
  if Contact.ItemProperties.Item(j).Name <> null then
    Memo1.Lines.Add(Contact.ItemProperties.Item(j).Name);

我不确定,但您甚至可以尝试访问 ItemProperties 中的项目,例如:

Contact.ItemProperties[j].Name

好的,在办公室的 TLB 中度过了一些美好的时光后,我能够遍历每个联系人的属性,无论有用与否。 RTFBody 属性 必须从 Unicode 转换为 ANSI WideString,附件作为一个集合(计数在那里很容易迭代),以及我刚刚绕过的分派值。学到了很多,MSDN Office Interop 在线文档在处理字段类型方面提供了很好的帮助。长手点符号是必要的,因为我似乎无法进行分组工作,但降低每个级别都可以正常工作。重要的部分如下。一如既往地感谢您的输入。

 Memo1.Lines.Add(IntToStr(Contacts.Items.Count) + '>');
 for i := 1 to Contacts.Items.Count do
  begin
    Contact := Contacts.Items.Item(i);
  {now you can read any property of contact. For example, full name and
    email address}

    for j := 0 to Contact.ItemProperties.Count -1 do
     begin
      ContactProperty := Contact.ItemProperties.Item(j);
      if not VarIsNull(ContactProperty.Value) then

       if ContactProperty.Name = 'RTFBody' then
        begin
         RTFByte := ContactProperty.Value;
         SetString(tANSIStr, PAnsiChar(@RTFByte[0]), Length (ContactProperty.Value));
         Memo1.Lines.Add(ContactProperty.Name + ' <' + tANSIstr +  '>');
         RichEdit1.Lines.Add(tANSIstr);
        end
       else

       if ContactProperty.Name = 'Attachments' then
        begin
         Attachments := Contact.Attachments;
         for k := 1 to Attachments.Count do
          begin
           ContactAttachment := Attachments.Item(k);
           Memo1.Lines.Add('Attachment.FileName <' + ContactAttachment.FileName +  '>');
          end;
        end
     end;