Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2014年09月21日] [更新 2015年01月12日] Delphi 一般・その他
 
Servers タブのコンポーネント類
動作確認等 Windows 7 U64(SP1) + Delphi XE5(UP2) Pro
[整理番号 - 0510]







01_[ Servers ] タブのコンポーネント類のパッケージ


コンポーネントパレットの [Servers] タブに下図のようなコンポーネントが登録されています.
これらのコンポーネント類は,Microsoft Office 関係のアプリケーションの操作用です.




[備考]
Delphi のオンラインヘルプには,[Servers] タブのコンポーネントに関する記事はありません.




上の図は,Office 2000 用のパッケージの場合です.下の図は,Office 2010 用のパッケージを登録した場合のコンポーネントパレットです.[サーバー] というタブに登録されています.
筆者の環境の場合,Office 2010 用は Office 2000 用に比べて種類が多くありません.これは,インストールされている Office 関係のアプリケーションによります.
Office 2010 用のパッケージは,Delphi XE3 から提供されています.Delphi XE5 の場合,コンパイル済みパッケージの名前は,[bin] フォルダ内の dcloffice2010190.bpl です.




下図は,Delphi XE5 の IDE から,[コンポーネント] [パッケージのインストール] で表示したダイアログです.[XXX オートメーションサーバーコンポーネントのサンプル] がそれに該当します.この図では複数ありますが,実際に使用可能なのは 1 つだけです.
パッケージ名が違っていても,TExcelApplication 等の同じクラスが実装されています.同じ名前のクラスは同時には使用 (インストール) できません.

現在チェックが入っているパッケージ以外の Office 関係パッケージを使用する場合は,まず,下図のリストにある 全ての Office 関係のパッケージを [削除] します.そして,再度,下図のダイアログを表示して,[追加] します.そうしないと,正常にインストールできず,利用可能な状態にならないことがあります.

Delphi の IDE を起動した時に「次にパッケージを読み込む時にもこのパッケージを読み込みますか」という内容のダイアログが表示された場合は,[いいえ] のボタンをクリックして起動します.そして,再度パッケージの登録をします.
この時,一度でも [はい] をクリックしてしまうと,次項に書いてあるように,該当パッケージのチェックが外れてしまうことがあります.



図1
パッケージ名
  • 使用しない Office 関係のパッケージは [削除] する


[Servers] タブに登録されているコンポーネント類のソースコードは,Delphi XE5 の場合,下図に示す場所にあります.


図2
[Servers] コンポ類のソースコード




02_パッケージのチェックが外れる場合 - Disabled Packages 削除


使用しないパッケージを [削除] して,該当パッケージ名をチェックしても,IDE を再起動した時にチェックが外れてしまう場合は,レジストリの下図の場所を確認します.もし,チェックが外れているパッケージ名があったら削除します.


[備考]
Delphi の IDE を起動した時に「次にパッケージを読み込む時にもこのパッケージを読み込みますか」という内容のダイアログが表示された場合は,[いいえ] のボタンをクリックして起動します.そして,再度パッケージの登録をします.
この時,一度でも [はい] をクリックしてしまうと,該当パッケージのチェックが外れてしまうことがあります.



図3
チェックが外れているパッケージ




03_パッケージのチェックが外れる場合 - レジストリの項目削除


上記の操作をしてもチェックが外れてしまう場合は,レジストリから,該当パッケージ関係のキーまたは項目を全て削除します.
このファイル名は,Delphi XE の [Microsoft Office 2000 オートメーションラッパーコンポーネントのサンプル ...] の場合,dcloffice2k150.bpl です.この語句でレジストリ内を検索します.2k 以外のキーまたは項目も全て削除します.
レジストリから関係のキーまたは項目を全て削除したら,再度パッケージの登録ダイアログから [bin] フォルダ内にある .bpl を [追加] してみてください.

.bpl はコンパイル済のパッケージファイルです.[Servers] タブのコンポーネント用の .dpk ファイルはありません.

