对(键、字符串)对的动态集进行排序VB6

对(键、字符串)对的动态集进行排序VB6,vb6,Vb6,谁能告诉我用VB6对键设置的动态(键、字符串)排序的最佳方法是什么。 我尝试过使用VBA.collections和2D数组。但他们似乎有一个大的解决办法来做这类事情。 我还尝试了本文中提到的mscomctlib.ListView 但添加此项时会出现一个错误,即“未设置对象或带块变量”。如果我能看完这些,我就可以按列对列表视图进行排序,并继续前进 请任何人告诉我一个克服这个问题的方法,或者如果你有其他方法,请告诉我 谢谢。尝试使用记录集对象进行如下排序 Option Explicit Priva

谁能告诉我用VB6对键设置的动态(键、字符串)排序的最佳方法是什么。 我尝试过使用VBA.collections和2D数组。但他们似乎有一个大的解决办法来做这类事情。 我还尝试了本文中提到的
mscomctlib.ListView

但添加此项时会出现一个错误,即“未设置对象或带块变量”。如果我能看完这些,我就可以按列对列表视图进行排序,并继续前进

请任何人告诉我一个克服这个问题的方法,或者如果你有其他方法,请告诉我


谢谢。

尝试使用记录集对象进行如下排序

Option Explicit

Private Function pvSortImpl(vData As Variant, _
            ByVal lKeyType As Long, _
            ByVal lKeySize As Long, _
            ByVal lValueType As Long, _
            ByVal lValueSize As Long) As Variant
    Const adFldIsNullable As Long = 32
    Dim rs              As Object
    Dim vElem           As Variant
    Dim vFields         As Variant
    Dim vRetVal         As Variant
    Dim lIdx            As Long
    Dim oFldKey         As Object
    Dim oFldValue       As Object

    Set rs = CreateObject("ADODB.Recordset")
    rs.Fields.Append "Key", lKeyType, lKeySize, adFldIsNullable
    rs.Fields.Append "Value", lValueType, lValueSize, adFldIsNullable
    rs.Open
    vFields = Array(0, 1)
    For Each vElem In vData
        rs.AddNew vFields, vElem
    Next
    If rs.RecordCount = 0 Then
        vRetVal = Array()
    Else
        rs.Sort = "Key"
        ReDim vRetVal(0 To rs.RecordCount - 1) As Variant
        Set oFldKey = rs.Fields("Key")
        Set oFldValue = rs.Fields("Value")
        rs.MoveFirst
        Do While Not rs.EOF
            vRetVal(lIdx) = Array(oFldKey.Value, oFldValue.Value)
            lIdx = lIdx + 1
            rs.MoveNext
        Loop
    End If
    pvSortImpl = vRetVal
End Function

Public Function SortNumeric(vData As Variant) As Variant
    Const adDouble      As Long = 5
    Const adVarWChar    As Long = 202

    SortNumeric = pvSortImpl(vData, adDouble, 0, adVarWChar, 1000)
End Function

Public Function SortStrings(vData As Variant) As Variant
    Const adVarWChar    As Long = 202

    SortStrings = pvSortImpl(vData, adVarWChar, 202, adVarWChar, 1000)
End Function

Private Sub Form_Load()
    Dim vResult         As Variant

    vResult = SortStrings(Array(Array("bbb", "test"), Array("aaa", Now)))
    Debug.Print Join(vResult(0), "=>")
    Debug.Print Join(vResult(1), "=>")
    vResult = SortNumeric(Array(Array("33", "test"), Array("2.2", Now), Array("22", "Proba")))
    Debug.Print Join(vResult(0), "=>")
    Debug.Print Join(vResult(1), "=>")
    Debug.Print Join(vResult(2), "=>")
End Sub
这在即时窗口中打印

aaa=>9/21/2018 11:50:19 AM
bbb=>test
2.2=>9/21/2018 11:50:19 AM
22=>Proba
33=>test

尝试使用记录集对象进行如下排序

Option Explicit

