Carsten Haese wrote: > On Tue, 2007-04-17 at 16:54 -0500, Larry Bates wrote: >> Does anyone know if there is a way to make a Python COM object >> act like a proper iterator in VB/Delphi? > > I don't use COM, VB, or Delphi, but Google turned up these two > references: > http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcn7/html/vaconUsingForEach.asp > http://17slon.com/blogs/gabr/2007/03/fun-with-enumerators-part-1.html > > Judging from those links, an object is iterable in VB and Delphi (or as > they call it, it is enumerable) if it exposes a GetEnumerator method > that returns an enumerator. The enumerator in turn needs to expose a > MoveNext method and a Current property. > > Assuming that the Enumerable and the Enumerator are allowed to be the > same object, you'll probably need code that looks something like this: > > class foo: > _public_methods_=['GetEnumerator','MoveNext'] > # You'll need to figure out how to expose "self.Current" > > def __init__(self): > self.numbers=[1,2,3,4,5,6,7,8] > self.Current = None > > def MoveNext(self): > try: > self.Current = self.numbers.pop(0) > return True > except IndexError: > return False > > def GetEnumerator(self): > return self > > Good luck, > > Carsten. > >
I looked over the links and what you have proposed seems to make sense, but I can't make it work. I have the following class defined and registered. class foo: _public_methods_=['GetEnumerator','MoveNext'] _public_attrs_=['Current'] _reg_clsid_='{FC2A0E7B-E428-4414-B1C4-60373BB12102}' _reg_progid_="Syscon.foo" def __init__(self): self.numbers=[1,2,3,4,5,6,7,8] self.Current = None def MoveNext(self): try: self.Current = self.numbers.pop(0) rtnval=True except IndexError: self.Current=None rtnval=False def GetEnumerator(self): return self Then I do: >>> import win32com.client >>> typelib='Syscon.foo' >>> F=win32com.client.Dispatch(typelib) >>> for x in F: ... print x ... Traceback (most recent call last): File "<interactive input>", line 1, in <module> File "C:\Python25\lib\site-packages\win32com\client\dynamic.py", line 228, in __getitem__ raise TypeError, "This object does not support enumeration" TypeError: This object does not support enumeration >>> but this works fine: >>> F.MoveNext() >>> F.Current 1 >>> F.MoveNext() >>> F.Current 2 >>> I'm stumped. -Larry -- http://mail.python.org/mailman/listinfo/python-list