C#でWordのNewDocumentイベントを利用する
最近はWordなんて嫌いだ業をしています
さて、Microsoft WordのApplicationClassを使って新しい文書を作成したときに何かしたいとします
Excelの経験をもとにApplicationClass.NewDocumentだろうと推測できますね
するとオブジェクトブラウザにとても愉快な表示が待っています
public virtual Microsoft.Office.Core.NewFile NewDocument { get; }
Microsoft.Office.Interop.Word.ApplicationClass のメンバーevent Microsoft.Office.Interop.Word.ApplicationEvents4_NewDocumentEventHandler NewDocument
Microsoft.Office.Interop.Word.ApplicationEvents4_Event のメンバーevent Microsoft.Office.Interop.Word.ApplicationEvents2_NewDocumentEventHandler NewDocument
Microsoft.Office.Interop.Word.ApplicationEvents2_Event のメンバーevent Microsoft.Office.Interop.Word.ApplicationEvents3_NewDocumentEventHandler NewDocument
Microsoft.Office.Interop.Word.ApplicationEvents3_Event のメンバー
この際なので同名のプロパティがいることは気にしないでおきます
ところでこれで次のようなコードを書いても動きません
this.Application.NewDocument += (d) => MessageBox.Show("NewDocument Test");
このときのエラーメッセージは次の通り
エラー 1 'Microsoft.Office.Interop.Word._Application.NewDocument' と 'Microsoft.Office.Interop.Word.ApplicationEvents4_Event.NewDocument' 間があいまいです。
エラー 2 プロパティまたはインデクサー 'Microsoft.Office.Interop.Word._Application.NewDocument' は読み取り専用なので、割り当てることはできません。
エラー 3 演算子 '+=' を 'Microsoft.Office.Core.NewFile' と 'ラムダ式' 型のオペランドに適用することはできません。
エラー 4 ラムダ式 はデリゲート型ではないため、型 'Microsoft.Office.Core.NewFile' に変換できません。
どうもイベントとプロパティどっちの話してんだよっていうエラー出てますね
当然Reflectionすればイベントは生きてるので普通に使えます
this.Application.GetType().GetEvents().First(x => x.Name == "ApplicationEvents4_Event_NewDocument").AddEventHandler(this.Application, hoge);
GetEventでも出せそうですがGetEvents.Firstのほうがあいまいでも出せるので…
しかし実際はReflectionしないでNewDocumentっていうのをもっと明確にすれば使えます
こんなコード
((Word.ApplicationEvents4_Event)this.Application).NewDocument += (d) => MessageBox.Show("NewDocument Test");
このオブジェクトブラウザに薄い文字で出てインテリセンスでも引っかからないインターフェースにキャストすることで行けます。
ApplicationClass自体はApplicationEvents4_Eventを実装してるらしいのでこれでなんとか
ちなみにApplicationEventsってくるインターフェースとかは1,2,3,4とありますが4が一番新しいので何もなければApplicationEvents4ってついてるのを使います
それでも2003ですが…
というわけでただのメモ書きです
Wordの機能とメソッドの対応がぜんぜんわかってなくてすごい難しい感じが
Excelだけ簡単すぎるって言うのは大体わかりますが
とりあえずこの辺で