Сортировать динамический набор (ключ, строка) пар VB6 - PullRequest
0 голосов
/ 20 сентября 2018

Может ли кто-нибудь сказать мне, каков наилучший способ сортировки динамического (ключ, строка), установленного ключом, используя VB6.Я пытался использовать VBA.collections и 2D-массивы.Но у них, кажется, есть большой обходной путь, чтобы сделать подобное.Я также пытался использовать MSComctlLib.ListView, как указано в этом вопросе stackoverflow.

Dim lvSelectedStyles As MSComctlLib.ListView
Dim listItem As MSComctlLib.listItem
'Some code here
lvSelectedStyles.ListItems.Add Key:=CStr(lngCount) Text:=objParagraph.Key

Но при добавлении этого элемента выдается сообщение об ошибке «Объект или переменная блока не установлена».Если я могу пройти через это, я могу отсортировать представление списка по столбцу и двигаться вперед.

Может кто-нибудь, пожалуйста, дайте мне знать способ преодоления этого, или если у вас есть какой-либо другой способ сделать это, пожалуйста, дайте мнезнать.

Спасибо.

1 Ответ

0 голосов
/ 21 сентября 2018

Попробуйте использовать объект Recordset, чтобы выполнить сортировку следующим образом

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...