Over at Stack Overflow, a member asked a couple questions regarding working with WIN32OLE objects.
Q1: How do I determine the class name of an OLE object instance?
The code:
object.ole_obj_help.name
The explanation:
Calling the ole_obj_help method on a WIN32OLE object returns a WIN32OLE_TYPE object. The WIN32OLE_TYPE object includes a name attribute. Calling this on an Excel application object...
xl = WIN32OLE.new( 'Excel.Application' )
xl.ole_obj_help.name
...returns the string '_Application', while calling it on a Worksheet object...
xl.ActiveSheet.ole_obj_help.name
...returns the string '_Worksheet'.
Q2: How can I tell whether an object instance supports a particular method?
The code:
object.ole_methods.collect!{ |x| x.to_s }.include?( 'MethodName' )
The explanation:
As mentioned previously here, calling the ole_methods method on a WIN32OLE object returns an array of WIN32OLE objects that represent methods that can be called on that object. You can convert each object in the array to a string, using the collect! method. Then it's a simple matter to call the include? method to see if the resulting array of strings contains a certain value.
And so we can use this to find that the Excel application object includes a Quit method...
xl.ole_methods.collect!{ |x| x.to_s }.include?( 'Quit' )
=> true
...but does not include a Close method:
xl.ole_methods.collect!{ |x| x.to_s }.include?( 'Close' )
=> false
There you have it. Thanks for stopping by!
2 comments:
Just wanted to say that I love your blog. I am using ruby primarily on Linux, but I also have a Win XP computer here.
Every now and then I pass by and have a look what's new - very nice. :)
ole_methods.collect!{ |x| x.to_s }
can be replaced with
ole_methods.collect(&:to_s)
ie no need for the bang, and use the symbol#to_proc (unless you're on Ruby 1.8.6)
Post a Comment