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