【问题标题】:VB6 list loop not working when list is very long列表很长时VB6列表循环不起作用
【发布时间】:2016-11-01 16:57:36
【问题描述】:

如何使 VB6 列表计数适用于超过 32767 个项目的列表?

for k = 0 to List2.ListCount  - 1
''do stuff
next

上面的代码运行良好,直到我的列表中有太多项目,然后列表计数全部搞砸并变为负数。

我该如何解决这个问题?我可以将 ListCount 设为长数据类型吗?

【问题讨论】:

  • 刚刚发现 List2.ListCount - 1 正在返回 (-21867 ) WTF?
  • 该死,因为 List2.ListCount - 1 是整数数据类型。我怎样才能使它成为一个长数据类型?啊
  • 列表中有超过 32000 个项目有什么意义?
  • 我新来的人会这么问。它是应用程序的一部分,无法帮助。用户可以选择在列表中转储那么多东西。有一个选择“全部”作为列表中的第一个索引。请..我只需要它工作。有一些我无法在这里解释的原因。
  • 如何添加第二个列表框 - 并链接“全选”复选框,以便检查两者中的所有项目,将处理循环更改为通过两个列表框?

标签: list types vb6 integer long-integer


【解决方案1】:

虽然 VB6 属性仅签名 Integer,但底层控件使用 32 位整数,因此您可以使用 Windows API 来操作您的列表:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SendMessageString Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Const LB_GETCOUNT = &H18B
Private Const LB_GETTEXT = &H189
Private Sub Command1_Click()
    Dim ix As Long
    For ix = 0 To 40000
        List1.AddItem "X" + Format(ix)
    Next
End Sub

Private Sub Command2_Click()
    Dim rc As Long
    Dim wp As Long
    Dim lp As Long
    Dim s As String * 1000
    ' Get count of items into rc
    rc = SendMessage(List1.hwnd, LB_GETCOUNT, 0, 0)
    ' Get the 39001th item
    rc = SendMessageString(List1.hwnd, LB_GETTEXT, 39000, s)
    MsgBox s
End Sub

话虽如此,切换到 ListView 可能仍然是个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2020-07-19
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多