Lazarus und Outlook via OLE steuern

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Lazarus und Outlook via OLE steuern

Beitrag von corpsman »

So jetzt läuft es aber, hier mein Finaler Code, wo ich mir noch unsicher bin, wo ich alles das " := Unassigned;" brauche ..

Code: Alles auswählen


Function FreiTermin(Titel, Vertreter: String; Start, Finish: TDateTime): String;
Var
  // Variablen im Lokalen Outlook
  Outlook,
    NameSpace,
    CalendarFolder,
    CalenderItems,
    FilteredCalenderItems,
    Item,
    // Variablen im Shared Kalender
  Recipient, SharedCalendarFolder: OLEVariant;
  newAppointment: OLEVariant;
  restriction, cpt: String;
  r_count, i: Integer;
Begin
  (*
   * 1. Speichern eines Termins im Urlaubskalender
   *
   * Anzeige: Frei
   * TagesEvent: Ja
   * Datum: Date
   * Kategorie: Meine Gruppe
   * Teilnehmer: Ich und Vorgesetzter
   * Betreff: Titel <Nachname>
   * Ort: -
   *)
  result := ''; // Kein Fehler
  Outlook := GetOutLook();
  NameSpace := Outlook.GetNameSpace('MAPI');
  Recipient := NameSpace.CreateRecipient(Urlaubskalender);
  Recipient.Resolve;
  If Not Recipient.Resolved Then Begin // Konnte den Kalender nicht auflösen -> Abbruch mit Fehler
    Outlook := Unassigned;
    Recipient := Unassigned;
    NameSpace := Unassigned;
    result := 'Could not resolve recipient ' + Urlaubskalender;
    exit;
  End;
  SharedCalendarFolder := NameSpace.GetSharedDefaultFolder(Recipient, olFolderCalendar);
  newAppointment := SharedCalendarFolder.items.add();
  newAppointment.MeetingStatus := olAppointment; // Typ Besprechung
  newAppointment.BusyStatus := olFree;
  newAppointment.AllDayEvent := True;
  newAppointment.Start := olevariant(Start);
  If start <> Finish Then Begin
    newAppointment.&End := olevariant(Finish);
  End;
  newAppointment.Categories := olevariant(Eigene_Gruppe);
  newAppointment.Location := olevariant('-');
  newAppointment.Recipients.Add(olevariant(Eigene_Email));
  newAppointment.Recipients.Add(olevariant(Vorgesetzter_EMail));
  newAppointment.ReminderSet := false;
  cpt := Titel + ' ' + Nachname;
  If Finish - Start > 1 Then Begin // Bei einem Termin ab 2 Tagen ist ein Vertreter notwendig
    If Vertreter = '' Then Begin
      result := 'Missing Vertreter.';
      exit;
    End;
    cpt := cpt + ' (Vertretung: ' + Vertreter + ')';
  End;
  newAppointment.Subject := olevariant(cpt);
  (*
   * 2. Versenden
   *)
  newAppointment.Send;
  //newAppointment.Display(true);
  r_count := 0;
  // Es dauert ein Weilchen bis der Termin im Eigenen Kalender ankommt, wir versuchen 1 Min lang den Termin zu finden.
  Repeat
    Sleep(5000);
    (*
     * 3. Den Termin im Eigenen Kalender auf "Abwesend" stellen und Speichern
     *)
    CalendarFolder := NameSpace.GetDefaultFolder(olFolderCalendar);
    CalenderItems := CalendarFolder.items;
    // Filtern nach den Terminen die um das Erstelldatum herum gemacht wurden
    restriction := '[Start] >= ''' + FormatDateTime('mm/dd/yyyy hh:mm AMPM', Start - 1) + ''' AND [End] <= ''' + FormatDateTime('mm/dd/yyyy hh:mm AMPM', Finish + 1) + '''';
    FilteredCalenderItems := CalenderItems.Restrict(OleVariant(Restriction));
    For i := 1 To FilteredCalenderItems.Count Do Begin
      Item := FilteredCalenderItems.item[i];
      // Kleine Heuristik die versucht den gerade erstellten Termin zu finden
      If (Item.Start = olevariant(Start)) And
        (Item.Subject = olevariant(cpt)) Then Begin
        item.BusyStatus := olAbsent;
        item.Save;
        Outlook := Unassigned;
        exit;
      End;
    End;
    r_count := r_count + 1;
  Until r_count >= 12;
  result := 'Could not find Appointment, timeout: ' + cpt;

  Outlook := Unassigned;
End; 
--
Just try it

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Lazarus und Outlook via OLE steuern

Beitrag von charlytango »

Gratuliere -- und danke für den Code

Antworten