SOLUTION CI-DESSOUSApp externe: Vérifiez si un dossier Outlook existe
J'ai cherché sur le net pour trouver une solution pour cela, mais il semble très difficile d'obtenir une réponse pour cela dans Delphi ...
Passer si vous êtes familier avec Outlook
Quelques explications avant: Le dossier Contacts dans Outlook est organisé comme une hiérarchie des dossiers dans Windows. Les contacts sont stockés dans le dossier Contacts lui-même ou dans des sous-dossiers.
Mon code ajoute des contacts d'une base de données externe dans la base de données de contacts Outlook. Pour éviter les doubles entrées, le programme est supposé vérifier tous les contacts et voir s'il peut trouver une version plus ancienne de l'entrée de contact et la mettre à jour, ou sinon, en créer une nouvelle.
Par conséquent, j'ai écrit une récursivité qui boucle dans les dossiers et vérifie les contacts.
Dans un dossier, vous pouvez obtenir le sous-dossier (en plus Suivant, Précédent et dernier)
Contacts:= Contacts.Folders.Getfirst
// Le dossier maintenant sélectionné est le premier sous-dossier dans le précédent sélectionné
Si je suis essayer d'obtenir une propriété de ce sous-dossier comme 'Items.Count' ou toute autre chose, une erreur se produit parce que ce dossier n'existe pas.
Par conséquent, je veux vérifier si le dossier existe ou non, et passer à la boucle dans ce sous-dossier, sinon la boucle s'arrêterait ici et le programme s'arrêterait.
Passer jusqu'à ici si vous connaissez fonctionnement Perspectives
LE PROBLÈME:
Dans ce Debugger Contacts/Dossier variable (un OleVariant, pointeur vers le dossier maintenant sélectionné) contient des valeurs similaires à ceci: '0074974C'.
S'il n'y a pas de sous-dossier, cette valeur renvoie '$ 00000000'. Cela semble être un pointeur.
Comment vérifier si un dossier existe ou non?
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
Ce qui n'a pas: Vérifiez si
les contacts = '00000000 $' (As String)
Contacts = '00000000 $' (Comme OleVariant)
var
val : TVarRec;
code:
val: = Contacts;
string (Contacts.VWideChar) = '00000000 $'
var
vntNothing: OleVariant;
code:
TVarData (vntNothing).VType: = varDispatch;
TVarData (vntNothing) .VDispatch: = Nil;
Contacts = vntNothing
Contacts = non affectés
...
...
Dans VBA ce problème a une solution simple
si Contacts = Nothing
Mais il n'y a pas de 'Nothing' dans Delphi ...
Idées?
Pourquoi la mise en forme à la chaîne? Si cela fonctionne, pourquoi ne pas simplement utiliser 'Pointer (TVarData (Contacts) .VDispatch) = nil'? –
Pensez que c'est un reliquat de mes tentatives précédentes pour trouver une solution, votre solution est un peu plus courte mais fonctionne aussi bien, merci :) – fps