2010-09-17 7 views
1

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?

Répondre

4

Vous pourriez d'abord vérifier le nombre sur la collection Folders:

if Contacts.Folders.Count = 0 then 

ou

Contacts := Contacts.Folders.GetFirst; 
if VarIsClear(Contacts) then 
0
var 
x: string; 

dans le code:

x:= format('%p%',[Pointer(TVarData(contacts).VDispatch)]); 
if x = '00000000' then 
    'New Contact' 
else 
    'open folder and search within this one' 

Collègue a la solution .. Merci pour votre temps :)

+1

Pourquoi la mise en forme à la chaîne? Si cela fonctionne, pourquoi ne pas simplement utiliser 'Pointer (TVarData (Contacts) .VDispatch) = nil'? –

+0

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

1

Vous pouvez essayer ceci:

if IUnknown(Contacts) = nil then 
    // 
+0

Votre solution fonctionne aussi, merci pour votre aide. – fps

Questions connexes