Delphi は起動時,つまり IDE の起動時にレジストリから情報を読み込んで各種の設定をします.したがって,レジストリの関係項目を削除するこの方法は,該当パッケージのチェックの有無に関係なく,そのパッケージが正常に読み込めない場合にもやってみる価値はあります.


この操作をしても改善されない場合は,該当バージョンの Delphi のレジストリの内容をインストール直後の状態に戻してしまう方法もあります.それには,-cleanregistry オプションを付けて IDE を起動します.
レジストリの内容を削除すると,IDE のデザインも初期の状態になります.また,登録したパッケージやコンポーネント類等も再度インストールが必要となり,ライブラリのパスの再設定も必要となります.

下のコマンドは,筆者の Windows 7 U64(SP1) + Delphi XE(UP1) Pro の場合です.コマンドプロンプトを管理者権限で起動して実行します.


"C:\Program Files (x86)\Embarcadero\RAD Studio\8.0\bin\bds.exe" -pDelphi -cleanregistry






04_[ Servers ] タブのコンポーネントの一覧


下表は [Servers] タブに登録されているコンポーネントの一覧です.
ユニットが複数ありますが,これは,どのバージョンのパッケージを利用するかによって異なります.より新しいバージョン用のユニットを使用すれば,そのバージョンのクラスやオブジェクトが使用可能となります.古いバージョン用のユニットでも,OleVariant 型でオブジェクトを定義すれば,新しいバージョンのクラスやオブジェクトを扱えます.

CreateOleObject でオブジェクトを生成し,OleVariant 型として使用する場合は,使用するユニットは任意です.本ページの最初の図でどのバージョンのパッケージを選択したかは関係ありません.



[備考]
下の表のコンポーネントのアイコン画像は,リソースエディタや,以下のサンプルプログラムを使用して取得できます.以下の記事のサンプルには画像の保存機能はありません.保存機能を追加する必要があります.


表1
[Servers] タブに登録されているコンポーネントの一覧 (Delphi XE5)
Office 2000 用のパッケージを使用可能にした場合

アイコン クラス名 ユニット名
TAccessApplication Access2000, AccessXP, Access2010
TAccessForm Access2000, AccessXP, Access2010
TAccessReferences Access2000, AccessXP, Access2010
TAccessReport Access2000, AccessXP, Access2010
TClass_ Access2000, AccessXP, Access2010
TContactItem Outlook2000, OutlookXP, Outlook2010
TDistListItem Outlook2000, OutlookXP, Outlook2010
TDocumentItem Outlook2000, OutlookXP, Outlook2010
TExcelApplication Excel2000, ExcelXP, Exel2010
TExcelChar Excel2000, ExcelXP, Excel2010
TExcelOLEObject Excel2000, ExcelXP, Excel2010
TExcelQueryTable Excel2000, ExcelXP, Excel2010
TExcelWorkbook Excel2000, ExcelXP, Exel2010
TExcelWorksheet Excel2000, ExcelXP, Excel2010
TExplorers Outlook2000, OutlookXP, Outlook2010
TFolders Outlook2000, OutlookXP, Outlook2010
TInspectors Outlook2000, OutlookXP, Outlook2010
TItems Outlook2000, OutlookXP, Outlook2010
TJournalItem Outlook2000, OutlookXP, Outlook2010
TMailItem Outlook2000, OutlookXP, Outlook2010
TMaster MSPpt2000
TNameSpace Outlook2000, OutlookXP, Outlook2010Delphi
TOutlookApplication Outlook2000, OutlookXP, Outlook2010
TOutlookBarGroups Outlook2000, OutlookXP, Outlook2010
TOutlookBarPane Outlook2000, OutlookXP, Outlook2010
TOutlookBarShortcuts Outlook2000, OutlookXP, Outlook2010
TPostItem Outlook2000, OutlookXP, Outlook2010
TPowerPointApplication MSPpt2000
TPowerPointPresentation MSPpt2000
TPowerPointSlide MSPpt2000
TRemoteItem Outlook2000, OutlookXP, Outlook2010
TReportItem Outlook2000, OutlookXP, Outlook2010
TSyncObject Outlook2000, OutlookXP, Outlook2010
TTaskRequestAcceptItem Outlook2000, OutlookXP, Outlook2010
TTaskRequestDeclineItem Outlook2000, OutlookXP, Outlook2010
TTaskRequestItem Outlook2000, OutlookXP, Outlook2010
TTaskRequestUpdateItem Outlook2000, OutlookXP, Outlook2010
TWordApplication Word2000, WordXP, Word2010
TWordDocument Word2000, WordXP, Word2010
TWordFont Word2000, WordXP, Word2010
TWordLetterContent Word2000, WordXP, Word2010
TWordParagraphFormat Word2000, WordXP, Word2010




