Outlook 2007 display()-Fehler

Einbindung von Office-Komponenten wie Word, Excel usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Outlook 2007 display()-Fehler

Beitrag von Werner_Bayern »

Servus,

Code: Alles auswählen

oOutlook := GetObject(NIL, "Outlook.Application")
IF Empty( oOutlook )
   RETURN NIL
ENDIF

ErrorBlock({|oError|OutlookFehler(oError)})
begin sequence
   oMail := oOutlook:CreateItem(0)
   if .not. ComLastError() == 0 .or. .not. valtype(oMail) == "O"
      break()
   endif
   If !empty( cAdress )
//       oMail:Recipients:Add( cAdress)
       oMail:setProperty("TO", cAdress)
   endif
   oMail:Subject  := cSubject
   oMail:body     := cBody
   oMail:Display(.t.)
   oOutlook:destroy()
end sequence
Läuft grundsätzlich, wird jedoch das Mail-Fenster geschlossen ohne zu senden, erscheint der Fehler:
Unzulässige Funktion. Bei Ausführung von: Display
Warum?
Und warum knallt es unter OL 2007 bei oMail:Recipients:Add( cAdress)?
mit
Vorgang abgebrochen
Danke!
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Outlook 2007 display()-Fehler

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:

Code: Alles auswählen

   If !empty( cAdress )
//       oMail:Recipients:Add( cAdress)
       oMail:setProperty("TO", cAdress)
   endif
   oMail:Subject  := cSubject
   oMail:body     := cBody
   oMail:Display(.t.)
   oOutlook:destroy()
end sequence
Läuft grundsätzlich, wird jedoch das Mail-Fenster geschlossen ohne zu senden, erscheint der Fehler:
Unzulässige Funktion. Bei Ausführung von: Display
Warum?
weil du es nicht abfängst ;)
ich meine jetzt nicht den ErrorBlock im Xbase++ Thread sondern den "oMail:Display" Thread.

du verwendest GetObject() / oder CreateObject() und später CreateItem(olMailItem)
wenn du nun mit oMail:Display() das "Detail" Fenster aufrufst läuft das im externen activeX Thread

ich verwende statt olMailItem (= 0) nun für den Outlook Calender olAppointmentItem (= 1)
was mir ja ebenfalls ein "Detail" Fenster aufmacht der folgende Events "feuert"

Code: Alles auswählen

// Item Display Events
#define EvClose                 "Close"
#define EvWrite                 "Write"
#define EvPropertyChange        "PropertyChange"
#define EvItemChange            "ItemChange"
#define EvDeactivate            "Deactivate"
// Outlook selbst
#define EvQuit                  "Quit"
die muss man nun per SubscribeEvent() "abonnieren", aber das geht nur bei einem ActiveXObject() welches man mit dynamicCast() bekommt.

Code: Alles auswählen

      ::oOutlook := ::oOutlook:dynamicCast( ActiveXObject() )
      xVar := ::oOutlook:isEventPublished( EvQuit )
      IF xVar <> NIL
         lSuccess := ::oOutlook:SubscribeEvent( xVar, { | a, b, c, d | IF( NIL = ::oMainApp, NIL,;
                                       PostAppEvent( xbeE_TerminRefresh, dDate,, ::oMainApp ) ),;
                                       PostAppEvent( xbeP_Activate,,, ::ButtonOK ) } )
         IF .NOT. lSuccess
            //  LOGME("::oOutlook EvQuit FAIL")
         ENDIF
      ENDIF

      ::oItem := ::oItem:dynamicCast( ActiveXObject() )
      xVar := ::oItem:isEventPublished( EvWrite )
      IF xVar <> NIL
         lSuccess := ::oItem:SubscribeEvent( xVar, { | a, b, c, d | PostAppEvent( xbeE_TerminWrite,,, Self ) } )
         IF .NOT. lSuccess
            //  LOGME("::oItem EvWrite FAIL")
         ENDIF
      ENDIF

      xVar := ::oItem:isEventPublished( EvClose )
      IF xVar <> NIL
         lSuccess := ::oItem:SubscribeEvent( xVar, { | a, b, c, d | IF( NIL = ::oMainApp, NIL,;
                                    PostAppEvent( xbeE_TerminRefresh, dDate,, ::oMainApp ) ),;
                                    PostAppEvent( xbeP_Activate,,, ::ButtonOK ) } )
         IF .NOT. lSuccess
            //  LOGME("::oItem EvClose FAIL")
         ENDIF
      ENDIF

      ::oItem:Display()
      ShowOnTop( TRIM( cSUBJECT ) + " - Termin" )
