2009-08-01 4 views
1

J'écris un plug-in pour un programme où j'ai besoin de suivre quand des objets natifs sont ajoutés, supprimés et édités dans le document actif. L'API a des événements qui sont déclenchés lorsque le document est modifié. Cependant, le programme ne suit pas lorsque les objets natifs changent réellement. Au lieu de cela, un changement d'objet est traité comme l'objet à supprimer puis immédiatement remplacé par un autre objet modifié avec le même ID. Ceci est fait de cette façon afin que le programme puisse garder une trace d'un enregistrement d'annulation.Comment puis-je effectuer le suivi de plusieurs événements?

Après quelques expériences que j'ai déterminé que les événements sont évoqués comme suit:

Un objet est ajouté: OnAddObject événement

Un objet est supprimé: OnDeleteObject événement

Un objet est modifié: OnReplaceObject Event-> OnDeleteObject Event-> OnAddObject Event

À l'heure actuelle, mon plug-in surveille uniquement les événements OnAdd et OnDelete dans lesquels il ajoute et supprime des instances de mon objet personnalisé depuis et vers une collection. Mais cela signifie aussi que chaque fois qu'un objet change, mon plugin supprime une réinitialisation d'un objet presque identique. Je préfère juste savoir que l'objet document a changé afin que mon objet personnalisé puisse être actualisé plutôt que complètement réinstancié. Comment mes méthodes qui sont abonnées aux événements OnDelete et OnAdd indiquent-elles que l'objet n'est pas réellement ajouté ou supprimé mais est remplacé parce qu'il a changé?

Répondre

0

Je suggère l'introduction de variables "Lock" (par exemple) bools

Lorsque l'événement se déclenche Remplacée, définissez les valeurs verrouiller

En Ajout et retrait de vérifier les variables de verrouillage. Si elles sont définies pour se verrouiller, définissez-les pour déverrouiller et revenir.

+0

Je suppose que cela n'est pas possible, car les événements Ajouter/Supprimer se déclenchent avant les événements remplacés. – Zyphrax

+0

Selon la question d'Eric, l'événement Replace se déclenche suivi de la commande Delete, suivie de Add, afin que la solution Johannes soit correcte, en tenant compte des problèmes de threading. –

+0

Cette réponse est la plus proche de ma solution. Bien que je n'aie pas utilisé les variables Bool mais plutôt mis en cache l'ID de l'objet dans l'événement OnReplaceObject –

0

Gardez une trace de l'ID du document.

0

C'est un peu difficile à cause de la mauvaise structure d'événement du programme original. Peut-être que vous pourriez mettre l'ID de l'élément qui est supprimé dans un dictionnaire avec l'heure actuelle.

De cette façon, vous pouvez créer un fil séparé qui vérifie le contenu du dictionnaire (lorsqu'il contient des éléments). Donnez à chaque élément quelques millisecondes (comparez le DateTime du dict.) Pour l'événement Add à lancer et ainsi décider s'il s'agit d'une suppression régulière ou d'un remplacement.

C'est un peu inefficace car vous devrez ralentir votre suppression de quelques millisec. Mais je ne peux pas penser à un meilleur moyen.

+0

manière compliquée –

Questions connexes