Exit-Methode beim (oder sagt man in) ActiveX-Object
Moderator: Moderatoren
-
- Cut&Paste-Entwickler
- Beiträge: 21
- Registriert: Do, 20. Dez 2007 13:29
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Exit-Methode beim (oder sagt man in) ActiveX-Object
Wenn ich Quit() so wie du befülle in einem Activex-Object, dann passiert bei mir gar nichts.
oWord := CreateObject("Word.Application")
IF Empty( oWord )
MsgBox( "Microsoft Word ist nicht installiert" )
ENDIF
oWord:=oWord:dynamicCast( ActiveXObject() )
// Setzen des code blocks für die "Quit" Nachricht
oWord:quit := {|| msgbox("Finished!"),lok:=.T. }
Die Meldung kommt nicht und die public Variable lok wird auch nicht verändert.
oWord := CreateObject("Word.Application")
IF Empty( oWord )
MsgBox( "Microsoft Word ist nicht installiert" )
ENDIF
oWord:=oWord:dynamicCast( ActiveXObject() )
// Setzen des code blocks für die "Quit" Nachricht
oWord:quit := {|| msgbox("Finished!"),lok:=.T. }
Die Meldung kommt nicht und die public Variable lok wird auch nicht verä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: Exit-Methode beim (oder sagt man in) ActiveX-Object
Hi,
sieh mal unter \source\samples\activex\msword\... nach.
Dort habe ich eben feed.prg compiliert und aufgerufen.
Word geht auf, ersetzt, speichert und wieder zu.
Vorher schließen sie noch das Dokument !
Eventuell muss man das Dokument schließen, sonst hängt quit() in einer unsichtbaren Abfrage (wirklich speichern ? aber da ist doch noch ...)
sieh mal unter \source\samples\activex\msword\... nach.
Dort habe ich eben feed.prg compiliert und aufgerufen.
Word geht auf, ersetzt, speichert und wieder zu.
Vorher schließen sie noch das Dokument !
Code: Alles auswählen
oDoc:close()
oWord:Quit()
oWord:destroy() // das ist wohl wieder Xbase++
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: Exit-Methode beim (oder sagt man in) ActiveX-Object
Ach ja,
Quit() ist nur eine Methode, kein Callback-codeblock !
siehe hierzu die Datei "VBAWD10.CHM"
(muss eventuell nachinstalliert werden ... VBA Hilfedatei...wie steht hier auch irgendwo.)
Quit() ist nur eine Methode, kein Callback-codeblock !
siehe hierzu die Datei "VBAWD10.CHM"
(muss eventuell nachinstalliert werden ... VBA Hilfedatei...wie steht hier auch irgendwo.)
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9357
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Exit-Methode beim (oder sagt man in) ActiveX-Object
Hallo, Hubert.
Aber es passiert eben auch nichts beim Schließen.
Jedes ActiveXObjekt erbt von XbpWindow den Slot "Quit", der auch zugewiesen werden kann. Wenn man ein Word-Objekt erzeugt und den Quit-Callback belegt, erhält das Objekt in der iVar :EventMap ein Array, das (u.a.) für "QUIT" einen Eintrag enthält, in dem der Codeblock dann vorzufinden ist (Position 3). Allerdings offenbar ohne Wirkung. Das Objekt selbst hat KEINE Methode namens Quit(). Das hier erzeugt also keinen Laufzeitfehler:Quit() ist nur eine Methode, kein Callback-codeblock !
Code: Alles auswählen
oWord := CreateObject("Word.Application")
oWord := oWord:dynamicCast(ActiveXObject())
oWord:Visible := .T.
oWord:Quit := {||msgbox('Word wurde beendet'),oWord:Destroy()}
Herzlich,
Tom
Tom
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9357
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Exit-Methode beim (oder sagt man in) ActiveX-Object
Wer lesen kann, ist klar im Vorteil. Aus der Doku zu XbpWindow:
Auf Windows-Plattformen wird das xbeP_Quit Ereignis nur dann erzeugt, wenn das Betriebssystem heruntergefahren wird und der laufende Prozeß vom Betriebssystem, nicht vom Anwender, beendet wird. Wenn ein Programm über den Task-Manager abgebrochen wird, entsteht ein xbeP_Close Ereignis.
Das CLOSE-Event kennen aber nur XbpDialog und XbpCrt.
Auf Windows-Plattformen wird das xbeP_Quit Ereignis nur dann erzeugt, wenn das Betriebssystem heruntergefahren wird und der laufende Prozeß vom Betriebssystem, nicht vom Anwender, beendet wird. Wenn ein Programm über den Task-Manager abgebrochen wird, entsteht ein xbeP_Close Ereignis.
Das CLOSE-Event kennen aber nur XbpDialog und XbpCrt.
Herzlich,
Tom
Tom
- 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: Exit-Methode beim (oder sagt man in) ActiveX-Object
Hallo Tom,Tom hat geschrieben:Hallo, Hubert.
...Quit() ist nur eine Methode, kein Callback-codeblock !
Jedes ActiveXObjekt erbt von XbpWindow den Slot "Quit", der auch zugewiesen werden kann.
Das Objekt selbst hat KEINE Methode namens Quit(). Das hier erzeugt also keinen Laufzeitfehler:
...
Aber es passiert eben auch nichts beim Schließen.
OK, der Callback auf Xbase++ Ebene mag bestehen, aber wie du in dem von mir zitierten Beispiel
sehen kannst wird Word nach dem Aufruf beendet.
Ich habe in der Worddokumentation nachgesehen, und dort gibt es die Methode .quit(xx) die Word beendet.
Es könnte natürlich auch sein, dass das oDlg:destroy() Word rausgeschossen hat, aber das glaube ich eher nicht,
da das Entfernen einer Referenz auf Word dieses selbst kaum abschießen dürfte.
Und die Frage war doch, wie man Word nach dem Ausdruck beenden könnte.
Dafür muß man die Methode quit aufrufen ...
//////////////////////////////////////////////////////////////////////
// FEED.PRG
//
// Copyright:
// Alaska Software, (c) 2002-2006. Alle Rechte vorbehalten.
//
...
// Erzeugen einer ActiveX-Komponente
oWord := CreateObject("Word.Application")
IF Empty( oWord )
MsgBox( "Microsoft Word ist nicht installiert" )
ENDIF
oWord:visible := .T.
...
// Schliessen des Dokuments und zerstoeren das
// ActiveX-Objektes.
oDoc:close()
oWord:Quit()
oWord:destroy()
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Exit-Methode beim (oder sagt man in) ActiveX-Object
Irgendwann habe ich es erst geschafft, dass der Codeblock ausgeführt wurde, konnte es aber nicht mehr reproduzieren.
Egal, ob ich mit Taskmanager beendet, es mit quit() vom Programm beendet oder von Hand beendet habe.
Deswegen versuche ich nun das Ganze in einem Activexcontrol in die Anwendung einzubetten.
Weiß vielleicht jemand, was daran falsch sein könnte?
Vielleicht ist die CLSID für Word ja ne andere?
Word.Application funzt auch nich.
Oder was anderes falsch?
Jedenfalls kann man nur das Fenster sehen und er meldet xbpactivexcontrol = couldn't create.
Egal, ob ich mit Taskmanager beendet, es mit quit() vom Programm beendet oder von Hand beendet habe.
Deswegen versuche ich nun das Ganze in einem Activexcontrol in die Anwendung einzubetten.
Weiß vielleicht jemand, was daran falsch sein könnte?
Code: Alles auswählen
oApp:=xbpdialog():new(SetAppWindow():drawingArea,,{0,0},getApp():drawingArea:currentsize())
oApp:title:="Word"
oApp:create()
oWord:=xbpActivexControl():new(oApp:drawingArea,,{10,10},{oApp:drawingArea:currentsize()[1]-40,oApp:drawingArea:currentsize()[2]-40})
oWord:visible:=.T.
oWord:CLSID:="{000209FF-0000-0000-C000-000000000046}"
oWord:create()
oApp:Show()
oWord:visible:=.T.
oWord:show()
Word.Application funzt auch nich.
Oder was anderes falsch?
Jedenfalls kann man nur das Fenster sehen und er meldet xbpactivexcontrol = couldn't create.
Viele Grüße
Stevie
Stevie
- Jan
- Marvin
- Beiträge: 14651
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Exit-Methode beim (oder sagt man in) ActiveX-Object
Stevie,
ich misch mich da mal eben ein. Mich irritiert die Fehlermeldung bzw. die Aussage, daß Word.Application nicht funktioniert.
Zuerst würde ich das natürlich darauf schieben, daß Word garnicht installiert ist. Was ich jetzt aber mal nicht unterstelle.
Der nächste Punkt wäre: Welches Betriebssystem benutzt Du? Zumindest unter Vista habe ich das massive Problem gehabt, daß da die CLSID nicht ausreicht. Viele ActiveX-Elemente wollen auch noch eine :License haben. Ohne die gibt es ebenfalls die Fehlermeldung bei :create(). Ich weiß jetzt nicht, wie die von Word lautet, weil ich da nicht mit arbeite. Aber Du kannst die über den Formdesigner rausbekommen. Was aber nach meinen Erfahrungen unter Vista nicht funktioniert, da muß dann ein anderer Rechner z. B. mit XP her.
Auf jeden Fall solltest Du aber in der endgültigen Programmversion den Fehler abfangen. Denn nicht jeder hat Word installiert, und ein Laufzeitfehler macht sich dann nicht so gut.
Jan
ich misch mich da mal eben ein. Mich irritiert die Fehlermeldung bzw. die Aussage, daß Word.Application nicht funktioniert.
Zuerst würde ich das natürlich darauf schieben, daß Word garnicht installiert ist. Was ich jetzt aber mal nicht unterstelle.
Der nächste Punkt wäre: Welches Betriebssystem benutzt Du? Zumindest unter Vista habe ich das massive Problem gehabt, daß da die CLSID nicht ausreicht. Viele ActiveX-Elemente wollen auch noch eine :License haben. Ohne die gibt es ebenfalls die Fehlermeldung bei :create(). Ich weiß jetzt nicht, wie die von Word lautet, weil ich da nicht mit arbeite. Aber Du kannst die über den Formdesigner rausbekommen. Was aber nach meinen Erfahrungen unter Vista nicht funktioniert, da muß dann ein anderer Rechner z. B. mit XP her.
Auf jeden Fall solltest Du aber in der endgültigen Programmversion den Fehler abfangen. Denn nicht jeder hat Word installiert, und ein Laufzeitfehler macht sich dann nicht so gut.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Exit-Methode beim (oder sagt man in) ActiveX-Object
Windows 2000 und Office 2000 Pro.
Die CLSID hab ich in der Registrierung entdeckt.
Das ich den Fehler abfangen muss, dass der User kein Word hat hat, ist logisch.
Die CLSID hab ich in der Registrierung entdeckt.
Das ich den Fehler abfangen muss, dass der User kein Word hat hat, ist logisch.
Viele Grüße
Stevie
Stevie
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Exit-Methode beim (oder sagt man in) ActiveX-Object
Hab jetzt Quit abfangen können, musste eine Eventschleife hinzufügen, dann klappte das.
Nur eins ist komisch. Word hat das Ereignis Quit, Excel aber nicht.
Hat Excel etwas anderes, sonst kann ich per visible in der Eventschleife das Programm
bis Excel beendet ist, anhalten?
Nur eins ist komisch. Word hat das Ereignis Quit, Excel aber nicht.
Hat Excel etwas anderes, sonst kann ich per visible in der Eventschleife das Programm
bis Excel beendet ist, anhalten?
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: Exit-Methode beim (oder sagt man in) ActiveX-Object
Stevie,
hatte auch das Problem, wurde durch die Hilfe von Alaska in Berlin gelöst.
oBook := oExcel:workbooks:open( cFile,,.t. )
oBook := oBook:dynamicCast(ActiveXObject())
oBook:BeforeClose := {||lExcelFinished := .T.}
lExcelFinished := .F.
Do WHILE !lExcelFinished
// Just wait
nEvent := AppEvent( @mp1, @mp2, , 1)
EndDo
// Quit Excel
oExcel:Quit()
oExcel:Destroy()
hatte auch das Problem, wurde durch die Hilfe von Alaska in Berlin gelöst.
oBook := oExcel:workbooks:open( cFile,,.t. )
oBook := oBook:dynamicCast(ActiveXObject())
oBook:BeforeClose := {||lExcelFinished := .T.}
lExcelFinished := .F.
Do WHILE !lExcelFinished
// Just wait
nEvent := AppEvent( @mp1, @mp2, , 1)
EndDo
// Quit Excel
oExcel:Quit()
oExcel:Destroy()
Gruß
Klaus
Klaus
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Exit-Methode beim (oder sagt man in) ActiveX-Object
hi,
solange Excel noch am "arbeiten" ist z.b. Workbook "schliessen" kannst du die Methodes
nicht aufrufen was bei vielen activeX passiert ... die sind einfach "zu langsam" und deshab
SLEEP() oder eleganter die Eventloop.
schieb doch mal ein SLEEP(1000) vor dein oExcel:Quit() ... dann hat er es auf einmal ...stevie hat geschrieben: Nur eins ist komisch. Word hat das Ereignis Quit, Excel aber nicht.
solange Excel noch am "arbeiten" ist z.b. Workbook "schliessen" kannst du die Methodes
nicht aufrufen was bei vielen activeX passiert ... die sind einfach "zu langsam" und deshab
SLEEP() oder eleganter die Eventloop.
gruss by OHR
Jimmy
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Exit-Methode beim (oder sagt man in) ActiveX-Object
naja nee, jetz ist das anders geworden.
Dokument neu erstellen.
Excel wird gestartet mit Vorlage und speichert das Dokument.
Jetzt bleibt Excel offen für den Fall, dass der Anwender noch etwas eintippen will.
Sobald Excel geschlossen wurde, wird das gespeicherte Dokument aus dem Arbeitsverzeichnis in das Zielverzeichnis kopiert und zwar automatisch.
Daher habe ich das bei Word so gelöst:
Da Excel Quit anscheinend nicht besitzt, jedenfalls sagt er das beim Quit-Codeblock zuweisen,
ist halt die Frage, ob es noch ein anderes Event für "Excel wurde durch Anwender beendet" gibt.
Ansonsten muss ich den gleichen Aufbau halt mit oExcel:visible machen.
Egal in welchem Zustand Excel steht, es ist immer .T. bis Excel geschlossen wurde.
Dokument neu erstellen.
Excel wird gestartet mit Vorlage und speichert das Dokument.
Jetzt bleibt Excel offen für den Fall, dass der Anwender noch etwas eintippen will.
Sobald Excel geschlossen wurde, wird das gespeicherte Dokument aus dem Arbeitsverzeichnis in das Zielverzeichnis kopiert und zwar automatisch.
Daher habe ich das bei Word so gelöst:
Code: Alles auswählen
oWord:Quit:={|| lCloseW:=.T.}
Eventschleife bis lCloseW halt, war ist.
ist halt die Frage, ob es noch ein anderes Event für "Excel wurde durch Anwender beendet" gibt.
Ansonsten muss ich den gleichen Aufbau halt mit oExcel:visible machen.
Egal in welchem Zustand Excel steht, es ist immer .T. bis Excel geschlossen wurde.
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: Exit-Methode beim (oder sagt man in) ActiveX-Object
Stevie,
wenn Du das benutzt was ich geschrieben habe, sollte es funktionieren
wenn Du das benutzt was ich geschrieben habe, sollte es funktionieren
Gruß
Klaus
Klaus
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Re: Exit-Methode beim (oder sagt man in) ActiveX-Object
BeforeClose wird aufgerufen, wenn das Dokument geschlossen wird,Koverhage hat geschrieben:Stevie,
wenn Du das benutzt was ich geschrieben habe, sollte es funktionieren
nicht aber wenn das Programm geschlossen wird, deswegen geht das so nicht.
Code: Alles auswählen
// Erzeugen eines "Excel.Application"-Objektes
oExcel := CreateObject("Excel.Application")
IF Empty( oExcel )
MsgBox( "Excel ist nicht installiert" )
RETURN
ENDIF
oExcel:= oExcel:dynamicCast(ActiveXObject())
// Vermeiden von Nachrichten wie "Die Datei
// existiert bereits". Sicherstellen, dass
// die Excel-Anwendung sichtbar ist.
oExcel:DisplayAlerts := .F.
oExcel:visible := .T.
oBook := oExcel:workbooks:Add(cVorl) // neue Datei mit Vorlage erstellen
oSheet := oBook:ActiveSheet
oSheet:PageSetup:Orientation := xlLandscape
//oSheet:Cells(1,1):Value:="Test"
// Speichern des Ergebnisses
IF ValType(cDatei)=="C"
oSheet:SaveAs(cDatei)
ENDIF
Do While oExcel:visible
nEvent := AppEvent( @mp1, @mp2, @oXbp )
Enddo
bevor es im Programm weitergeht.
Und jetzt bitte keine Ansagen, wie "den Fehler musst du noch abfangen",
da guck ich sowieso nochmal genau hin.
Aber trotzdem Vielen Dank für eure Mühen.
Viele Grüße
Stevie
Stevie