2010-06-01 19 views
16

Cuando estoy editando un documento de Word en un OLEContainer (in-situ) y me cambio a otro documento de Word y luego cambia de nuevo, no puedo usar mi botón RIGHTMOUSE más. El menú contextual no aparecerá.menú contextual desaparece con la Palabra de automatización

Esto ocurre en Word 2000, no en Word 2007 (no sé acerca de otras versiones).

¿Cómo puedo deshacerme de este comportamiento?

cómo reproducir:

  • crear una nueva aplicación VCL
  • Añadir una barra de menú
  • Añadir un TOleContainer, Alinear alClient, AllowInPlace y AllowActiveDoc verdadera.
  • Con la TOleContainer, insertar un documento de Word 97-2003
  • Añadir un elemento de menú 'Cerrar' para la barra de menú, en su manejador de sucesos, añadir OleContainer1.DestroyObject, por lo que son capaces de detener la edición
  • ejecutar esta aplicación, haga doble clic en el OleContainer así que va en el modo de edición
  • Ahora abra Word 2000
  • Cambie de nuevo a su aplicación, el menú contextual ya no funcionará.

Editar: I reproducido por encima de comportamiento en el siguiente sistema (a través de Citrix):

Windows Server 2003 Enterprise Edition
versión 5.2 (Build 3790.srv03_sp2_rtm.070216-1710: Service Pack 2)

Microsoft Word 2000 (9.0.6926 SP-3)

solía Delphi 7 (build 8.1) para crear la aplicación.

+1

¿Puede indicar qué versiones y nivel de paquete de servicio está utilizando (SO, Delphi, Word)? – pastacool

+0

¿Este error ocurre fuera de Citrix? –

+0

@Judah Himango: No tengo un sistema disponible con Word 2000 fuera de Citrix, así que desafortunadamente no puedo responder a su pregunta. –

Respuesta

4

Cuando aloja aplicaciones Office a través de ActiveX, encontrará algunas versiones de algunas aplicaciones de oficina son ridículamente susceptible de ser informado de los cambios de activación de ventana y esto puede afectar especialmente sus menús de contexto.

Básicamente, si no les dices siempre que pierden o ganan el foco y también cada vez que su ventana de nivel superior gana o pierde el foco (incluso si su control secundario en la ventana no está ganando enfoque), entonces puede volverse loco

Es algo con lo que luché durante mucho tiempo y especialmente frustrante cuando tienes que decirles a las aplicaciones cosas que están en una mejor posición para saber que tú (como cuando pierden o se enfocan directamente ... . o cuando crean un menú emergente que tiene el foco lejos de ellos y tiene que ser manejado de manera diferente a cualquier otra aplicación/ventana tomando el foco, que le quedan para adivinar ... Uf.

De todos modos, las aplicaciones de Office deben exponer una interfaz IOleInPlaceActiveObject y debe asegurarse de llamar a su método OnFrameWindowActivate para informarle sobre la activación/desactivación.

De memoria, y un vistazo rápido a mi propio código para alojar Office, esa es una de las cosas más importantes. También es fácil pasarlo por alto, pensando "Nah, no puede importar tanto ... ¿Por qué algo se preocuparía tanto de si la ventana está activa o no?" Podría pensar que solo podría ocasionar algunos problemas cosméticos menores (como aparecer activo cuando no lo es) pero puede llevar a que todo se bloquee o se bloquee. ¡Créame, a Office le preocupan demasiado esas cosas! Me da la impresión de que bajo las cubiertas de Office todavía hay un diseño muy antiguo, de un único subproceso de los días de la multitarea cooperativa, y puede confundirse cuando dos de sus ventanas parecen estar activas a la vez.

Disculpa que no puedo dar más consejos que solo señalar en esa dirección ... Escribir hosts ActiveX es una técnica negra (toda la documentación está orientada a ser alojada, no siendo el host :() y la única forma en que obtuve mi propio código para trabajar fue a través de meses de prueba y error y muchísima depuración. Desafortunadamente es una pesadilla.

Un último consejo: no tengas miedo de codificar kludges para aplicaciones particulares Esto es lo que hace el IE, con la configuración del registro para controlar qué kludges se aplican a qué (y sospecho que algunos más están codificados en el código). ActiveX es un desastre tan mal definido que varios controles tienen sus propias peculiaridades y errores. es imposible escribir un host limpio y genérico que funcione con todos ellos (un ch El que arregle uno romperá el otro). También encontrará cosas que solo funcionan si prueba las interfaces en el mismo orden en que lo hace IE, simplemente porque solo se han probado con IE; hacer las cosas de manera ligeramente diferente y se desmoronan. :(

+1

Un poco tarde, pero gracias, ¡eso fue lo que hizo! Esto también soluciona el problema con Word 2007 donde no pudo usar el menú al cambiar entre nuestra aplicación y Word. (Lo arreglé con llamar a uiActivate, pero esto es mejor y más rápido). PD: tienes razón sobre lo del arte negro, no quieres saber cuántos informes de error obtenemos de nuestros clientes que son totalmente irreproducibles. –

+0

@The_Fox, Me alegro de que haya sido útil. –

0

Me pregunto si podría detectar cualquier evento tipo Lost Focus del formulario que contiene el contenedor OLE, en cuyo momento podría destruir el documento en el contenedor OLE pero mantenerlo en la memoria. Luego, en cualquier evento de tipo Got Focus para el formulario, puede verificar si tiene ese documento; si es así, vuelva a cargarlo en el contenedor OLE.

Would

que el trabajo para usted?

0

Tal vez pueda usar un componente para invocar la aplicación. Nunca tuve problemas para crear un compoment personalizado para invocar palabras a través de interfaces y luego registrar comandos especiales en el menú. En un contenedor no puede diseñar un menú especial en el formulario? Hay unos cuantos Evenets de WordSink que ayudarán a guardar y cerrar que podrían usarse junto con los objetos de la palabra com.

Cuestiones relacionadas