05_フォームにコンポーネントを配置してオブジェクトを操作


[Servers] タブのコンポーネントは,フォームに配置して使用できます.メインとなるコンポーネントは TXxxApplication というコンポーネントです.TXxxApplication から他のオブジェクトを生成したり操作できます.
次のコードは,PowerPoint (パワーポイント) のファイルをスライドショーとして表示する例です.
[↓] または [↑] キーで表示するページを移動します.
MSPpt2000 を使用して,uses に Office2000 を追加して動作確認しています.OfficeXXX は各オブジェクトで使用する共通の定数名を使用するために追加しています.OfficeXXX を使用しない場合は,定数名ではなく,実際の値を使用することになります.



図4
設計時画面

リスト1
PowerPoint のスライドショー表示の例
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  FilePath      : String;
  PPssSettingns : SlideShowSettings;
  PPssWindow    : SlideShowWindow;
  hPPssWindow   : Integer;
begin
  FilePath := ExpandFileName('プロジェクトの概要.pps');

  PowerPointApplication1.Presentations.Open(FilePath,
                                            msoFalse,
                                            msoFalse,
                                            msoTrue);
  PowerPointApplication1.WindowState := ppWindowMinimized;

  PPssSettingns := PowerPointApplication1.ActivePresentation.SlideShowSettings;
  PPssSettingns.LoopUntilStopped := msoFalse;
  PPssSettingns.ShowType := ppShowTypeWindow;

  PPssWindow := PPssSettingns.Run;
  hPPssWindow := PPssWindow.HWND;
  SetForegroundWindow(hPPssWindow);
  PPssWindow.View.Next;
end;

procedure TForm1.PowerPointApplication1SlideShowEnd(ASender: TObject;
  const Pres: _Presentation);
begin
  PowerPointApplication1.ActivePresentation.Saved := msoTrue;
  PowerPointApplication1.ActivePresentation.Close;
  PowerPointApplication1.WindowState := ppWindowMinimized;
end;




06_CreateOleObject でオブジェクトのインスタンスを生成


[Servers] タブにあるコンポーネントを使用しなくても,各コンポーネントに相当するオブジェクトは,CreateOleObject で生成することができます.
そのためには,ProgID の値を知る必要があります.ProgID の値は,下図のようなオブジェクトビューアで調べることができます.

CreateOleObject は Visual Basic または VBA (Visual Basic for Application) の CreateObject に相当します.後述の,マイクロソフトの [Office 開発者向けドキュメント] 内にサンプルコードが掲載されています.そのコードで ProgID の値を知ることができます.



  • 図5
  • オブジェクトビューアで PowerPoint の ProgID を調べる

次のコードは PowerPoint の操作例です.スライドショーとして表示します.
オブジェクトを全て OleVariant 型で扱っています.
定数名を使用するために,uses に MSPpt2000, Office2000 を追加して動作確認しています.これらのユニットを使用しない場合は,定数名ではなく,実際の値を使用することになります.あるいは const で定数名を定義して使用します.const で定義する場合,該当するユニットで定義している定数名の名前と同じにしておくいいでしょう.


[備考]
CreateOleObject で生成したオブジェクトを全て OleVariant 型で扱う場合,上のサンプルコードで使用している SlideShowWindow の HWND プロパティはありません.このことは,後述の開発者用のリファレンスで SlideShowWindow を調べてみると確認できます.



