Страница: 1 |
Страница: 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-сайт:
Профиль | | #1
Добавлено: 04.02.05 01:34
Работай через АПИ, попросту:
ЗЫ
А еще можешь ListView использовать
Номер ответа: 2
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #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()
 im 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()
 im 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()
 im hMem As Long
 im sLen As Long
 im sCount As Long
 im aByte() As Byte
 im 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()
 im 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 не работает!!!???
Вот так номер!