ActiveX / MS Powerpoint 2003 / :quit()

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

ActiveX / MS Powerpoint 2003 / :quit()

Beitrag von notloesung »

Hi,

habe mal (wieder) ein Problem mit ActiveX.
Aus einer Xbase Anwendung bediene ich MS Powerpoint (2003).
(Ich muss das Format einer Folie ermitteln.)
Beispiel:

Code: Alles auswählen

   oPowerpoint := GetObject( NIL, "Powerpoint.Application" )
   IF NIL == oPowerpoint
      ...
      // Druckeigenschaften einstellen
      cPageFormat := MEMVAR->gcFormat
   ELSE

      // Erzeugen eins Objektes der Klasse ActiveXObject aus
      // einem Objekt der Klasse AutomationObject.
      // Diese wurde von der Function GetObject() zurückgegeben.
      oPowerpoint := oPowerpoint:dynamicCast( ActiveXObject() )

      // Wichtig !!! Fenster muss visible sein !!!
      oPowerpoint:visible := .T.
 
     // Fenster minimieren
      oPowerpoint:WindowState = 2

      // Folie laden
      oPowerpoint:Presentations:Open( pcFile )

      // Hier wird das Format ermittelt ...
      ...

      // dann wird noch gedruckt ...
      ...

      // Und zum Schluss Folie und die Presentation schließen..
      oPowerpoint:ActivePresentation:close()
      oPowerpoint:Quit()
      oPowerpoint:destroy()
Das Schließen der geladenen Folie klappt reibungslos. Das Problem vor dem ich stehe ist das Schließen der eigentlichen Powerpoint-Anwendung.
Nach meinen Recherchen muss es eine quit() Methode geben. Das Programm läuft an diese Stelle aber ohne Murks durch und es passiert nichts.
Leider bin ich auf der Suche nach einer ActiveX Dokumentation für Powerpoint nicht wirklich erfolgreich gewesen.
In diesen Fällen hälfe ich mir damit, dass ich VBA benutzte und schaue was da möglich ist. Das übertrage ich dann in Xbase.
Alle so gefundenen Methoden funktionieren, nur eben das Quit() nicht.

Hat jem. einen Tipp für mich? Was könnte ich noch versuchen?

Gruß,
Notloesung
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2935
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: ActiveX / MS Powerpoint 2003 / :quit()

Beitrag von Wolfgang Ciriack »

Hi,
schau dir mal (office 2003) unter

C:\Programme\Microsoft Office\OFFICE11\1031

die Datei VBAPP10.CHM an.
Viele Grüße
Wolfgang
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Re: ActiveX / MS Powerpoint 2003 / :quit()

Beitrag von notloesung »

Hallo Wolfgang,

danke.
#-o Wieso hab ich die Datei vorher nicht gefunden #-o

Nur was verstehe ich jetzt nicht :?: - oder habe ich Tomaten auf den Augen :roll:
In der Doku steht:
Anmerkungen
Verwenden Sie vorher die Save- oder SaveAs-Methode zum Speichern aller geöffneten Präsentationen, damit Sie nicht zum Speichern aufgefordert werden, nachdem Sie die Quit-Methode verwendet haben.

Beispiel
In diesem Beispiel werden alle geöffneten Präsentationen gespeichert, und PowerPoint wird beendet.

Code: Alles auswählen

With Application
   For Each w In .Presentations
      w.Save
   Next w
   .Quit
End With
Nichts anderes mache ich. Ich schließe die Präsentation (ohne zu speichern, hab an der nicht geändert, werde zum speichern auch nicht aufgefordert) und rufe dann das quit().
Aber es passiert nichts.

Gruß,
Notloesung
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Re: ActiveX / MS Powerpoint 2003 / :quit()

Beitrag von notloesung »

Guten Morgen,

es lässt mir einfach keine Ruhe :confused2:
Könnte jemand bei Gelegenheit das bei sich revidieren?
Das Problem ist bei mir Rechnerunabhängig.
Jetzt würd mich nur interessieren ob es "einfach" ein Powerpoint Problem ist.

Zum Prüfen sollte dann das hier reichen:

Code: Alles auswählen

      oPowerpoint := GetObject( NIL, "Powerpoint.Application" )
      oPowerpoint := oPowerpoint:dynamicCast( ActiveXObject() )

      // Wichtig !!! Fenster muss visible sein !!!
      oPowerpoint:visible := .T.

      // Das QUIT() ist das Problem - Es bewirkt nichts(?)!
      oPowerpoint:Quit()
Vielen Dank im Voraus,
Notloesung
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: ActiveX / MS Powerpoint 2003 / :quit()

Beitrag von Christof »

Hallo Notloesung,

hab's eben mal ausprobiert.

Bei mir funktioniert folgender Code einwandfrei. Die Datei wird geöffnet und auch wieder geschlossen.

Code: Alles auswählen

#include "activex.ch"
#include "powerpoint.ch"

procedure main
LOCAL oPowerpoint, oPres
LOCAL cShowName

