Fehler beim Schreiben von Outlookterminen

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Fehler beim Schreiben von Outlookterminen

Beitrag von Rudolf »

Hallo,
habe einen Fehler beim Schreiben von Terminen ins Outlook den ich nicht verstehe. In der u.a. Funktion stürzt das Programm immer bei oOutlook:quit ab mit der Meldung "Object has no method with this name" ab.
Grüsse
Rudolf

Code: Alles auswählen

PROCEDURE putoutlook_termin(cBetreff,cText,cOrt,dDatum,cZeit,nDauer)
******************************************************************
   local oOutlook
   default nDauer to 60
   default cOrt to ""
   default cBetreff to "Termin"
   oOutlook := Outlook():New()
   IF oOutlook:lVerbunden
     oOutlook:SetTermin(cBetreff,cText,cOrt,dDatum,cZeit,nDauer)
   ENDIF
   oOutlook:quit() // !!!!!!!!!!!!!
   oOutlook:destroy()
   oOutlook := NIL
   oContacts := NIL
RETURN

**********************************************
** Klasse für die Arbeit mit Microsoft Outlook
**********************************************
** Erstellt: Andreas Engler
** Datum: 26.09.2007
**********************************************



**Konstanten von Outlook

*Item-Type
*#DEFINE olAppointmentItem  1
*#DEFINE olContactItem  2
*#DEFINE olDistributionListItem  7
*#DEFINE olJournalItem  4
*#DEFINE olMailItem  0
*#DEFINE olNoteItem  5
*#DEFINE olPostItem  6
*#DEFINE olTaskItem  3



CLASS Outlook
   EXPORTED:
   METHOD Init
   METHOD Destroy

   METHOD SetTermin                             //einen neuen Termin im aktuellen Kalender anlegen
   METHOD GetMsgTermine                         //Liste der Termine als Messagebox ausgeben

   Var oOutlook                                 //Outlook-Objekt
   Var lVerbunden                               //Steht die Verbindung zu Outlook

ENDCLASS



METHOD Outlook:Init()

   ::lVerbunden := .f.

   ::oOutlook := CreateObject( "Outlook.Application" )

   IF NIL == ::oOutlook
      // Outlook.Application kann nicht erzeugt werden.
      msgbox( "Fehler: "+alltrim(var2char(ComLastError()))+CRLF;
         +"Beschreibung:"+CRLF;
         +alltrim(var2char(ComLastMessage())),"Fehler")
   else
      ::lVerbunden := .t.
   ENDIF

RETURN self


METHOD Outlook:Destroy()

   IF ::lVerbunden
      ::oOutlook:destroy()
   ENDIF

   ::oOutlook := NIL
   ::lVerbunden := NIL

RETURN self


**einen neuen Termin im aktuellen Kalender anlegen
**Parameter:
**cBetreff - Betreff
**cNotiz - Notizen
**cOrt - Ort
**dDatum - Termindatum
**cZeit - Terminzeit (hh:mm:ss)
**nDauer - Dauer des Termines in Minuten
**nErinZeit - Erinnerung vor dem Termin in Minuten
METHOD SetTermin( cBetreff, cNotiz, cOrt, dDatum, cZeit, nDauer, nErinZeit )
   local oTermin
   local lOk := .f.

   Default cBetreff to "Termin", cNotiz to "", dDatum to date(),;
      cZeit to time(), cOrt to "", nDauer to 0,;
      nErinZeit to 60

   IF ::lVerbunden

      oTermin := ::oOutlook:CreateItem( olAppointmentItem )
      oTermin:Subject := cBetreff               //Betreff
      oTermin:Location := cOrt                  //Ort einstellen
      oTermin:Start := alltrim(str(year(dDatum)))+"-"+strzero(month(dDatum),2)+"-"+strzero(day(dDatum),2)+" "+cZeit //Startdatum und Zeit einstellen
      oTermin:Duration := nDauer                //Dauer des Termins einstellen
      oTermin:ReminderSet := .t.                //Errinerung aktivieren
      oTermin:ReminderMinutesBeforeStart = nErinZeit //Erinnerung vor dem Termin in Minuten
      *oTermin:ReminderTime := dDatum           //Datum und Zeit, zu denen die Erinnerung erfolgen soll
      oTermin:Body := cNotiz
      oTermin:save()                            //Termin speichern
      *oTermin:Display()                        //Termin am Display anzeigen

      lOk := .t.

   ENDIF

