以下の解決策
私はこれに対する解決策を見つけるためにネット全体を見てきましたが、Delphiでこれに対する答えを得るのはかなり難しいようです...
Outlook に慣れている場合はスキップしてください
前の説明: Outlook の連絡先フォルダーは、Windows のフォルダー ツリーのように構成されています。連絡先は、連絡先フォルダー自体またはサブフォルダー内に保存されます。
マイ コードは、外部データベースから Outlook 連絡先データベースに連絡先を追加します。二重エントリを防ぐために、プログラムはすべての連絡先をチェックし、連絡先エントリの「古い」バージョンを見つけて更新できるかどうかを確認するか、そうでない場合は新しいものを作成することになっています。
したがって、フォルダーをループして連絡先をチェックする再帰を作成しました。
フォルダー内では、サブフォルダーを取得できます(次、前、最後以外)
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 として)
var
val:TVarRec;
コード:
val:=連絡先;
文字列 (Contacts.VWideChar) = '$00000000'
var
vntNothing: OLEVariant;
コード:
TVarData(vntNothing).VType := varDispatch;
TVarData(vntNothing).VDispatch:= ゼロ;
連絡先 = vntNothing
連絡先 = 未割り当て
...
...
VBAでは、この問題には簡単な解決策があります
連絡先 = なしの場合
しかし、Delphi には「何もない」というものはありません...
アイデア?