2010-06-01 16 views
16

Wenn ich ein Word-Dokument in einem OleContainer (Inplace) bearbeite und ich zu einem anderen Word-Dokument wechseln und dann zurückwechsle, kann ich meine Rightmouse-Taste nicht mehr verwenden. Das Kontextmenü wird nicht angezeigt.Kontextmenü verschwindet mit Word-Automatisierung

Dies geschieht auf Word 2000, nicht auf Word 2007 (ich weiß nicht über andere Versionen).

Wie kann ich dieses Verhalten loswerden?

Wie reproduzieren:

  • Erstellen Sie eine neue VCL Anwendung
  • ein menubar hinzufügen
  • eine TOleContainer hinzufügen, Align alClient, AllowInPlace und AllowActiveDoc Wahr.
  • Mit dem TOleContainer, fügen Sie ein Word 97-2003-Dokument
  • ein menuitem Add ‚Schließen‘ auf der Menüleiste, OleContainer1.DestroyObject in seiner Eventhandler, hinzufügen, so dass Sie
  • Führen Sie diese Anwendung stoppen können zu bearbeiten, auf Doppelklick der OleContainer so geht es in Editmode
  • Jetzt öffnen Word 2000
  • Zurück zu Ihrer Anwendung, das Kontextmenü wird nicht mehr funktionieren.

Edit: ich oben Verhalten auf folgendes System (unter Verwendung von Citrix) wiedergegeben:

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)

Ich habe Delphi 7 (Build 8.1) verwendet, um die Anwendung zu erstellen.

+1

können Sie bitte sagen, welche Versionen und Service Pack-Ebene Sie verwenden (OS, Delphi, Word) – pastacool

+0

Tritt dieser Fehler außerhalb von Citrix auf? –

+0

@Judah Himango: Ich habe kein System mit Word 2000 außerhalb von Citrix, also kann ich leider Ihre Frage nicht beantworten –

Antwort

4

Wenn Sie Office-Anwendungen über ActiveX hosten, werden Sie feststellen, dass einige Versionen einiger Office-Anwendungen lächerlich heikel sind, wenn sie über Änderungen an der Fensteraktivierung informiert werden. Dies kann sich besonders auf ihre Kontextmenüs auswirken.

Im Allgemeinen, wenn Sie ihnen nicht sagen, wann sie verlieren oder den Fokus gewinnen und auch wenn Ihr Top-Level-Fenster den Fokus gewinnt oder verliert (auch wenn ihr Kind Kontrolle im Fenster nicht den Fokus gewinnt), dann sie kann drunter und drüber gehen.

Es ist etwas, mit dem ich lange Zeit gekämpft habe und besonders frustrierend, wenn man den Anwendungen Dinge sagen muss, die sie besser kennen als Sie selbst (wie wenn sie den Fokus verlieren oder direkt gewinnen). oder wenn sie ein Popup-Menü erstellen, das den Fokus von ihnen weg nimmt und anders behandelt werden muss als eine andere App/ein anderes Fenster, das den Fokus nimmt, den Sie zu schätzen wissen ... Ugh.

Wie auch immer, die Office-Anwendungen sollten eine IOleInPlaceActiveObject-Schnittstelle bereitstellen und Sie sollten sicherstellen, dass Sie die OnFrameWindowActivate-Methode aufrufen, um sie über Aktivierung/Deaktivierung zu informieren.

Aus dem Speicher und einen kurzen Blick auf meinen eigenen Code für Office-Hosting, das ist eines der wichtigsten Dinge. Es ist auch eine leichte Sache zu übersehen, denken "Nein, es kann nicht so viel Bedeutung ... Warum sollte etwas so viel daran interessiert, ob das Fenster aktiv ist oder nicht?" Sie könnten denken, dass es nur zu einigen kleineren kosmetischen Problemen führen könnte (wie aktiv erscheinen, wenn es nicht ist), aber es kann dazu führen, dass das Ganze aufhört oder abstürzt. Vertrauen Sie mir, Office kümmert sich viel zu sehr um solche Dinge! Ich habe den Eindruck, dass es unter den Covern von Office immer noch ein sehr altes, single-threaded Design aus den Tagen des kooperativen Multitasking gibt und es sehr verwirrend sein kann, wenn zwei seiner Fenster gleichzeitig aktiv sind.

Sorry, dass ich nicht mehr Ratschläge geben kann, als nur in diese Richtung zu zeigen ... Das Schreiben von ActiveX-Hosts ist eine schwarze Kunst (die gesamte Dokumentation ist darauf ausgerichtet, gehostet zu werden, nicht der Host :() und der einzige Weg, den ich bekam Mein eigener Code zum Arbeiten war durch Monate von Versuch und Irrtum und eine Hölle von vielem debug-out. Es ist ein Alptraum leider.

Ein letzter Ratschlag: Haben Sie nicht Angst, kludges für bestimmte Anwendungen zu kodieren Dies ist, was IE selbst tut, mit Registry-Einstellungen zu steuern, welche Kludges auf was angewendet werden (und ich vermute, einige mehr in den Code hartcoded). ActiveX ist so ein schlecht definiertes Chaos, dass verschiedene Steuerelemente ihre eigenen Macken und Fehler haben und es ist unmöglich, einen sauberen, generischen Host zu schreiben, der mit allen zusammenarbeitet Ange, das einen behebt, wird einen anderen brechen.) Sie werden auch Dinge finden, die nur funktionieren, wenn Sie Interfaces in der gleichen Reihenfolge wie IE ausprobieren, nur weil sie nur mit IE getestet wurden; Dinge etwas anders machen und sie fallen auseinander. :(

+1

Ein bisschen spät, aber danke, das hat den Trick gemacht! Dies behebt auch das Problem in Word 2007, wo Sie das Menü beim Wechseln zwischen unserer App und Word nicht verwenden konnten. (Ich habe das mit dem Aufruf von uiActivate behoben, aber das ist besser und schneller). PS: Du hast Recht mit der Black-Art-Sache, du willst nicht wissen, wie viele Fehlerberichte wir von unseren Kunden bekommen, die völlig unreproduzierbar sind. –

+0

@The_Fox, Froh, dass es nützlich war! –

0

Ich frage mich, ob Sie alle Typ Lost Focus Ereignis von dem Formular, das den OLE-Container enthält abfangen können. Zu diesem Zeitpunkt können Sie das Dokument im OLE-Container zerstören, aber im Speicher behalten. Dann können Sie bei einem beliebigen Ereignis vom Typ Got Focus für das Formular prüfen, ob Sie dieses Dokument haben. Wenn ja, laden Sie es erneut in den OLE-Container.

Würde das für Sie arbeiten?

0

Vielleicht können Sie eine Komponente verwenden, um die Anwendung aufzurufen. Ich hatte nie ein Problem erstellen ein benutzerdefiniertes Compoment zum Aufrufen von Word über Schnittstellen und dann spezielle Befehle im Menü registrieren. In einem Container können Sie kein spezielles Menü entwerfen auf dem Formular? Es gibt ein paar WordSink Evenets, die beim Speichern und Schließen helfen, die in Verbindung mit dem Wort com Objekte verwendet werden könnten.