WIN32OLE#[] and WIN32OLE#[]= method in Ruby 1.9 (or later)

Discussion in 'Ruby' started by Masaki Suketa, Mar 25, 2006.

  1. Hello,

    I have a question about Win32OLE.
    I think that I'll change the behavior of WIN32OLE#[] and WIN32OLE#[]=
    in Ruby 1.9 or later.

    I have not commited the change yet.
    Before commiting it, I want suggestions or opinions from Win32OLE users.

    For example,
    excel = WIN32OLE.excel("Excel.Application")
    excel["Visible"] = true
    is NG.
    Instead, You must write
    excel = WIN32OLE.excel("Excel.Application")
    excel.Visible = true

    For more,
    installer = WIN32OLE.new("WindowsInstaller.Installer")
    record = installer.CreateRecord(2)
    record ["StringData", 1] = 'dddd'

    is NG. Instead,
    installer = WIN32OLE.new("WindowsInstaller.Installer")
    record = installer.CreateRecord(2)
    record.setproperty("StringData", 1, 'dddd')

    By using new featuer, You can write

    worksheet.cells[1,2] = 10

    in Excel.

    For more, you can write

    WIN32OLE.new("WScript.Shell")
    env = sh.Environment("User")
    p env["FOO"]
    env["FOO"] = "BARBAZ"

    For more, you can write

    ado = WIN32OLE.new("ADODB.Connection")
    ado_Open("...")
    rs = ado.Execute("SELECT * from TABLE01")
    while !rs.EOF
    puts rs.Fields.Item("id").value
    puts rs.Fields("id").value
    puts rs["id"].value # This is new feature!
    rs.MoveNext
    end

    and so on. Any comment, any question, welcome.

    Regards,
    Masaki Suketa
     
    Masaki Suketa, Mar 25, 2006
    #1
    1. Advertising

  2. Masaki Suketa

    Dave Burt Guest

    Hi!

    Masaki Suketa wrote:
    > I have a question about Win32OLE.
    > I think that I'll change the behavior of WIN32OLE#[] and WIN32OLE#[]=
    > in Ruby 1.9 or later.
    >
    > I have not commited the change yet.
    > Before commiting it, I want suggestions or opinions from Win32OLE users.


    No longer allowed:
    > excel["Visible"] = true
    > record ["StringData", 1] = 'dddd'


    New:
    > worksheet.cells[1,2] = 10
    > env["FOO"] = "BARBAZ"
    > puts rs["id"].value # This is new feature!


    Excellent! This makes a lot more sense than the existing function of [] and
    []=.

    When I first used WIN32OLE, I was surprised that you couldn't use [] to
    access index operations.

    I haven't used obj[prop, n] before, that I can recall. I think neither that
    nor setproperty() are the ideal Ruby syntax for this operation, but [] seems
    better. How about this:

    > record ["StringData", 1] = 'dddd'
    > record.setproperty("StringData", 1, 'dddd')


    record[:StringData][1] = 'dddd'

    Possible implementation:
    class WIN32OLE
    class Property
    attr_reader :eek:bject, :name
    def initialize(obj, name)
    unless obj.kind_of?(WIN32OLE)
    raise TypeError.new("cannot convert #{obj.inspect} to
    WIN32OLE")
    end
    self.object = obj
    self.name = name.to_s
    end
    def [](*args)
    object.getproperty(name, *args)
    end
    def []=(*args)
    object.setproperty(name, *args)
    end
    end
    def [](*args)
    if args.size == 1 && args[0].kind_of?(Symbol)
    return Property.new(self, *args)
    end
    # everything else
    end
    end

    (I realize there's 'win32ole/property' already, but I don't know exactly
    what its purpose is.)

    Thanks a lot for WIN32OLE, Masaki Suketa!

    Cheers,
    Dave
     
    Dave Burt, Mar 25, 2006
    #2
    1. Advertising

  3. Masaki Suketa

    rtilley Guest

    Masaki Suketa wrote:
    > and so on. Any comment, any question, welcome.
    >
    > Regards,
    > Masaki Suketa


    I have been using WIN32OLE like this:

    def test_get_serial
    bios = WIN32OLE.connect("winmgmts:\\\\.")
    bios.InstancesOf("win32_bios").each do |item|
    return item.serialnumber
    end
    end

    Thank you.
    Brad
     
    rtilley, Mar 26, 2006
    #3
  4. Hello,

    In message "Re: WIN32OLE#[] and WIN32OLE#[]= method in Ruby 1.9 (or later)"
    on 06/03/25, "Dave Burt" <> writes:

    > I haven't used obj[prop, n] before, that I can recall. I think neither that
    > nor setproperty() are the ideal Ruby syntax for this operation, but [] seems
    > better. How about this:
    >
    > > record ["StringData", 1] = 'dddd'
    > > record.setproperty("StringData", 1, 'dddd')

    >
    > record[:StringData][1] = 'dddd'


    Thank you. It is very interesting.
    I think about it.

    > (I realize there's 'win32ole/property' already, but I don't know exactly
    > what its purpose is.)


    It is helper class of early binding of WIN32OLE.
    For example,
    ext/win32ole/sample/olegen.rb uses it.
    And,
    ruby olegen.rb 'Microsoft ActiveX Data Object N.N Library'
    creates some property which uses OLEProperty.

    Yes, it is not so convenient.

    Regards,
    Masaki Suketa
     
    Masaki Suketa, Mar 27, 2006
    #4
  5. Masaki Suketa

    Dave Burt Guest

    Hi again,

    Masaki Suketa wrote:
    > In message "Re: WIN32OLE#[] and WIN32OLE#[]= method in Ruby 1.9 (or
    > later)"
    > on 06/03/25, "Dave Burt" <> writes:
    >
    >> > record.setproperty("StringData", 1, 'dddd')

    >>
    >> record[:StringData][1] = 'dddd'

    >
    > Thank you. It is very interesting.
    > I think about it.


    It's not ideal, but WIN32OLE doesn't use Symbols - VBScript and JScript
    don't have them.
    We're trying to match this VBScript, right?

    record.StringData(1) = "dddd"

    As far as I understand, we can't make record.StringData(1) = "dddd" or
    record.StringData[1] = "dddd" work while keeping the same dynamic call
    functionality we already have (StringData should be called as a method in
    both cases) but what about another option:

    record.StringData{1} = "dddd"

    The rule would be similar to the above, but instead of looking for a symbol,
    you're looking for block_given? and using "yield" as the index/parameter to
    the property.
    Although, in a sense, this matches semantic-for-semantic less than the
    [:StringData] version, and that's what I like best about the change you're
    suggesting - use Ruby's index operators for the same purpose in OLE.

    Thanks again for your efforts on this project,
    Dave
     
    Dave Burt, Mar 27, 2006
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. eGenix Team: M.-A. Lemburg

    ANN: eGenix mxODBC and mxODBC Zope DA on AIX 5.3 (and later)

    eGenix Team: M.-A. Lemburg, Nov 19, 2007, in forum: Python
    Replies:
    0
    Views:
    312
    eGenix Team: M.-A. Lemburg
    Nov 19, 2007
  2. Trans
    Replies:
    5
    Views:
    105
    Trans
    Aug 9, 2005
  3. zxem
    Replies:
    1
    Views:
    238
  4. Snoop1990 Snoop1990

    ruby gem 1.2.3 or later for debian

    Snoop1990 Snoop1990, Dec 28, 2007, in forum: Ruby
    Replies:
    2
    Views:
    98
    Frederick Cheung
    Dec 28, 2007
  5. James Adam
    Replies:
    2
    Views:
    105
    Shadowfirebird
    Aug 1, 2008
Loading...

Share This Page