Ruby 2.1.0 リファレンスマニュアル > ライブラリ一覧 > win32oleライブラリ > WIN32OLE_TYPEクラス > default_event_sources

instance method WIN32OLE_TYPE#default_event_sources

default_event_sources -> [WIN32OLE_TYPE][permalink][rdoc]

型が持つソースインターフェイスを取得します。

default_event_sourcesメソッドは、selfがCoClass(コンポーネントクラス)の場合、そのクラスがサポートするデフォルトのソースインターフェイス(イベントの通知元となるインターフェイス)を返します。

[RETURN]
デフォルトのソースインターフェイスをWIN32OLE_TYPEの配列として返します。返すのは配列ですが、デフォルトのソースインターフェイスは最大でも1インターフェイスです。ソースインターフェイスを持たない場合は空配列を返します。
tobj = WIN32OLE_TYPE.new('Microsoft Excel 14.0 Object Library', 'Worksheet')
tobj.default_event_sources.map {|intf| intf.name} #=> ["DocEvents"]

WIN32OLE_EVENT.newでインターフェイス名を指定しない場合は、ここで返されたインターフェイスが選択されます。

次のサンプルは、IEのnaviaget2メソッドによってどのようなイベントが通知されるかを、実際にメソッド呼び出し(=イベント通知)をトレースして調べるプログラムです。イベントを受け付けるために、 WIN32OLE_EVENT.message_loopの呼び出しが必要な点に注意してください。ここでは最終イベントのStatusTextChangeイベントのメッセージについては既知としています。

# coding : cp932
require 'win32ole'

type = WIN32OLE_TYPE.new('Microsoft Internet Controls', 'InternetExplorer')
ctl = WIN32OLE.new(type.progid)
source = type.default_event_sources[0]
class WebEvent
  def initialize
    @completed = false
  end
  attr_reader :completed
end
source.ole_methods.each do |m|
  WebEvent.module_eval do
    define_method("on#{m.name}") do |*arg|
      if arg[0] == "ページが表示されました"
        @completed = true
      end
      puts "#{Time.now}: #{m.name} was called"
      p arg
    end
  end
end
evt = WIN32OLE_EVENT.new(ctl)
evt.handler = WebEvent.new
ctl.navigate2 'http://www.ruby-lang.org/'
loop do
  break if evt.handler.completed
  WIN32OLE_EVENT.message_loop
end
ctl.Quit

このプログラムを実行するとWindows7のIE8環境では以下のような出力を得られます。

2010-10-06 22:33:54 +0900: PropertyChange was called
["{265b75c1-4158-11d0-90f6-00c04fd497ea}"]
2010-10-06 22:33:54 +0900: BeforeNavigate2 was called
[#<WIN32OLE:0x9d08f0>, "http://www.ruby-lang.org/", 0, "", nil, "", false]
2010-10-06 22:33:54 +0900: DownloadBegin was called
[]
2010-10-06 22:33:54 +0900: PropertyChange was called
["{D0FCA420-D3F5-11CF-B211-00AA004AE837}"]
2010-10-06 22:33:54 +0900: CommandStateChange was called
[2, false]
2010-10-06 22:33:54 +0900: CommandStateChange was called
[1, false]
2010-10-06 22:33:54 +0900: StatusTextChange was called
["www.ruby-lang.org を検索しています"]
2010-10-06 22:33:54 +0900: ProgressChange was called
[100, 10000]
2010-10-06 22:33:54 +0900: StatusTextChange was called
["サイト 221.186.184.68 に接続しています"]
2010-10-06 22:33:54 +0900: StatusTextChange was called
["Web サイトが見つかりました。応答を待っています..."]
……
2010-10-06 22:33:54 +0900: TitleChange was called
["オブジェクト指向スクリプト言語 Ruby"]
2010-10-06 22:33:54 +0900: StatusTextChange was called
["待機中: http://www.ruby-lang.org/ja/ ..."]
2010-10-06 22:33:54 +0900: ProgressChange was called
[10000, 10000]
2010-10-06 22:33:54 +0900: ProgressChange was called
[-1, 10000]
2010-10-06 22:33:54 +0900: DownloadComplete was called
[]
2010-10-06 22:33:54 +0900: ProgressChange was called
[10000, 10000]
2010-10-06 22:33:54 +0900: DocumentComplete was called
[#<WIN32OLE:0x438a2f8>, "http://www.ruby-lang.org/ja/"]
2010-10-06 22:33:54 +0900: StatusTextChange was called
["ページが表示されました"]

[SEE_ALSO] WIN32OLE_TYPE.new, WIN32OLE_TYPE#progid, WIN32OLE_TYPE#ole_methods, WIN32OLE_METHOD#name, WIN32OLE_EVENT.new, WIN32OLE_EVENT#handler=, WIN32OLE_EVENT.message_loop