RETURN lOk

**Liste der Termine als Messagebox ausgeben
METHOD GetMsgTermine()
   local nCount := 0
   local cMsg := ""
   local i := 0

   IF ::lVerbunden

      nCount := ::oOutlook:Reminders:Count

      IF nCount > 0

         FOR i := 1 TO nCount
            cMsg += ::oOutlook:Reminders:Item(i):Caption  + CRLF // + " Termin: " + alltrim(var2char(::oOutlook:Reminders:Item(i):OriginalReminderDate))
         NEXT

         msgbox("Anzahl der Termine: "+var2char(nCount)+CRLF;
            +cMsg,"Info")

      else
         msgbox("Keine Termine vorhanden!","Info")
      ENDIF

   ENDIF


RETURN self
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

bitte verwende die CODE Tags sonst kann man den Code schlecht lesen.

Ich denke dass Outlook keine Methode Quit() hat. Eventuell heißt es dort EXIT() ? Hast du den Klassenbaum von Outlook ? Dort müsste es auch stehen.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

ich habe dein Beispiel mit dem aus den Samples verglichen:

Code: Alles auswählen

CLASS Outlook 
   EXPORTED: 
   METHOD Init 
   METHOD Destroy 

   METHOD SetTermin                             //einen neuen Termin im aktuellen Kalender anlegen 
   METHOD GetMsgTermine                         //Liste der Termine als Messagebox ausgeben 

   Var oOutlook                                 //Outlook-Objekt 
   Var lVerbunden                               //Steht die Verbindung zu Outlook 

ENDCLASS
Diese Klasse Outlook hat keine Methode Quit(), aber eine Instanzvariaben oOutlook, die das ActiveX Control von Outlook beinhaltet. Im Alaska Beispiel wird auch nur ContactNavigator:destroy() (hier also Outlook:destroy()) aufgerufen und dort dann das ::oOutlook:quit() ...

Code: Alles auswählen

METHOD Outlook:Destroy() 
   IF ::lVerbunden 
[color=red]
       ::oOutlook:quit() 
[/color]
       ::oOutlook:destroy() 
   ENDIF 
   ::oOutlook := NIL 
   ::lVerbunden := NIL 
RETURN self
Dann einfach die fehlerhafte Zeile löschen. Ich kann es hier zwar nicht probieren, aber es sollte funktionieren.
Gruß
Hubert
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Beitrag von Rudolf »

Hallo Hubert,
sorry wegen dem Sourcecode.
Habe nachgeschaut, quit() gibt es laut Doku. Habe mal mit dc_inspectobject(oOutlook) nachgeschaut, hier wird die Methode nicht angezeigt, nur destroy(). Aber nach dem Beenden von dc_inspectobject() gibt es eingartigerweise keine Fehlermeldung mehr. Wenn ich das dc_inspectobject() rausnehme bekomme ich wieder den Fehler. Habs auch mit sleep(500) schon versucht, der Fehler kommt dan auch.
Grüsse
Rudolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Rudolf,

schau dir nochmals deinen Quellcode und meine Beispiele an.

Die Klasse OUTLOOK ist nicht gleich dem ActiveX-Object. Sie hat nur eine Instanzvariable, die dieses Objekt speichert. Dieses Objekt kann die Methoden von MS-Outlook ausführen, aber nicht das Objekt der Klasse OUTLOOK.
Gruß
Hubert
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Beitrag von Rudolf »

Hallo Hubert,
vielen Dank, das war das Problem, jetzt funktioniert's. Jetzt muss ich nur noch die Kontakte ins Outlook rüberbekommen.
Grüsse
Rudolf
Antworten