Rimon Barr schrieb:
> Hi Thomas,
>
> I noticed your new comtypes 0.4 release from Friday, which includes
> not only my patch, but a complete revamping of the safearray
> implementation. Thank you! I'm going to try it next week. With this
> new safearray support, I can likely get a particular COM piece of my
> system to work without requiring C++ or C#.
>
> In the meantime, I noticed something that I believe is a bug with how
> COM properties are mapped to object attributes... If you run the
> following code, it should display the problem:
>
> import comtypes, comtypes.client
> xl=comtypes.client.CreateObject('Excel.Application')
> xl.Visible=1 # (1)
> xl.Workbooks.Add()
> r=xl.Range['A1:B1']
> r.Value # (2)
> r.Value() # (3)
> r.Value=1 # (4)
> Basically, this is equivalent to code in the Excel test case:
>
> http://svn.python.org/projects/ctypes/trunk/comtypes/comtypes/test/test_excel.py
> Incidentally, the test case fails on my system. Perhaps it runs fine on yours.
>
This code worked for me when I had Office 97 installed, but it also fails
for me now that I have Office 2003.
> Line (1) displays how properties should work, and it does work for
> me. Assigning to Python object attribute, updates the corresponding
> COM property. Line (2) should read the contents of the range of
> cells. But, it doesn't. Instead, I get an instance of a
> bound_named_property. Line (3) works, by calling the getter. But, why
> is it mapped this way? I think it's inconsistent, and I prefer
> behaviour (1) to (3). Furthermore, the assignment in line (4) simply
> overwrites the attribute, and has no COM effect.
>
The reason that the code does not work with the newer office is the following:
In Office 97, 'Value' was a simply property of the Range object. With simple
I mean that the property did not take any arguments. (The LCID parameter is
special,
let us ignore it)
In Office 2003, 'Value' is a property that take an optional parameter named
'RangeValueDataType'.
Here is an excerpt from the generated typelib module:
COMMETHOD(['propget'], HRESULT, 'Value',
( ['in', 'optional'], VARIANT, 'RangeValueDataType' ),
( ['in', 'lcid'], c_int, 'lcid', _lcid ),
( ['retval', 'out'], POINTER(VARIANT), 'RHS' )),
The possible values for 'RangeValueDataType' are these:
# values for enumeration 'XlRangeValueDataType'
xlRangeValueDefault = 10
xlRangeValueXMLSpreadsheet = 11
xlRangeValueMSPersistXML = 12
So, in VB you can probably write something like
v = ...Range("A1:B1").Value
and VB will call the propget accessor with no arguments.
This code will probably have the same effect:
v = ...Range("A1:B1").Value(xlRangeValueDefault)
Using one of the other xlRange... constants will return
the contents as XML text (I tried this).
All this because in VB there is not really a difference between method calls
and property accesses AFAIU.
In Python/comtypes, things are different.
Long ago I decided that I wanted to access COM properties by using
indexing syntax in Python. So, to access a parameterless COM property,
one would write
v = ...Range["A1:B1"].Value
...Range["A1:B1"].Value = xyz
To access a COM property that requires parameters, one would write
v = ....Range["A1:B1"].Value[a, b, c]
The consequence, of course, is that there is no way to pass named
parameters to a property access (there is no Python syntax for that).
I guess we have to live with that.
To access a property with optional parameters, we have to use indexing
with NO parameters. Unfortunately, this is not valid Python syntax:
...Range["A1:B1"].Value[]
but this is (it will pass an empty tuple to the __getitem__ method):
...Range["A1:B1"].Value[()]
Indeed, the test_excel.py unittests work when we change the code accordingly.
The following code has the same effect, because apparently passing
'xlRangeValueDefault'
is the same as passing nothing:
...Range["A1:B1"].Value[xlRangeValueDefault]
If we can live with the above, fine. If not, ONE possibility that I see
would be that comtypes creates additional setter and getter functions for the
'Value' property, maybe called _setValue(...) and _getValue(...).
Thomas
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
comtypes-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/comtypes-users