Private Function pvSortImpl(vData As Variant, _
            ByVal lKeyType As Long, _
            ByVal lKeySize As Long, _
            ByVal lValueType As Long, _
            ByVal lValueSize As Long) As Variant
    Const adFldIsNullable As Long = 32
    Dim rs              As Object
    Dim vElem           As Variant
    Dim vFields         As Variant
    Dim vRetVal         As Variant
    Dim lIdx            As Long
    Dim oFldKey         As Object
    Dim oFldValue       As Object

    Set rs = CreateObject("ADODB.Recordset")
    rs.Fields.Append "Key", lKeyType, lKeySize, adFldIsNullable
    rs.Fields.Append "Value", lValueType, lValueSize, adFldIsNullable
    rs.Open
    vFields = Array(0, 1)
    For Each vElem In vData
        rs.AddNew vFields, vElem
    Next
    If rs.RecordCount = 0 Then
        vRetVal = Array()
    Else
        rs.Sort = "Key"
        ReDim vRetVal(0 To rs.RecordCount - 1) As Variant
        Set oFldKey = rs.Fields("Key")
        Set oFldValue = rs.Fields("Value")
        rs.MoveFirst
        Do While Not rs.EOF
            vRetVal(lIdx) = Array(oFldKey.Value, oFldValue.Value)
            lIdx = lIdx + 1
            rs.MoveNext
        Loop
    End If
    pvSortImpl = vRetVal
End Function

Public Function SortNumeric(vData As Variant) As Variant
    Const adDouble      As Long = 5
    Const adVarWChar    As Long = 202

    SortNumeric = pvSortImpl(vData, adDouble, 0, adVarWChar, 1000)
End Function

Public Function SortStrings(vData As Variant) As Variant
    Const adVarWChar    As Long = 202

    SortStrings = pvSortImpl(vData, adVarWChar, 202, adVarWChar, 1000)
End Function

Private Sub Form_Load()
    Dim vResult         As Variant

    vResult = SortStrings(Array(Array("bbb", "test"), Array("aaa", Now)))
    Debug.Print Join(vResult(0), "=>")
    Debug.Print Join(vResult(1), "=>")
    vResult = SortNumeric(Array(Array("33", "test"), Array("2.2", Now), Array("22", "Proba")))
    Debug.Print Join(vResult(0), "=>")
    Debug.Print Join(vResult(1), "=>")
    Debug.Print Join(vResult(2), "=>")
End Sub
这在即时窗口中打印

aaa=>9/21/2018 11:50:19 AM
bbb=>test
2.2=>9/21/2018 11:50:19 AM
22=>Proba
33=>test

您是否使用了
Set
新建
lvSelectedStyles
?我尝试过,但设置lvSelectedStyles=New。。。vb在这里没有给出mscomctlib.ListView的建议。我被卡住了。似乎无法使用New创建ListView,所以我看到了几个选项:首先,可以将ListView放到隐藏窗体上。其次,您可以使用字典并编写一些自定义代码对其进行排序。这个网站和其他网站上都有一些例子。@BrianMStafford我在表单中创建了一个listview(不可见),使用listview.sort,我现在可以按照自己的意愿进行排序了。谢谢。可以创建一个VB(.NET)或C#类,它可以使用.NET framework集合执行此操作,并从VB6访问该类。但这可能不是最方便/直接的方法。您是否使用
Set
新建
lvSelectedStyles
?我尝试过,但设置lvSelectedStyles=New。。。vb在这里没有给出mscomctlib.ListView的建议。我被卡住了。似乎无法使用New创建ListView,所以我看到了几个选项:首先,可以将ListView放到隐藏窗体上。其次,您可以使用字典并编写一些自定义代码对其进行排序。这个网站和其他网站上都有一些例子。@BrianMStafford我在表单中创建了一个listview(不可见),使用listview.sort,我现在可以按照自己的意愿进行排序了。谢谢。可以创建一个VB(.NET)或C#类,它可以使用.NET framework集合执行此操作,并从VB6访问该类。但这可能不是最方便/直接的方法。