Fokus auf ActivexObjekt setzen [Erledigt]
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Fokus auf ActivexObjekt setzen [Erledigt]
mit oWord := CreateObject("Word.Application")
mache ich ja meine Word-Instanz auf.
Wie kann ich denn nun den Fokus darauf setzen?
Bei SetAppFocus(oWord) kommt immer die Meldung "Objekt nicht angemeldet".
mache ich ja meine Word-Instanz auf.
Wie kann ich denn nun den Fokus darauf setzen?
Bei SetAppFocus(oWord) kommt immer die Meldung "Objekt nicht angemeldet".
Zuletzt geändert von stevie am Mo, 02. Feb 2009 8:34, insgesamt 1-mal geändert.
Viele Grüße
Stevie
Stevie
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Hi,
durch Aufruf von oWord:visible := .t. wird Word ja angezeigt und in den Vordergrund geholt.
Hat es da nicht automatisch dann den Focus ?
durch Aufruf von oWord:visible := .t. wird Word ja angezeigt und in den Vordergrund geholt.
Hat es da nicht automatisch dann den Focus ?
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Hi,
nein offensichtlich nicht ... im Beispielprogramm \samples\activec\msword
kann ich dein Problem nachvollziehen, aber wenn man vor oDoc:close() das Programm abbricht ohne Word und das Dokument zu beenden, dann ist Word frei und man kann darin schreiben.
Auch wenn man einfach in Word clicked, solange das eigene Programm z.B. mit WAIT oder der Eventloop wartet, kann man dort einfach weiter schreiben. Im Forum API meine ich war mal was erwähnt worden dass man mit FindWindow oder GetWindow ein Programm nach Titel suchen und nach vorne bringen kann. Ich seh mal ob ich den Link finde ...
nein offensichtlich nicht ... im Beispielprogramm \samples\activec\msword
kann ich dein Problem nachvollziehen, aber wenn man vor oDoc:close() das Programm abbricht ohne Word und das Dokument zu beenden, dann ist Word frei und man kann darin schreiben.
Auch wenn man einfach in Word clicked, solange das eigene Programm z.B. mit WAIT oder der Eventloop wartet, kann man dort einfach weiter schreiben. Im Forum API meine ich war mal was erwähnt worden dass man mit FindWindow oder GetWindow ein Programm nach Titel suchen und nach vorne bringen kann. Ich seh mal ob ich den Link finde ...
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Hi,
ich habe nur dies gefunden:
http://www.xbaseforum.de/viewtopic.php? ... findwindow
hier wird ziemlich weit unten gezeigt, wie man ein anderes Programmfenster ansprechen kann, aber leider weiß ich nicht,
ob dies auch für den Eingabefocus nutzbar ist.
Die USER32.DLL kennt die Funktionen SetFocus(nHwnd) -> LONG vielleicht hilft es ja
ich habe nur dies gefunden:
http://www.xbaseforum.de/viewtopic.php? ... findwindow
hier wird ziemlich weit unten gezeigt, wie man ein anderes Programmfenster ansprechen kann, aber leider weiß ich nicht,
ob dies auch für den Eingabefocus nutzbar ist.
Die USER32.DLL kennt die Funktionen SetFocus(nHwnd) -> LONG vielleicht hilft es ja
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9358
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Ich habe kein Problem damit, den Fokus (mit SetAppFocus()) auf Komponenten zu setzen, aber Word ist - wenn man es per Active-X ansteuert, nach meiner Auffassung keine Komponente. Tatsächlich öffnet sich ein Applikationsfenster. Deshalb müssten hier m.E. auch andere Hilfsmittel her, um den Fokus zu setzen. "oWord" ist nicht das Objekt, das die gesamte Word-Applikation repräsentiert - sondern nur ein Teil davon!
Herzlich,
Tom
Tom
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
also mit meiner Eventloop bleib ich solange im Programm, bis Word geschlossen ist.
Sicher sobald man das Word-Fenster angeklickt hat, kann man auch reinschreiben,
aber besser wärs ja wenns gleich den Fokus hat.
Sicher sobald man das Word-Fenster angeklickt hat, kann man auch reinschreiben,
aber besser wärs ja wenns gleich den Fokus hat.
Viele Grüße
Stevie
Stevie
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2470
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Hi,
ich habe noch nie das Problem gehabt, wenn ich Word innerhalb der Applikation aufrufe hat Word auch den Focus.
ich habe noch nie das Problem gehabt, wenn ich Word innerhalb der Applikation aufrufe hat Word auch den Focus.
Code: Alles auswählen
// Erzeugen einer ActiveX-Komponente
oWord := CreateObject("Word.Application")
IF Empty( oWord )
MsgBox( mess1 )
Return .f.
ENDIF
oWord := oWord:dynamicCast(ActiveXObject())
oWord:Quit := {||lWordFinished := .T.}
oWord:Visible := .T.
lWordFinished := .F.
// Oeffnen eines Word-Dokuments und Zugriff auf
// eine Sammlung von Lesezeichen
oWord:documents:open( cFile )
oDoc := oWord:ActiveDocument
oBM := oDoc:Bookmarks
Gruß
Klaus
Klaus
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Dann hast du bestimmt keine Eventschleife, die das Programm solange anhält, bis lWordFinished .T. ist,oder?Koverhage hat geschrieben:Hi,
ich habe noch nie das Problem gehabt, wenn ich Word innerhalb der Applikation aufrufe hat Word auch den Focus.
Code: Alles auswählen
// Erzeugen einer ActiveX-Komponente oWord := CreateObject("Word.Application") IF Empty( oWord ) MsgBox( mess1 ) Return .f. ENDIF oWord := oWord:dynamicCast(ActiveXObject()) oWord:Quit := {||lWordFinished := .T.} oWord:Visible := .T. lWordFinished := .F. // Oeffnen eines Word-Dokuments und Zugriff auf // eine Sammlung von Lesezeichen oWord:documents:open( cFile ) oDoc := oWord:ActiveDocument oBM := oDoc:Bookmarks
Ich habe danach meine ganzen Einfügeoperationen und eine einfache Do While
Code: Alles auswählen
Do While !lWordFinished
AppEvent( @mp1, @mp2, @oXbp )
Enddo
Viele Grüße
Stevie
Stevie
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Hi,
diese Zeile könnte einen Unterschied im Verhalten bewirken, da ja Word nun Events an Xbase++ weitergeben kann ...
Eine ganz andere Frage ist, warum man zwischen den Xbase++Einfügeoperationen mit manuellen Eingaben den Wordtext ändern soll. Dabei kann doch eigentlich nichts sinnvolles herauskommen oder ?
Ich hatte es so verstanden, dass du ein Word als Editor mit einem vorgefertigten Dokument zur Weiterbearbeitung öffnen willst ... wobei hier eine RunShell() mit asyncroner Ausführung bestimmt einfacher wäre
Nach dem Ende des Programmes hat bei mir Word immer den Focus.
Eventuell sollte man den Wordstart in einen eigenen Thread legen und sehen was passiert wenn dieser geschlossen wird.
Was mir zu TOMs Anmerkung einfällt, oWord ist kein Fenster sondern nur der "COM-Kanal" (eine Art von offener Verbindung zum Datenaustausch) oder ? Aber in der Word-Basic Hilfe fand ich auch keine Methode wie man der Application oder (besser ?) dem Dokument den Focus verleihen kann.
Code: Alles auswählen
oWord := oWord:dynamicCast(ActiveXObject())
Eine ganz andere Frage ist, warum man zwischen den Xbase++Einfügeoperationen mit manuellen Eingaben den Wordtext ändern soll. Dabei kann doch eigentlich nichts sinnvolles herauskommen oder ?
Ich hatte es so verstanden, dass du ein Word als Editor mit einem vorgefertigten Dokument zur Weiterbearbeitung öffnen willst ... wobei hier eine RunShell() mit asyncroner Ausführung bestimmt einfacher wäre
Nach dem Ende des Programmes hat bei mir Word immer den Focus.
Eventuell sollte man den Wordstart in einen eigenen Thread legen und sehen was passiert wenn dieser geschlossen wird.
Was mir zu TOMs Anmerkung einfällt, oWord ist kein Fenster sondern nur der "COM-Kanal" (eine Art von offener Verbindung zum Datenaustausch) oder ? Aber in der Word-Basic Hilfe fand ich auch keine Methode wie man der Application oder (besser ?) dem Dokument den Focus verleihen kann.
Gruß
Hubert
Hubert
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2470
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Stevie,
doch die Eventschleife habe ich, aber die sieht bei mir so aus:
Do WHILE !lWordFinished
// Just wait
nEvent := AppEvent( @mp1, @mp2, , 1)
EndDo
doch die Eventschleife habe ich, aber die sieht bei mir so aus:
Do WHILE !lWordFinished
// Just wait
nEvent := AppEvent( @mp1, @mp2, , 1)
EndDo
Gruß
Klaus
Klaus
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2470
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Hubert,
die Antwort verstehe ich nicht so ganz.
Also wenn ich z.B. einen Brief an einen Kunden schicken möchte, wähle ich erst den Kunden aus und dann den entsprechenden
Brief (Vorlage). Dort werden dann die Bookmarks mit den Daten ersetzt, z.B. Anschrift, Anrede, etc.
Der Brief wird dann wenn gewünscht angezeigt, damit man vielleicht noch ein P.S. hinzufügen kann, oder......
Das klappt wie gesagt sehr gut auch mit dem Focus habe ich keinen Probleme.
die Antwort verstehe ich nicht so ganz.
Also wenn ich z.B. einen Brief an einen Kunden schicken möchte, wähle ich erst den Kunden aus und dann den entsprechenden
Brief (Vorlage). Dort werden dann die Bookmarks mit den Daten ersetzt, z.B. Anschrift, Anrede, etc.
Der Brief wird dann wenn gewünscht angezeigt, damit man vielleicht noch ein P.S. hinzufügen kann, oder......
Das klappt wie gesagt sehr gut auch mit dem Focus habe ich keinen Probleme.
Gruß
Klaus
Klaus
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Hallo Klaus,
ich meinte nicht deinen Beitrag - so wie du das schilderst ist das natürlich sehr sinnvoll ...
sondern stevie hatte geschrieben (oder habe ich das nur falsch verstanden) dass er in einer Schleife mehrere Dokumente öffnet, automatisch mit Text bestückt und der Anwender den Focus haben soll ... und dabei fragte ich mich wie das gehen soll ... allerdings aus eigener netativ Erfahrung mit Excel, bei dem ich erst sichtbar eingefügt habe und sich dann die Fehler häuften bis ich mitbekam, dass die Anwender "mal schnell was nachsehen wollten" ... das Einfügen ging über die Zwischenablage und kam natürlich dann wo anders an
Die Zeile die ich von dir zitiert hatte, könnte damit zu tun haben, dass bei DIR das Editieren funktioniert und bei ihm nicht ...
ich meinte nicht deinen Beitrag - so wie du das schilderst ist das natürlich sehr sinnvoll ...
sondern stevie hatte geschrieben (oder habe ich das nur falsch verstanden) dass er in einer Schleife mehrere Dokumente öffnet, automatisch mit Text bestückt und der Anwender den Focus haben soll ... und dabei fragte ich mich wie das gehen soll ... allerdings aus eigener netativ Erfahrung mit Excel, bei dem ich erst sichtbar eingefügt habe und sich dann die Fehler häuften bis ich mitbekam, dass die Anwender "mal schnell was nachsehen wollten" ... das Einfügen ging über die Zwischenablage und kam natürlich dann wo anders an
Die Zeile die ich von dir zitiert hatte, könnte damit zu tun haben, dass bei DIR das Editieren funktioniert und bei ihm nicht ...
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9358
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
SetAppFocus() kann nur den Fokus auf ein XbasePart oder ein Fenster der Applikation setzen. Um einer anderen Applikation den Fokus zu erteilen, sind andere Mechanismen nötig. Wenn im Programm, das Word via AX aufruft, sonst nichts geschieht, sollte Word den Fokus haben - jedenfalls ist es bei mir so. Aber es geht hier nicht um den Fokus innerhalb einer Applikation. Nicht umsonst lautet der Code: oWord := CreateObject("Word.Application")
Herzlich,
Tom
Tom
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Genau darum gehts.Koverhage hat geschrieben:Hubert,
die Antwort verstehe ich nicht so ganz.
Also wenn ich z.B. einen Brief an einen Kunden schicken möchte, wähle ich erst den Kunden aus und dann den entsprechenden
Brief (Vorlage). Dort werden dann die Bookmarks mit den Daten ersetzt, z.B. Anschrift, Anrede, etc.
Der Brief wird dann wenn gewünscht angezeigt, damit man vielleicht noch ein P.S. hinzufügen kann, oder......
Das klappt wie gesagt sehr gut auch mit dem Focus habe ich keinen Probleme.
Code: Alles auswählen
oWord := CreateObject("Word.Application")
IF Empty( oWord )
MsgBox( "Microsoft Word ist nicht installiert" )
lok:=.F.
return lok
ENDIF
oWord:= oWord:dynamicCast(ActiveXObject())
// Zuweisen eines Codeblocks, der bei Ende von Word ausgeführt wird
oWord:Quit:={|| lCloseW:=.T.}
// Sicherstellen, dass
// die Word-Anwendung sichtbar ist.
// Öffnen eines Word-Dokuments und Zugriff auf
// eine Sammlung von Lesezeichen
oWord:documents:Add( cVorl ) // neues Dokument mit Vorlage erstellen
oDoc := oWord:ActiveDocument
oBM := oDoc:Bookmarks
oWord:visible := .T.
// jetzt die Bookmarks ersetzen
// Datei schonmal unter dem richten Dateinamen abspeichern
oDoc:saveas(cDatei)
// Warten, bis Word geschlossen wurde
Do While !lCloseW
AppEvent( @mp1, @mp2, @oXbp )
Enddo
oBm:destroy()
oDoc:destroy()
oWord:destroy()
Die Reihenfolge resultiert aus der Tatsache, dass sonst auch Dokumente eingetragen werden würden, bei deren Erstellung ein Fehler aufgetreten ist.
Word ist damit zwar im Vordergrund, aber mein Programm ist das aktive Fenster und Word halt nicht fokussiert.
Viele Grüße
Stevie
Stevie
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2470
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Stevie,
wenn das Dein richtiger Code ist, kann das auch so nicht funktionieren. Ich hoffe ich blamiere mich jetzt mit der Antwort nicht.
Wenn ich das richtig verstehe:
Du machst zwar 3 mal einen destroy, das bedeutet Xbase++ zerstört die Objekte und gibst sie frei, aber das hat erstmal mit Word nichts zu tun.
Woher soll Word dann wissen das es beendet wurde ?
Folgendes ist denke ich mal richtig (so mache ich es )
oDoc:close()
sleep(0)
oWord:Quit()
sleep(0)
oWord:destroy()
sleep(0)
wenn das Dein richtiger Code ist, kann das auch so nicht funktionieren. Ich hoffe ich blamiere mich jetzt mit der Antwort nicht.
Wenn ich das richtig verstehe:
Du machst zwar 3 mal einen destroy, das bedeutet Xbase++ zerstört die Objekte und gibst sie frei, aber das hat erstmal mit Word nichts zu tun.
Woher soll Word dann wissen das es beendet wurde ?
Folgendes ist denke ich mal richtig (so mache ich es )
oDoc:close()
sleep(0)
oWord:Quit()
sleep(0)
oWord:destroy()
sleep(0)
Gruß
Klaus
Klaus
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Ja nee, em da oben steht ein oWord quit, dort wird lCloseW auf .T. gesetzt. Quit wird ausgelöst, sobald der Anwender mit der Bearbeitung fertig ist und Word mit einem Klick aufs Kreuz beendet. Deshalb bleibt das Programm solange in der Do while bis lClosew .T. ist und Word geschlossen wurde. Dann werden die Resourccen freigegeben.Koverhage hat geschrieben:Stevie,
wenn das Dein richtiger Code ist, kann das auch so nicht funktionieren. Ich hoffe ich blamiere mich jetzt mit der Antwort nicht.
Wenn ich das richtig verstehe:
Du machst zwar 3 mal einen destroy, das bedeutet Xbase++ zerstört die Objekte und gibst sie frei, aber das hat erstmal mit Word nichts zu tun.
Woher soll Word dann wissen das es beendet wurde ?
Folgendes ist denke ich mal richtig (so mache ich es )
oDoc:close()
sleep(0)
oWord:Quit()
sleep(0)
oWord:destroy()
sleep(0)
Viele Grüße
Stevie
Stevie
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
hab die mal genau so übernommen, ist auch nich anders, das Fenster ist nicht aktiv.Koverhage hat geschrieben:Stevie,
doch die Eventschleife habe ich, aber die sieht bei mir so aus:
Do WHILE !lWordFinished
// Just wait
nEvent := AppEvent( @mp1, @mp2, , 1)
EndDo
Viele Grüße
Stevie
Stevie
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Hallo Stevie,
offensichtlich hatte ich dich falsch verstanden.
Wenn du das Gleiche wie Klaus machen möchtest und den gleichen Code verwendest, sollte das Ergebnis auch gleich sein
Allerdings ist es sehr leicht in Windows den Focus zu verlieren, hast du ein MODALES Fenster oder eine MSGBOX() im Aufruf und der aktuelle Prozess übernimmt wieder den Focus. Das ist ja auch das Hauptproblem beim Debuggen, fast jede Aktion ändert den normalen Ablauf.
Bei dem Testprogramm von Alaska habe ich bemerkt, dass der Cursor in Word erst zur Eingabe freigegeben wird, wenn die Ersetzungen durch sind. Könnte es sein, dass du mehr und längere sleep() Aufrufe einbauen musst, da du mehr Text übergibst ?
offensichtlich hatte ich dich falsch verstanden.
Wenn du das Gleiche wie Klaus machen möchtest und den gleichen Code verwendest, sollte das Ergebnis auch gleich sein
Allerdings ist es sehr leicht in Windows den Focus zu verlieren, hast du ein MODALES Fenster oder eine MSGBOX() im Aufruf und der aktuelle Prozess übernimmt wieder den Focus. Das ist ja auch das Hauptproblem beim Debuggen, fast jede Aktion ändert den normalen Ablauf.
Der Unterschied von deiner Eventloop zu der von Klaus liegt darin, dass diese hier alle 1/100 Sekunden feststellen kann ob lWordFinished erfüllt ist. In Deiner alten erfolgt diese Prüfung immer erst nach einem Event. Da die Events bei Windows ja "aus allen Ecken kommen..." mag das tatsächlich kein Problem sein, aber es könnte eines werden.stevie hat geschrieben:hab die mal genau so übernommen, ist auch nich anders, das Fenster ist nicht aktiv.Koverhage hat geschrieben:Stevie,
doch die Eventschleife habe ich, aber die sieht bei mir so aus:
Do WHILE !lWordFinished
// Just wait
nEvent := AppEvent( @mp1, @mp2, , 1)
EndDo
Bei dem Testprogramm von Alaska habe ich bemerkt, dass der Cursor in Word erst zur Eingabe freigegeben wird, wenn die Ersetzungen durch sind. Könnte es sein, dass du mehr und längere sleep() Aufrufe einbauen musst, da du mehr Text übergibst ?
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
habe auch schon alles endmodalisiert und ohne Texteinfügung gestart, gleiches Phänomen.brandelh hat geschrieben:Hallo Stevie,
offensichtlich hatte ich dich falsch verstanden.
Wenn du das Gleiche wie Klaus machen möchtest und den gleichen Code verwendest, sollte das Ergebnis auch gleich sein
Allerdings ist es sehr leicht in Windows den Focus zu verlieren, hast du ein MODALES Fenster oder eine MSGBOX() im Aufruf und der aktuelle Prozess übernimmt wieder den Focus. Das ist ja auch das Hauptproblem beim Debuggen, fast jede Aktion ändert den normalen Ablauf.
das wusste ich nicht, aber wie gesagt, auch ohne Text gleiche Sachebrandelh hat geschrieben:Der Unterschied von deiner Eventloop zu der von Klaus liegt darin, dass diese hier alle 1/100 Sekunden feststellen kann ob lWordFinished erfüllt ist. In Deiner alten erfolgt diese Prüfung immer erst nach einem Event. Da die Events bei Windows ja "aus allen Ecken kommen..." mag das tatsächlich kein Problem sein, aber es könnte eines werden.stevie hat geschrieben:hab die mal genau so übernommen, ist auch nich anders, das Fenster ist nicht aktiv.Koverhage hat geschrieben:Stevie,
doch die Eventschleife habe ich, aber die sieht bei mir so aus:
Do WHILE !lWordFinished
// Just wait
nEvent := AppEvent( @mp1, @mp2, , 1)
EndDo
Bei dem Testprogramm von Alaska habe ich bemerkt, dass der Cursor in Word erst zur Eingabe freigegeben wird, wenn die Ersetzungen durch sind. Könnte es sein, dass du mehr und längere sleep() Aufrufe einbauen musst, da du mehr Text übergibst ?
Viele Grüße
Stevie
Stevie
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
hab jetzt mit der neuen Eventloop, mit entmodalisierten Fenstern und ohne Texteintragung, also nur abspeichern gestartet und visible:=.T. erst vor der Eventloop bzw. vor dem speichern mit sleep vorher und nachher versucht, das Fenster übrigens Word 2000 wird trotzdem nicht aktiv.
sogar ohne Eventloop einfach nur über nen Button gestartet, halt bis zu dem Punkt, wo visible:=.T. steht und dann nur noch saveas, aber auch nich anders
sogar ohne Eventloop einfach nur über nen Button gestartet, halt bis zu dem Punkt, wo visible:=.T. steht und dann nur noch saveas, aber auch nich anders
Viele Grüße
Stevie
Stevie
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
jetz wirds echt verrückt, ich habe bei Excel haargenau den gleichen Code benutzt und da wird Excel aktiv. Word auch nicht, wenn ich den Ursprungscode von Excel benutze.
Viele Grüße
Stevie
Stevie
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Re: Fokus auf ActivexObjekt setzen
Hallo Steve,
schau die nachfolgenden Codeerweiterungen an. Damit dürfte Word den Focus bekommen:
Gruß, Olaf
schau die nachfolgenden Codeerweiterungen an. Damit dürfte Word den Focus bekommen:
Code: Alles auswählen
oWord := CreateObject("Word.Application")
IF Empty( oWord )
MsgBox( "Microsoft Word ist nicht installiert" )
lok:=.F.
return lok
ENDIF
oWord:= oWord:dynamicCast(ActiveXObject())
oWord:Quit:={|| lCloseW:=.T.}
oWord:documents:Add( cVorl ) // neues Dokument mit Vorlage erstellen
oDoc := oWord:ActiveDocument
oBM := oDoc:Bookmarks
oWord:visible := .T.
*------ hier die Anweisungen für den Focus
oWord:WindowState := 1 // enspricht: wdWindowStateMaximize
oWord:Activate()
oDoc:Activate()
*-------------------------------------------------------
oDoc:saveas(cDatei)
Do While !lCloseW
AppEvent( @mp1, @mp2, @oXbp )
Enddo
oBm:destroy()
oDoc:destroy()
oWord:destroy()
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2470
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Dann muss es an Word 2000 liegen.
Versuche mal ist allerdings VB Code
und zwar nach visble
/*
// Word in den Vordergrund bringen
Word.Application.Activate();
*/
Versuche mal ist allerdings VB Code
und zwar nach visble
/*
// Word in den Vordergrund bringen
Word.Application.Activate();
*/
Gruß
Klaus
Klaus
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen
Koverhage hat geschrieben:Dann muss es an Word 2000 liegen.
Versuche mal ist allerdings VB Code
und zwar nach visble
/*
// Word in den Vordergrund bringen
Word.Application.Activate();
*/
Code: Alles auswählen
oWord:WindowState := 1 // enspricht: wdWindowStateMaximize
oWord:Activate()
Vielen Dank an alle
@Koverhage: Übrigens mit Activex kann man alle Methoden von VB benutzen, z. B. hier ist oWord schon mal das Word.Application und da activate eine Vb-Methode von oWord ist, kann man sie nach Xbase-Standard aufrufen, also oWord:Activate. Wusste nur nicht, dass es diese gibt.
Viele Grüße
Stevie
Stevie
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2470
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Fokus auf ActivexObjekt setzen [Erledigt]
Stevie,
das ist klar mit VB. Wenigstens hat es geholfen.
das ist klar mit VB. Wenigstens hat es geholfen.
Gruß
Klaus
Klaus