Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Элементы ListBox'a Добавлено: 04.02.05 00:16  

Автор вопроса:  Koss
Если кто знает, подскажите, как можно обратиться к определенному элементу стандартного listbox'a, если элементов в списке больше 32###.

a = Listbox1.List(33000)

Выдаст ошибку Overflow.
(Тоже самое относится и к количеству элементов)

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 04.02.05 01:34
Работай через АПИ, попросту:

Windows 95/98/Me: The wParam parameter is limited to 16-bit values. This means list boxes cannot contain more than 32,767 items. Although the number of items is restricted, the total size in bytes of the items in a list box is limited only by available memory.



ЗЫ
А еще можешь ListView использовать ;)

Ответить

Номер ответа: 2
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #2
Добавлено: 04.02.05 02:10
А можно еще и самому отрисовывать, вообще здорово получится

Ответить

Номер ответа: 3
Автор ответа:
 VladeD



Вопросов: 8
Ответов: 40
 Профиль | | #3 Добавлено: 04.02.05 07:49
А ты посмотри сколько у тебя записей!
 a = List1.ListCound
Счет строк идет от 0 до N-1 числа
 если N => 33001
то ошибки не будет:
 Из твоего примера: a = Listbox1.List(33000), где номер строки Не должен превышать N-1, т.е. максимум всегдасоблюдается для
 a < List1.ListCound -1
Это значит , что при при:
 a = Listbox1.List(Mi)

If List1.ListCound > 0 Then
 If Mi < List1.ListCound Then a = Listbox1.List(Mi)
Emd if
  Ошибку не выдаст!

Ответить

Номер ответа: 4
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #4 Добавлено: 04.02.05 08:12
VladeD, попробуй вот это, будет интересно!

Private Sub Command1_Click()
    ;Dim i As Long
    List1.Clear
    For i = 0 To 32768
        List1.AddItem i
        Label1.Caption = List1.ListCount
        Label1.Refresh
    Next
End Sub

Private Sub Command2_Click()
    MsgBox List1.List(List1.ListCount - 1)
End Sub

Ответить

Номер ответа: 5
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #5 Добавлено: 04.02.05 08:36
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

Ответить

Номер ответа: 6
Автор ответа:
 VladeD



Вопросов: 8
Ответов: 40
 Профиль | | #6 Добавлено: 04.02.05 09:42
Mihalыch
Я получил огромное удовольствие и, поиграв с твоим кодом, вернул такой результат:
 1. List1 принимает цикл => 100000 (просто больше некогда играть)
 2. List1.Text соблюдается так же до >= 100000
  например, при клике по окну List1 - правильно получишь его значение (текст) в Label1.Caption
 3. Исправить отрицательное значение List1.ListCount при его значении > 32767 не получается.
 4. То же с List1.ListIndex <= -31073 при List1.Text = 100000
'--------------------------------
Option Explicit
Private Sub Command1_Click()
    ;Dim i As Long
    List1.Clear
    For i = 1 To 100000
     List1.AddItem i
      If i < 32768 Then
        Label1.Caption = List1.ListCount ' Предел положит значения <= 32767
      End If
      If List1.ListCount <= -2 Then
         Label1.Caption = i ' что бы соблюсти порядковое число = абсолютному значению - List1.ListCount
        ' наблюдай за Label1 на экране, когда достигнет число 65534 и до конца цикла оно мигает и только в конце цикла покажет = 100000
    End If
        Label1.Refresh
    Next
End Sub

Private Sub Command2_Click()
    MsgBox List1.List(List1.ListCount - 1)
End Sub

Private Sub List1_Click()
     Label1.Caption = List1.Text
End Sub
'''''''''''''''
C последующим примером - некогда: работа есть
Спасибо.

Ответить

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



Вопросов: 8
Ответов: 40
 Профиль | | #7 Добавлено: 07.02.05 15:38
 Mihalыch
А твой код на Win98 при цикле более 32768 не работает!!!???
Вот так номер!

Ответить

Страница: 1 |

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



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