☆TOutlookApplicationを使ってみる。

Outlookから予定を取り出して、ガシェット風?に表示できないかなと思い、いままで一度も使ったことのないServersのTOutlookApplicationを試してみることにしました。

一応取得できるんですが、次のような問題があります。
1.パスワードが設定されている場合、パスワード入力ダイアログが表示される。
2.「アクセスを許可する時間」とかいうダイアログが出てきます。

1.については、Outlookが起動済みの場合は、NameSpace1.Logonにパスワードを設定すれば問題ないのですが、起動していない場合にはエラーになります。
2.については、Zaurusのリンクソフトでは表示されないので、何か方法があるはずだと思うのですが、Windowを監視してメッセージでボタンを押すぐらいのことしか思いつきませんでした。

※私の環境は、Delphi2006、Windows XP Pro SP2、Office XP Personalです。 又、このプログラムを会社のWindows XP Pro SP2、Office2003という環境でも試してみましたが、きちんと動作しました。

フォームに、OutlookApplication1、NameSpace1、Items1、Items2、Memo1を配置します。

uses DateUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  Appo: AppointmentItem;
  MF: MAPIFolder;
  Filter, S1, S2, S3, S4: String;
  SDate, EDate: TDateTime;
begin
  OutlookApplication1.Connect;
  try
    NameSpace1.ConnectTo(OutlookApplication1.GetNamespace('MAPI'));

    // OutLookが起動しているときには、次の処理は正常に動作しますが、
    // 起動していないときには、エラーになります。なんで??
    // パスワードが設定されている場合
    // NameSpace1.Logon('個人用フォルダ', pw, False, False);

    NameSpace1.Logon('', '', False, False);
    try
      MF := NameSpace1.GetDefaultFolder(olFolderCalendar);
      if Assigned(MF) then
      begin
        Items1.ConnectTo(MF.Items);
        Items1.Sort('[START]', OleVariant(False));
        Items1.IncludeRecurrences := WordBool(True);

        // 検索開始日
        SDate := IncDay(Now, -3);

        // 検索終了日
        EDate := IncDay(Now, 90);

        // フィルター文字列の作成
        Filter := '([Start] > "' +
                  FormatDateTime('yyyy/mm/dd hh:nn',SDate) +
                  '") and ([Start] < "' +
                  FormatDateTime('yyyy/mm/dd hh:nn',EDate) + '")';

        // フィルター処理後のアポイントメントを設定します。
        Items2.ConnectTo(Items1.Restrict(Filter));

        // 先頭からnilになるまで、順番に取得していきます。
        Appo := (Items2.GetFirst as _AppointmentItem);
        Memo1.Lines.Clear;
        Memo1.Lines.BeginUpdate;
        try
          while Appo <> nil do
          begin
            S1 := FormatDateTime('yyyy/mm/dd hh:nn', Appo.Start);
            S2 := FormatDateTime('yyyy/mm/dd hh:nn', Appo.End_);
            S3 := Appo.Subject;
            S4 := Appo.Body;
            Memo1.Lines.Add(Concat(S1,#9,S2,#9,S3,#9,S4));
            Appo := (Items2.GetNext as _AppointmentItem);
          end;
        finally
          Memo1.Lines.EndUpdate;
        end;
      end;
    finally
      NameSpace1.Logoff;
    end;
  finally
    // OutlookApplication1.Quit; ←Outlookが起動していた場合、閉じてしまう。
    OutlookApplication1.Disconnect;
  end;
end;


borland.public.delphi.oleautomation
Re: Problems with reading outlook calander
Darren Guy [Apr 22 2004, 16:37]
を参考にさせて頂きました。

|