Delphi Outlook Contact Automation - 通过ContactItem的所有属性进行迭代

时间:2016-01-29 03:16:22

标签: delphi properties outlook automation contacts

我目前正在编写一个小程序,将我的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));

端;

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

任何人都可以通过迭代每个联系人项目的每个属性来帮助解决问题吗?我找到了一些答案,但我需要/想进一步深入研究。

提前致谢

比尔

3 个答案:

答案 0 :(得分:0)

以这种方式与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

答案 1 :(得分:0)

为什么你关心所有属性? PR_CHANGE_KEY会有用吗?还是PR_MDB_PROVIDER?还是PR_STORE_RECORD_KEY?

为什么不只处理您的应用知道的属性?

如果要查看MAPI级别的所有属性,请查看与OutlookSpy的联系人(单击“IMessage”按钮)。

至于您的原始问题,您在整个地方使用多个点表示法,包括项目和项目属性。在进入循环之前缓存集合,并通过将变量设置为nil来明确释放变量:

Contacts := NameSpace.GetDefaultFolder(olFolderContacts);

  vItems := Contacts.Items;
  for i := 1 to vItems .Count do
  begin
    Contact := vItems .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) + '>');

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

答案 2 :(得分:0)

好的,在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;