Werner_Bayern hat geschrieben:Und warum knallt es unter OL 2007 bei oMail:Recipients:Add( cAdress)?
mit
Vorgang abgebrochen
hm ... dazu müsste ich mehr Code sehen worauf sich dein oMail bezieht was du mit CreateItem() angelegt hast
( 0 = olMailItem, 1 = olAppointmentItem , olRecipients = 17 )

p.s. die Standardempfänger ist doch "TO". ich kenne Recipients als "CC"
Set myOlApp = CreateObject("Outlook.Application")
Set myItem = myOlApp.CreateItem(olMailItem)
Set myRecipient = myItem.Recipients.Add ("Jon Grande")
myRecipient.Type = olCC
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Outlook 2007 display()-Fehler

Beitrag von Werner_Bayern »

AUGE_OHR hat geschrieben:weil du es nicht abfängst
Muss ich drauf reagieren, obwohl es mich nicht interessiert?
Sorry Jimmy, aber Dein Beispielcode ist mir zu hoch :shaking:

AUGE_OHR hat geschrieben:p.s. die Standardempfänger ist doch "TO". ich kenne Recipients als "CC"
Das folgende Beispiel erstellt ein neues MailItem-Objekt und fügt "Jon Grande" als Standardempfänger (To) hinzu.

Visual Basic für Applikationen
Set myOlApp = Outlook.Application
Set myItem = myOlApp.CreateItem(olMailItem)
Set myRecipient = myItem.Recipients.Add ("Jon Grande")

Das folgende Beispiel erstellt das gleiche MailItem-Objekt wie das vorherige Beispiel und ändert anschließend den Typ des Recipient-Objekts vom Standardwert (To) in CC.

Visual Basic für Applikationen
Set myOlApp = Outlook.Application
Set myItem = myOlApp.CreateItem(olMailItem)
Set myRecipient = myItem.Recipients.Add ("Jon Grande")
myRecipient.Type = olCC
AUGE_OHR hat geschrieben:hm ... dazu müsste ich mehr Code sehen worauf sich dein oMail bezieht was du mit CreateItem() angelegt hast
Siehe mein Code oben, ist einfach nur ausgeklammert und mit to ersetzt. Eigentlich ist aber recipients die korrekte Methode.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Outlook 2007 display()-Fehler

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:
AUGE_OHR hat geschrieben:weil du es nicht abfängst
Muss ich drauf reagieren, obwohl es mich nicht interessiert?
Sorry Jimmy, aber Dein Beispielcode ist mir zu hoch :shaking:
du sagtest doch
wird jedoch das Mail-Fenster geschlossen ohne zu senden, erscheint der Fehler:
und das wäre der EVClose oder EvQuit Event. beim EvWrite Event läuft es so wie gewünscht.

siehe mal unter den Mail Optionen nach ob da "sofort senden" steht.
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Outlook 2007 display()-Fehler

Beitrag von Werner_Bayern »