リスト2
PowerPoint のスライドショー表示の例
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    PPApplication : OleVariant;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses ComObj;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  PPApplication := CreateOleObject('PowerPoint.Application');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if not VarIsEmpty(PPApplication) then begin
    PPApplication.Quit;
    PPApplication := Unassigned;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  FilePath      : String;
  PPssSettingns : OleVariant;
  PPssWindow    : OleVariant;
begin
  FilePath := ExpandFileName('プロジェクトの概要.ppt');

  PPApplication.Presentations.Open(FilePath, msoTrue);
  PPApplication.WindowState := ppWindowMinimized;

  PPssSettingns := PPApplication.ActivePresentation.SlideShowSettings;
  PPssSettingns.LoopUntilStopped := msoFalse;
  PPssSettingns.ShowType := ppShowTypeSpeaker;

  PPssWindow := PPssSettingns.Run;
end;




07_[ Servers ] タブのコンポ類のヘルプ  -  MSDN ライブラリ検索


Delphi のオンラインヘルプには,[Servers] タブにあるコンポーネント類の記事はありません.
MSDN オンラインやネット上で調べることになります.MSDN ライブラリには,一部,日本語の記事もありますが,多くの記事は英語版です.
下図は,Outlook の TRemoteItem のメンバーを調べるために,[Outlook RemoteItem] で MSDN ライブラリ内を検索した結果です.TRemoteItem の先頭の 'T' は Delphi のクラス名を意味しています.ししたがって,この 'T' を除いた RemoteItem で検索します.
Google で [日本語のページを検索] にすると,機械翻訳したページがヒットすることがあります.



図6
MSDN オンラインを検索
図7
[日本語のページを検索] した場合




08_[ Servers ] タブのコンポ類のヘルプ - 開発者用リファレンス


Microfot Office 関係のアプリケーションには,開発者用のリファレンスが実装されています.開発の際のヘルプとして利用可能です.
この開発者用のリファレンスは,各々のアプリケーションのヘルプから表示できますが,単独で起動するようにすることもできます.



図8
開発者用リファレンス




09_Office 開発者向けドキュメント


Microsof Office 関連のリファレンスとして,[Office デベロッパーセンター] があります.
URL は以下の通りになっています.2014年09月21日現在,日本語版の記事もありますが,英語版の記事の全てが日本語になっているわけではありません.



//Office 開発者向けドキュメント(日本語版)
http://msdn.microsoft.com/ja-jp/library/office/

//Office 開発者向けドキュメント(英語版)
http://msdn.microsoft.com/en-us/library/office/


次の図は,TExcelWorkbook の SaveAs メソッドを,この Office デベロッパーセンター内で検索する例です.TExcelWorkbook は Excel の Workbook オブジェクトを意味します.
そこで,検索語句は [Workbook SaveAs] とします.最初の図が検索の結果のページ一覧です.その次の図は,検索の結果ヒットした最初のページを表示したものです.




  • 図10
  • 上の図の検索結果で,最初のページを表示




10_マイクロソフトのサイト内を検索する際の注意


前項の図は,[Workbook SaveAs] で検索した結果です.
すでに述べたように,[TExcelWorkbook] ではなく,[Workbook] あるいは [Excel Workbook] という語句で検索することに注意します.[TExcelWorkbook SaveAs] で検索しても,下図のように何もヒットしません.マイクロソフトのサイト内を検索する時は検索語句に注意します.

Delphi では,クラス名やレコード型の名前にプリフィックスとして,先頭に 'T' を付けるのが慣習となっています.
Delphi のオンラインヘルプ内を検索する場合は,このプリフィックスの T を含めたクラス名の方が意味のあるページがヒットしますが,マイクロソフトのサイト内を検索する場合は,先頭の T を付けないで検索するようにします.



[備考]
実際問題として,当サイトのアクセス解析でみる限りでは,検索エンジンでクラス名を使用して検索する方はほとんどいないようですが,例外もあります.
この TExcelWorkbook 等もその 1 つです.TExcelWorkbook で検索する方が多いようです.



図11
何もヒットしない