Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: xury.zx6.ru
 Профиль | | #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-сайт: xury.zx6.ru
 Профиль | | #3
Добавлено: 25.08.05 23:44
Я тоже не нахожу, а хотел бы :)))))))))))))))))))))))

Ответить

Номер ответа: 4
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #6
Добавлено: 26.08.05 00:26
Воспользуйся ListView... Или его аналогом ApiListView (см. примеры)

если итемов много, можно вовсе использовать виртуальный ListView (я пробовал на 10 000 записях - все мгновенно)

Ответить

Номер ответа: 7
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #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
Только вот сначала ещё нужно проверить
If List1.Selected(33000) then ...

Ответить

Номер ответа: 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
    Call SendMessage(List1.hwnd, LB_DELETESTRING, 'Индекс удаляемой записи, 0)

Ответить

Номер ответа: 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
 

    Private Const LB_DELETESTRING As Long = &H182

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам