Страница: 1 | 2 |
Вопрос: Переполнение ListBox - Overflow
Добавлено: 25.08.05 22:53
Автор вопроса: Obfuscate
При количестве item в ListBox болшем 32767 List.ListCount принимает отрицательное значение, и начинает увеличиваться к нулю, а при вызове Str= List.List(N) где N - число болше 32767 возникает Overflow.
Можно ли вообще с этим как-нибудь бороться?
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #1
Добавлено: 25.08.05 23:06
сувать меньше Item'ов наверное...
а случайно нету RichListBox'a?
Номер ответа: 2
Автор ответа:
Obfuscate
Вопросов: 3
Ответов: 10
Профиль | | #2
Добавлено: 25.08.05 23:27
Сувать меньше не получится. Да и прога у меня уже давно работает, я только сейчас баг заметил.
А как этот контрол называется с RichListBox-ом, или имя .ocx файла? RichTextBox есть, а RichListBox не нахожу. (у мня VB6)
Номер ответа: 3
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #3
Добавлено: 25.08.05 23:44
Я тоже не нахожу, а хотел бы ))))))))))))))))))))))
Номер ответа: 4
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #4
Добавлено: 25.08.05 23:47
хотяа в чём суть программы? может реально сделать листбокс без прокрутки, а рядом с ним отдельную прокрутку и исходя из её положения, грузить нужный диапазон пунктов листбокса? это будет очень бытро работать
Номер ответа: 5
Автор ответа:
Obfuscate
Вопросов: 3
Ответов: 10
Профиль | | #5
Добавлено: 26.08.05 00:05
Суть в том, что в этот лист добавляютя имена всех файлов папки или диска, Style - checkbox. А потом выбранными файлами нужно манипулировать. Теперь придётся всё переделывать.
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 26.08.05 00:26
Воспользуйся ListView... Или его аналогом ApiListView (см. примеры)
если итемов много, можно вовсе использовать виртуальный ListView (я пробовал на 10 000 записях - все мгновенно)
Номер ответа: 7
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #7
Добавлено: 26.08.05 03:11
А в принципе то можно список в любом случае хранить в массиве и карту чеков тоже в отдельном. Но попаришься-ох попаришься ) особенно если будут активны клавиши Shift/Ctrl
Номер ответа: 8
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #8
Добавлено: 26.08.05 06:10
Может в эту сторону копать нужно…
Option Explicit
Private Const LB_GETTEXTLEN As Long = &H18A
Private Const LB_GETCOUNT As Long = &H18B
Private Const LB_GETTEXT As Long = &H189
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Sub Command1_Click()
Dim i As Long
List1.Clear
For i = 0 To 33000
List1.AddItem "Элемент - " & i
Label1.Caption = List1.ListCount
Label1.Refresh
Next
End Sub
Private Sub Command2_Click()
Dim hMem As Long
Dim sLen As Long
Dim sCount As Long
Dim aByte() As Byte
Dim sBuffer As String
sCount = SendMessage(List1.hwnd, LB_GETCOUNT, 0, 0)
sLen = SendMessage(List1.hwnd, LB_GETTEXTLEN, sCount - 1, 0)
ReDim aByte(0 To sLen)
hMem = VarPtr(aByte(0))
sBuffer = Space(sLen)
Call SendMessage(List1.hwnd, LB_GETTEXT, ByVal sCount - 1, ByVal hMem)
CopyMemory ByVal sBuffer, ByVal hMem, UBound(aByte)
MsgBox sBuffer
End Sub
Номер ответа: 9
Автор ответа:
Obfuscate
Вопросов: 3
Ответов: 10
Профиль | | #9
Добавлено: 26.08.05 12:54
Mihalыch, да как раз в точку!
Не подскажешь как сделать List1.RemoveItem 33000 таким же способом?
Номер ответа: 10
Автор ответа:
Obfuscate
Вопросов: 3
Ответов: 10
Профиль | | #10
Добавлено: 26.08.05 13:08
Только вот сначала ещё нужно проверить
Номер ответа: 11
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #11
Добавлено: 26.08.05 14:45
Попробуй LB_DELETSTRING
Номер ответа: 12
Автор ответа:
Obfuscate
Вопросов: 3
Ответов: 10
Профиль | | #12
Добавлено: 26.08.05 18:33
В MSDN такого не нашёл
Номер ответа: 13
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #13
Добавлено: 26.08.05 18:39
Номер ответа: 14
Автор ответа:
Obfuscate
Вопросов: 3
Ответов: 10
Профиль | | #14
Добавлено: 26.08.05 19:12
Так дело то в том, что LB_DELETESTRING нужно присвоить какое-то значение (как Private Const LB_GETTEXT As Long = &H189), а какое?
Номер ответа: 15
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #15
Добавлено: 26.08.05 19:21