ㄚ嘉 發問時間: 電腦與網際網路程式設計 · 1 0 年前

VB6 List 讀取程式修改

位大大好!

我有一段程式是讀取list1.list的資料,並取代字母

但資料卻沒有完整的讀取完畢,讀到一半就結束了,請大大們指點

Private Sub Command4_Click()

Dim f As Long, s As String, i As Single, j As Single

List2.Clear List2.Visible = False: DoEvents

n = List1.ListCount ' 取得 List1 中的筆數' 取得 List1 中的筆數

If n > 32767 Then

ProgressBar1.Max = 32767: n = 32767 / n

Else

ProgressBar1.Max = n: n = 1

End If

ProgressBar1 = 0

For i = 0 To List1.ListCount - 1

s = List1.List(i)

s = Replace(s, "X", "")

s = Replace(s, "Y", ",")

s = Replace(s, "Z", ",") j = j + 1 * n

ProgressBar1 = j

List2.AddItem s

' List2.AddItem List1.List(i) 直接list2存檔

Next

List2.Visible = True

End Sub

已更新項目:

Kask!大大你好!

我試過你的方法,還是一樣讀取一半就沒有了,所以沒改善~~謝謝你的回答了!

2 個已更新項目:

Hello你好嗎 大大您好!

我有修改過你的方式,但還是沒有改善,謝謝你的意見囉!

3 個已更新項目:

Hello你好嗎 大大您好!

去掉ProgressBar這我考慮過,也有試過去掉ProgressBar在run一次

結果還是一樣,真是搞不懂我那邊錯了!

3 個解答

評分
  • 1 0 年前
    最佳解答

    我猜您的 List1 筆數應該是超過 65536 筆吧?若是的話再繼續往下看。

    由於 VB6 中的許多控制項如 ListBox, ScrollBar, ProgressBar, ... 等,

    最大值只支援到 32767 (也就是 Integer 型態),超過此值會有問題。

    以 List1 為例,假設裡面「硬塞」了八萬 (80000 = &H13880) 筆資料。

    但是 List1.ListCount 只能存放 16-bit 的資料,因此 &H3880 = 14464

    您的原程式會得到 14464 筆資料,且不會出現什麼錯誤訊息,

    只是眼尖的您發現到它「好像沒做完」。事實上,這只是一個巧合的錯誤罷了。

    因為,如果今天 List1 為四萬筆資料的話,那 List1.ListCount 將是一個負數,

    這時候您就會發現一卡車的錯誤了!

    所以,治本的辦法是:重新設計,讓 ListBox 中不要超過 32767 筆資料。

    治標的辦法 (雖然不太建議如此做):呼叫 API 來取代使用控制項的屬性。

    (比較麻煩,且僅適用於 Win 2000 以上)

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

    Private Declare Function SendMessageByString 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_GETTEXT = &H189&

    Private Const LB_GETCOUNT = &H18B&

    Private Sub Command4_Click()

    Dim nCount As Long

    Dim i As Long

    Dim f As Double, j As Double

    Dim s As String

    Dim strItem As String * 256

    List2.Clear

    List2.Visible = False: DoEvents

    'n = List1.ListCount ' 超過 32767 時會有問題!

    nCount = SendMessage(List1.hwnd, LB_GETCOUNT, 0, 0)

    If (nCount > 32767) Then

    ProgressBar1.Max = 32767: f = 32767 / nCount

    Else

    ProgressBar1.Max = nCount: f = 1

    End If

    j = 0

    For i = 0 To (nCount - 1)

    's = List1.List(i) ' 超過 32767 時會有問題!

    Call SendMessageByString(List1.hwnd, LB_GETTEXT, i, strItem)

    s = Trim0(strItem)

    s = Replace(s, "X", "")

    s = Replace(s, "Y", ",")

    s = Replace(s, "Z", ",")

    j = j + f

    ProgressBar1.Value = j

    List2.AddItem s

    Next

    List2.Visible = True

    End Sub

    Private Function Trim0(ByVal szCString As String) As String

    Dim n As Long, i As Long

    n = InStr(1, szCString, vbNullChar)

    Trim0 = Left(szCString, n - 1)

    End Function

  • 1 0 年前

    Next 改成 Next i 看看

    2010-12-23 18:05:50 補充:

    要不要先去掉 ProgressBar 做做看

  • 1 0 年前

    Dim f As Long, s As String, i As Single, j As Single

    你控制迴圈的變數 i 設定成了單精度浮點數,改成integer 或是 Long試試看吧..

還有問題?馬上發問,尋求解答。