【发布时间】:2016-01-14 09:17:54
【问题描述】:
我找到了以下代码here。它在 StackOverflow 上的 this answer 中被提及。
procedure TForm1.Button1Click(Sender: TObject);
const
olFolderContacts = $0000000A;
var
Outlook, NameSpace, Contacts, Contact: OleVariant;
i: Integer;
begin
Outlook := CreateOleObject('Outlook.Application');
NameSpace := Outlook.GetNameSpace('MAPI');
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 + '>');
end;
Outlook := UnAssigned;
end;
Scalabium link 列出了Contact 对象的属性,大概包括FullName 和Email1Address。但是,当我运行代码时,我得到的错误都不存在。我访问联系人的方式是否正确?检索到联系人后,我如何知道联系人具有哪些属性?
更新
我找到了错误的原因,但还没有解决方案。列表中的第一个联系人似乎是联系人组,对于那些FullName 和Email1Address(其他属性不存在)。该代码适用于普通联系人。但我不知道如何区分联系人组和普通联系人。我尝试了try..except,但似乎没有产生异常。
我也按照 whosrdaddy 的建议尝试了 OutlookSpy,但我找不到像 IsGroup 这样的属性。
【问题讨论】:
-
OutlookSpy 是你的朋友 :)
-
@whosrdaddy:谢谢,我去看看。
-
附带说明,在进入循环之前缓存 Items 集合,而不是在循环内使用多个点表示法 (Contacts.Items.Item(i)) - 每个“.”返回一个全新的 COM 对象。
-
@Dmitry:我不太清楚你的意思。我可以写得更短:Contacts.Items(i),这就是你的意思吗?否则,请随时改进问题中的代码。
-
不,我的意思是您需要在进入循环之前将 Contacts.Items 的值存储在一个变量中(vItems := Contacts.Items),然后在循环中使用该变量(vItems.Item( i)) 而不是在每次迭代时调用 Contacts.Items。