在VB中如 ADO Library 的 Recordset 对象
rst.Field(下标).某方法
               .某方法()我希望在自己编写的组建中也能实现这种功能如
Print myComponent.Item(0).name

      myComponent.Item(1).doSth()试了很久都搞不出来。Google上也没有现成的资料。因此到此求助,希望大家能给点儿例子

解决方案 »

  1.   

    这个很简单吧,一个CItems类,一个CItem类,都有一个支持IDispatch接口(IItems\IItem),IItems的接口有一个方法这样定义就可以IItem Item(int nIndex)就可以了,然后IItem有一个方法name,就能实现你所说的了。ADO也是使用了IDispatch接口
      

  2.   

    小鱼子啊,谢谢你的提示,虽然出入比较大,但我照样给分
    下面是我的总结,愿与大家分享:一.首先插入ATL对象 Items, 将创建类 CItems 和一个继承自Dispatch的接口IItems
    (复习:该ATL 对象的 ProgId 为 工程名.类名,注意类名前的”C”去掉,如:”工程1.Items”)
    二.插入另一个ATL 对象 Item,将创建类 CItem 和一个继承自Dispatch的接口IItem
    给IItem接口添加任意类型的方法(doSth)或属性(name)
    三.给接口 IItems 添加属性Item,为了让这个Item属性能够拥有IItem接口的所有属性和方法,只要让这个Item属性返回的类型为IItem接口的指针即可。
     
    四.在该Item属性的Get方法中写代码:
    STDMETHODIMP CItems::get_Item(IItem **pVal)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here
        HRESULT hr = CoInitialize(NULL);
        CLSID clsid;
    hr = CLSIDFromProgID(OLESTR("Item对象的ProgID"),&clsid);
    hr = CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,_uuidof(IItem),(LPVOID*)pVal); ::CoUninitialize(); // 不要忘了必须在CoUninitialize之前才能给pVal赋值哦
    return S_OK;
    }五.编译,若出现错误
     
    原因可能是IItems接口的Item属性的Get方法的返回类型为IItem,但在IDL文件中IItem接口在IItems接口定义之后,所以要修改IDL文件,在IItems接口定义之前先对IItem接口作个申明.
     
    六.编译成功后就可以在VB中通过对象的Items属性返回并访问Item(接口)的属性或方法了
    Dim obj as new Items
    Obj.Item.name
    Obj.Item.doSth()