AUGE_OHR hat geschrieben:siehe mal unter den Mail Optionen nach ob da "sofort senden" steht.
Ja, aber ich will es ja dem Anwender überlassen, ob der die vom Programm vorbereitete Mail sendet oder verwirft.
Also, was mache ich da falsch?
Danke!
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Outlook 2007 display()-Fehler

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:
AUGE_OHR hat geschrieben:siehe mal unter den Mail Optionen nach ob da "sofort senden" steht.
Ja, aber ich will es ja dem Anwender überlassen, ob der die vom Programm vorbereitete Mail sendet oder verwirft.
Also, was mache ich da falsch?
kann der Anwender ja, aber du musst das EvClose dafür "auswerten" weil das die "Aktion" für das "verwerfen" ist.
bin z.Z. auf dem "falschen" PC zugange und habe keinen aktuellen Source hier ...
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Outlook 2007 display()-Fehler

Beitrag von Werner_Bayern »

Danke, werde ich mal testen, mal sehen, ob ich da was Funktionierendes zusammenbringe... #-o
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Outlook 2007 display()-Fehler

Beitrag von Werner_Bayern »

Jimmy,
hab jetzt einiges probiert. Das Mail-Objekt hat keine Callbacks für quit. Close gibts nicht. Quit gibts nur für ein Application-Objekt. Hab jetzt folgendes:

Code: Alles auswählen

oOutlook := GetObject(NIL, "Outlook.Application")
oOutlook := oOutlook:dynamicCast(ActiveXObject())
oOutlook:quit := {||oMail:send()}
Dann kommt keine Fehlermeldung mehr, jedoch wird die Mail auch in den Postausgang gestellt. Also grundsätzlich schon mal besser. Aber, wie bekomme ich die Info, ob Abbrechen oder Senden geklickt wurde? Bzw. wie muss ich im Callback reagieren?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Outlook 2007 display()-Fehler

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:hab jetzt einiges probiert. Das Mail-Objekt hat keine Callbacks für quit. Close gibts nicht. Quit gibts nur für ein Application-Objekt. Hab jetzt folgendes:

Code: Alles auswählen

oOutlook := GetObject(NIL, "Outlook.Application")
oOutlook := oOutlook:dynamicCast(ActiveXObject())
oOutlook:quit := {||oMail:send()}
Dann kommt keine Fehlermeldung mehr, jedoch wird die Mail auch in den Postausgang gestellt. Also grundsätzlich schon mal besser. Aber, wie bekomme ich die Info, ob Abbrechen oder Senden geklickt wurde? Bzw. wie muss ich im Callback reagieren?
ein Callback Slot ist im Prinzip eine iVAR die man mit einem Codeblock "belegen" kann. einen Codeblock gibt es aber "so" nicht in Windows...
die activeX Schnittstelle von Xbase++ ermöglicht uns ja die OOP Schreibweise

Code: Alles auswählen

oOutlook:quit := {||oMail:send()}
oder
oOutlook:SetProperty("quit",{||oMail:send()})
was dann per EVAL( {|| ... } ) im GUI Thread den Codeblock ausführt.

wenn du dir das Outlook Model ansiehst wirst du für jede Object Class auch Events finden.

per MAPI und Namespace kommst man ja an das "Application" Object
Danach dann das CreateItem() mit den Konstanten (olMailItem, olAppointmentItem ) für ein "Item" Object.

ich verwenden also 2 x o:dynamicCast() jeweils für "das" betreffende Object um per o:SubscribeEvent() die entsprechenden Events "abzufangen".
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Outlook 2007 display()-Fehler

Beitrag von Werner_Bayern »

es wurde Zeit, das doch mal umzusetzen :lol:

Habs jetzt so gelöst, scheint zu funktionieren:

Code: Alles auswählen

    .
    .
    oMail:Display(.t.)
    bSave := ErrorBlock({|e| BREAK(e)})
    BEGIN SEQUENCE
      lRueck := oMail:Sent
    RECOVER
      lRueck := .t.  // Fehler Object wurde verschoben, also vermutlich versendet
    END SEQUENCE
    ErrorBlock(bSave)
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten