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!大大你好!
我試過你的方法,還是一樣讀取一半就沒有了,所以沒改善~~謝謝你的回答了!
Hello你好嗎 大大您好!
我有修改過你的方式,但還是沒有改善,謝謝你的意見囉!
Hello你好嗎 大大您好!
去掉ProgressBar這我考慮過,也有試過去掉ProgressBar在run一次
結果還是一樣,真是搞不懂我那邊錯了!
3 個解答
- 退隱江湖Lv 51 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 年前
Dim f As Long, s As String, i As Single, j As Single
你控制迴圈的變數 i 設定成了單精度浮點數,改成integer 或是 Long試試看吧..