Le menu contextuel disparaît avec L'automatisation des mots

quand je suis en train d'éditer un document Word dans un OleContainer (inplace) et que je passe à un autre document Word et que je reviens en arrière, Je ne peux plus utiliser mon bouton rightmouse. Le menu contextuel s'affiche pas.

cela se passe sur Word 2000, pas sur Word 2007 (Je ne sais pas pour les autres versions).

Comment puis-je me débarrasser de ce comportement?

Comment reproduire:

  • créer une nouvelle Application VCL
  • Ajouter un barre de menu
  • Ajouter un TOleContainer, aligner alClient, AllowInPlace et AllowActiveDoc True.
  • avec le TOleContainer, insérez un document Word 97-2003
  • Ajouter un menuitem 'près' de la ménoubar, dans son eventhandler, ajouter OleContainer1.DestroyObject, de sorte que vous êtes en mesure d'arrêter de montage
  • lancez cette application, doubleclick sur L'OleContainer pour qu'il aille en mode édition
  • Maintenant, ouvrez Word 2000
  • revenir à votre application, le contextmenu ne fonctionnera plus.

Modifier: J'ai reproduit le comportement ci-dessus sur le système suivant (en utilisant Citrix):

Windows Server 2003 Enterprise Edition

Version 5.2 (Build 3790.srv03_sp2_rtm.070216-1710: Service Pack 2)

Microsoft Word 2000 (9.0.6926 SP-3)

j'ai utilisé Delphi 7 (version 8.1) pour créer l'application.

16
demandé sur The_Fox 2010-06-01 16:44:51

3 réponses

lorsque vous hébergez des applications Office via ActiveX, vous verrez que certaines versions de certaines applications Office sont ridiculement sensibles au fait d'être informées des changements d'activation de fenêtre et cela peut affecter particulièrement leurs menus contextuels.

fondamentalement, si vous ne leur dites pas chaque fois qu'ils perdent ou gagnent la mise au point et aussi chaque fois que votre fenêtre de haut niveau gagne ou perd la mise au point (même si leur enfant contrôle dans la fenêtre ne gagne pas la mise au point), alors ils peuvent aller haywire.

c'est quelque chose que je se sont battus pendant longtemps et particulièrement frustrant quand vous devez dire aux applications des choses qu'ils sont dans une meilleure position pour savoir que vous êtes (comme quand ils perdent ou gagner la mise au point directement... ou lorsqu'ils créent un menu pop-up qui prend le focus, loin d'eux et doit être traité différemment d'une autre application/fenêtre de l'accent, qui vous sont laissés à la divine... Ugh.

quoi qu'il en soit, les applications de bureau devraient exposer une interface IOleInPlaceActiveObject et vous devrait s'assurer que vous appelez sa méthode OnFrameWindowActivate pour lui parler de l'activation / désactivation.

de mémoire, et un rapide coup d'oeil à mon propre code pour le bureau d'accueil, c'est l'une des choses les plus importantes. C'est aussi une chose facile à oublier, en pensant "Non, ça ne peut pas avoir d'importance... Pourquoi quelque chose de beaucoup si la fenêtre est active ou pas?"On pourrait penser que cela ne pourrait conduire qu'à quelques problèmes cosmétiques mineurs (comme paraître actif quand ce n'est pas le cas), mais cela peut ça mène à tout verrouiller ou s'écraser. Croyez-moi, le bureau se soucie beaucoup trop de ces choses! J'ai l'impression que sous les couvertures de bureau Il y a encore un très vieux design fileté de l'époque de la multitâche coopérative et il peut devenir très confus quand deux de ses fenêtres semblent être actives à la fois.

désolé de ne pouvoir donner plus de conseils que de pointer dans cette direction... Écrire des hôtes ActiveX est un art noir (toute la documentation est orienté vers le fait d'être hébergé, pas d'être l'hôte :( ) et la seule façon dont j'ai eu mon propre code à travailler a été à travers des mois d'essais et d'erreurs et un enfer de beaucoup de débugg-out. C'est un cauchemar, malheureusement.

un dernier conseil: n'ayez pas peur de "hardcode kludges" pour des applications particulières. C'est ce que fait IE lui-même, avec des paramètres de Registre pour contrôler quels kludges sont appliqués à quoi (et je soupçonne certains plus codé dans le code). ActiveX est un mess mal défini que les différents contrôles ont leurs propres bizarreries et bugs et il est impossible d'écrire un hôte propre et générique qui fonctionne avec chacun d'eux. (Un changement qui résout cassera l'autre.) Vous trouverez aussi des choses qui ne fonctionnent que si vous essayez les interfaces dans le même ordre QU'IE le fait, juste parce qu'elles n'ont été testées qu'avec IE; faites les choses un peu différemment et elles tombent en morceaux. : (

4
répondu Leo Davidson 2010-11-25 22:50:15

je me demande si vous ne pourriez pas en attraper un Lost Focus tapez l'événement à partir du formulaire contenant le conteneur OLE, à ce moment-là vous pourriez détruire le document dans le conteneur OLE mais le garder en mémoire. Alors, sur n'importe quel!--1 -- > tapez l'événement pour le formulaire, vous pouvez vérifier pour voir si vous avez ce document; si oui, rechargez-le dans le conteneur OLE.

cela fonctionne pour vous?

0
répondu David T. Macknet 2010-11-12 15:47:06

peut-être Pouvez-vous utiliser un composant pour invoquer l'application. Je n'ai jamais eu de problème à créer un compoment personnalisé pour invoquer word à travers des interfaces et ensuite enregistrer des commandes spéciales au menu. Dans un conteneur ne pouvez-vous pas concevoir un menu spécial sur le formulaire? Il y a quelques Evenets WordSink qui aideront à sauvegarder et fermer qui pourraient être utilisés en conjonction avec les objets Word com.

0
répondu Ross Bush 2011-02-16 04:18:08