编写了一段在listbox中拖拽显示文件名的程序,如下:
Private Sub List1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    List1.Clear
    If Data.GetFormat(vbCFFiles) Then
        Dim objFile         
        For Each objFile In Data.Files     'datafiles类型为DataObjectFiles
            List1.AddItem objFile.Count
        Next objFile
    End If
End Sub
该段程序可以正常运行并实现功能,在程序中(红色部分),objFile被定义为了variant类型。
根据vb的定义,data.files是一个集合,它的类型为DataObjectFiles,但是如果把红色部分的定义改为:Dim objFile as DataObjectFiles,程序就会运行错误,而且即使改为Dim objFile as New DataObjectFiles也不行。自己查了下,很多程序在用For each next应用对象时都是定义为variant类型,请问如果我要指明类型改如何编写呢?

解决方案 »

  1.   

    data.files是一个集合,它的类型为DataObjectFiles
    for each枚举的data.files的成员并不是DataObjectFiles类型。所以不能用DataObjectFiles类型。
    --------------------------
    MSDN:For Each element In group
    [statements]
    [Exit For]
    [statements]
    element 必要参数。用来遍历集合或数组中所有元素的变量。对于集合来说,element 可能是一个 Variant 变量、一个通用对象变量或任何特殊对象变量。对于数组而言,element只能是一个 Variant 变量。 
    -----------------------------
    也就是说:element只能是variant变量或对象变量。
      

  2.   

    我试过,声明为object类型也不行。只能是variant类型。
      

  3.   

    1、Data.Files集合的一个成员只是一个字符串,并不一个对象,所以object当然不行。
    2、因为element(看1楼)只能是variant变量或对象变量,这里不能是对象变量,所以只能用variant变量。
      

  4.   

    简单实现一下,由于VB6不完全支持重载,所以要添加一个[_NewEnum]接口到DataObjectFiles很麻烦。下面是简单实现,如果还是需要自己创建一个集合类的话,参考一下代码。
    Option ExplicitDim col As New CollectionPrivate Sub List1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
      List1.Clear
      If Data.GetFormat(vbCFFiles) Then
        Dim i As Long
        For i = 1 To Data.Files.Count
          col.Add Data.Files(i)
        Next
        
        Dim a As Variant
        For Each a In col 'datafiles类型为DataObjectFiles
          List1.AddItem col.Count
        Next
      End If
    End Sub
    Option Explicit'局部变量,保存集合
    Private mCol As CollectionPublic Function Add(Balance As Currency, AccountNumber As Integer, FullName As String, colAcc As colAcc, Optional sKey As String) As CAccount
        '创建新对象
        Dim objNewMember As CAccount
        Set objNewMember = New CAccount
        '设置传入方法的属性
        objNewMember.Balance = Balance
        objNewMember.AccountNumber = AccountNumber
        objNewMember.FullName = FullName
        Set objNewMember.colAcc = colAcc
        If Len(sKey) = 0 Then
            mCol.Add objNewMember
        Else
            mCol.Add objNewMember, sKey
        End If
        '返回已创建的对象
        Set Add = objNewMember
        Set objNewMember = Nothing
    End FunctionPublic Property Get Item(vntIndexKey As Variant) As CAccount
        '引用集合中的一个元素时使用。
        'vntIndexKey 包含集合的索引或关键字,
        '这是为什么要声明为 Variant 的原因
        '语法:Set foo = x.Item(xyz) or Set foo = x.Item(5)
      Set Item = mCol(vntIndexKey)
    End PropertyPublic Property Get Count() As Long
        '检索集合中的元素数时使用。语法:Debug.Print x.Count
        Count = mCol.Count
    End Property
    Public Sub Remove(vntIndexKey As Variant)
        '删除集合中的元素时使用。
        'vntIndexKey 包含索引或关键字,这是为什么要声明为 Variant 的原因
        '语法:x.Remove(xyz)
        mCol.Remove vntIndexKey
    End Sub
    Public Property Get NewEnum() As IUnknown
        '本属性允许用 For...Each 语法枚举该集合。
        Set NewEnum = mCol.[_NewEnum]
    End Property
    Private Sub Class_Initialize()
        '创建类后创建集合
        Set mCol = New Collection
    End Sub
    Private Sub Class_Terminate()
        '类终止后破坏集合
        Set mCol = Nothing
    End Sub