cShowName:=Appname(.T.)
cShowName:=left(cShowName,rat("\",cShowName))+"Testshow.ppt"

 oPowerpoint := CreateObject("Powerpoint.Application")
 IF Empty( oPowerpoint )
   ? "Powerpoint ist nicht installiert!" 
   RETURN
 ENDIF

 oPowerpoint:visible       := .T.
 oPres  := oPowerpoint:Presentations:Open(cShowName)

 sleep(1000)
 oPowerpoint:Quit()
 oPowerpoint:Destroy()

return
Ich kenne mich da (noch) nicht so gut aus. Könnte es daran liegen, dass Du mit "GetObject" an die Sache rangehst und nicht mit "CreateObject"?
Die beiden CH-Dateien hast Du doch eingebunden, oder? Powerpoint.ch schon mal mit Tlb2CH.EXE (neu) erstellt?

Gruß

Christof
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12907
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: ActiveX / MS Powerpoint 2003 / :quit()

Beitrag von AUGE_OHR »

hi,
notloesung hat geschrieben: es lässt mir einfach keine Ruhe :confused2:
vergiss es ... mit Excel gab es auch mal solche Problem, aber nicht auf jedem PC ...

warum versuchst du nicht einfach deine Xbase++ Application "abzuschiessen" ?

Code: Alles auswählen

IF FILE( "EMAILYIU.EXE" )
   CloseIt( { "Nachricht lesen", ;
              "Nachricht schreiben", ;
              "Nachrichten Eingang", ;
              "Nachrichten gesendet" } )
ENDIF

FUNCTION CloseIt( aNaam )
LOCAL i, nMax
   nMax := LEN( aNaam )
   FOR i = 1 TO nMax
      CloseNow( aNaam[ i ] )
   NEXT
RETURN NIL
DLLFUNCTION SendMessageA( nHwnd, nCmd, wParam, lParam ) USING STDCALL FROM USER32.DLL

#define WM_CLOSE        0x0010
#define WM_QUIT         0x0012

FUNCTION CloseNow( cNaam )
LOCAL oDlg
LOCAL aTasklist
LOCAL aSize     := { 0, 0 }
LOCAL aPos      := { 0, 0 }
LOCAL lRunnin   := .F.
LOCAL i
LOCAL nHwnd, cWind

   oDlg := XbpDialog() :new( AppDesktop(),, aPos, aSize,, .F. )
   oDlg:clipSiblings := .T.
   oDlg:drawingArea:ClipChildren := .T.
   oDlg:create()

   SETAPPFOCUS( oDlg )

   aTasklist := GetTaskList( oDlg:gethWnd( ) )

   FOR i = 1 TO LEN( aTasklist )
      cWind := TRIM( UPPER( SUBSTR( aTasklist[ i ], 9 ) ) )
      cWind := SUBSTR( cWind, 1, LEN( cWind ) - 1 )
      IF cWind == TRIM( UPPER( cNaam ) )
         lRunnin := .T.
         nHwnd := VAL( LEFT( aTasklist[ i ], 8 ) )
         SendMessageA( nHwnd, WM_CLOSE, 0, 0 )  // oder WM_QUIT
         RETURN lRunnin
      ENDIF
   NEXT
RETURN lRunnin
gruss by OHR
Jimmy
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Re: ActiveX / MS Powerpoint 2003 / :quit()

Beitrag von notloesung »

Hi,
AUGE_OHR hat geschrieben:warum versuchst du nicht einfach deine Xbase++ Application "abzuschiessen" ?
An ähnliches habe ich auch schon gedacht. Ist aber vom Ablauf her so leider nicht umsetzbar.
Christof hat geschrieben:Bei mir funktioniert folgender Code einwandfrei. Die Datei wird geöffnet und auch wieder geschlossen.
auf alles gefasst :roll: habe ich den Code 1 zu 1 kopiert und bei mir laufen lassen ...
Das funktioniert auch bei mir #-o

Worin liegt denn der Unterschied :?:
An den "GetObject" / "CreateObject" liegt es nicht.
Vor dem schließen setze ich noch den Befehl zu drucken ab

Code: Alles auswählen

oPowerpoint:ActivePresentation:PrintOut()
Danach schließe ich Powerpoint.
Und genau dieser Stelle ist kritisch. Anscheinend kommt der Quit() Befehl zu "schnell" hinter dem PrintOut() Befehl ( :roll: ).

Ich habe das jetzt so gelöst, dass ich nach dem PrintOut() warte bis der Druck zu ende ist (ich drucke in eine Datei). Danach setze ich den :quit() Befehl ab
und sehe da, es funktioniert :blob8:

So ganz verstanden habe ich die ganze Angelegenheit nicht. Denn der :quit() Befehl verschwand vorher anscheinen in Nirwana.


Christof hat geschrieben:Ich kenne mich da (noch) nicht so gut aus. Könnte es daran liegen, dass Du mit "GetObject" an die Sache rangehst und nicht mit "CreateObject"?
Die beiden CH-Dateien hast Du doch eingebunden, oder? Powerpoint.ch schon mal mit Tlb2CH.EXE (neu) erstellt?
An dieser Stelle habe ich gleich etwas Neues gelernt. Die Möglichkeit mit Tlb2CH.EXE kannte ich bisher nicht!

Gruß,
Notloesung
Antworten