Вопрос: HScroll в ListBox | Добавлено: 09.03.05 23:05 |
Автор вопроса: ![]() |
Есть процедура установки горизонтальной полосы прокрутки у стандартного ЛистБокса: Private Sub ListBoxHScroll(ByVal hListBox As Long)
Dim lngCurrent As Integer Dim lngMax As Integer Dim lngIndex As Long Dim lngCount As Long Dim lngMaxIndex As Long Dim strListMaxText As String lngCount = SendMessage(hListBox, LB_GETCOUNT, 0, 0) If lngCount = 0 Then ShowScrollBar hListBox, SB_HORZ, False Else ShowScrollBar hListBox, SB_HORZ, True For lngIndex = 1 To lngCount lngCurrent = SendMessage(hListBox, LB_GETTEXTLEN, 0, lngIndex) If lngCurrent > lngMax Then lngMax = lngCurrent lngMaxIndex = lngIndex End If Next strListMaxText = String$(SendMessage(hListBox, LB_GETTEXTLEN, 0, lngMaxIndex), vbNullChar) SendMessage hListBox, LB_GETTEXT, lngMaxIndex, ByVal strListMaxText lngMax = frmMain.TextWidth(strListMaxText) SendMessage hListBox, LB_SETHORIZONTALEXTENT, lngMax \ Screen.TwipsPerPixelX, 0 End If End Sub Скрол-то он ставит, но в ряде случаев текст выходит за пределы прокрутки, т. е. даже прокруткой не получается добраться до конца строки. Что же в этом коде подправить чтобы решить эту проблему? Вариант с добавлением константы к lngMax не подходит. Желательно этого достичь без такого варварского способа. Заранее спасибо давшим дельный ответ :) |
Ответы | Всего ответов: 54 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 10.03.05 00:22 |
Чем тебе не нравится вариант с константой? |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 10.03.05 03:19 |
Другой способ не скажу - влом искать (если он конечно вообще существует), а вот максимальную ширину можно вычислить с помощью GetTextExtentPoint32. |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ICQ: 295002202 Вопросов: 87 Ответов: 1684 |
Профиль | Цитата | #3 | Добавлено: 10.03.05 18:17 |
Sharp, константа не подходит, т. к. текст может иметь разную длину. Если
есть вариант - выстави его здесь, только я хочу чтобы скролл появлялся в точь под длину максимальной строки. CyRax, не хочется подключать gdi32.dll - в моем проекте я уМУДряюсь пока обходиться без нее В ЛистБоксе хранятся имена файлов (полные). Адреса можно динамически добавлять/удалять. Я хочу чтобы можн было просмотреть имя файла от начала до конца, а если имя слишком длинное - появился HScroll (принадлежащий ЛБ) |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 10.03.05 19:17 |
CyRax, не хочется подключать gdi32.dll Не хочется - не подключай. Поищи тогда что то типа TextWidth(List1.List(Index)) |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 459 |
Профиль | Цитата | #5 | Добавлено: 12.03.05 00:47 |
Вместо GetTextExtentPoint32 я обычно использую скрытый контрол Label с AutoSize = True ![]() |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #6 | Добавлено: 12.03.05 05:36 |
А что тебя пугает gdi32.dll? Её ведь не надо таскать с собой, в любой винде она есть.
А TextWidth или Label.Autosize в любом случае полезут в эту самую gdi32.dll либо в user32.dll. Оба этих метода либо GetTextExtentPoint32 либо DrawText вызывают. Если с Label'ом, то надо его шрифт установить такой же, как в листбоксе |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 12.03.05 11:38 |
А TextWidth или Label.Autosize в любом случае полезут в эту самую gdi32.dll либо в user32.dll. Во во, надо почаще открывать глаза VB-шникам, а то у них виртуальная машина - нечто вроде внеземной технологий и земному разуму её не понять ![]() |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ICQ: 295002202 Вопросов: 87 Ответов: 1684 |
Профиль | Цитата | #8 | Добавлено: 13.03.05 00:11 |
CyRax, я не обоими ногами VB'шник ![]() Я уже пытаюсь "напряженные" процедуры на асме или Power Basic писать. (Хотя ПБ столько ненужных функций в ЕХЕ подключает ![]() Подкиньте примерчик, если у кого есть. Неужели Offline-клиент не использует подобной конструкции? |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 13.03.05 13:32 |
Клиент не нуждается в подобной конструкции-лишь по одной причине - он ListBox не использует ![]() ![]() |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #10 | Добавлено: 14.03.05 00:43 |
Неужели Offline-клиент не использует подобной конструкции? Мой тоже, там не только ListBox, но и даже ListView нет ![]() |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ICQ: 295002202 Вопросов: 87 Ответов: 1684 |
Профиль | Цитата | #11 | Добавлено: 14.03.05 14:49 |
А вот интересно - что быстрее работает с 100-10000 строками имен файлов? LB
или LV? Если последний, то почему бы мне его не использовать? Всеравно Common Controls подключаю... |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #12 | Добавлено: 14.03.05 17:30 |
ZagZag
LV и LB - всего лишь средство отображения состояния куска ОЗУ. Если нужно быстро показать данные, то тогда можно сравнивать LV и LB. Думаю, листбокс побыстрее заполнится. С другой стороны, есть virtual listview, который заполнять вообще не нужно. Он сам запросит количество данных, необходимое только для видимых на экране итемов. Остальные он не будет запрашивать и заполнять. Соответственно, времени нужно только на то, чтобы заполнить видимую часть. А если нужно быстро обрабатывать данные, то это достигается алгоритмом, а не LV и LB. |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #13 | Добавлено: 14.03.05 17:54 |
virtual listview Что за монстрозный контрол? Фирменный или доморощенный? |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #14 | Добавлено: 14.03.05 17:57 |
Хотя ПБ столько ненужных функций в ЕХЕ подключает Фигня это всё. Сколько VB6 DLL-ок подключает? Одну. А загружается прога (первый раз) довольно долго. А PB'шная прога загружается моментально, потому что все адреса расчитываются компилятором, а не загрузчиком, как в VB. |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ICQ: 295002202 Вопросов: 87 Ответов: 1684 |
Профиль | Цитата | #15 | Добавлено: 14.03.05 19:28 |
CyRax, я про то если бы он их не подключал...
36 Функций из 4-х (хоть и стандартных) библиотек для пустого проекта - ИМХО, много ![]() #COMPILE EXE
#TOOLS OFF FUNCTION PBMain END FUNCTION Размер 5,5Кб ...и IDA ругается The imports segment could be destroyed (uncheck 'make imports
section' at the loading time) А во всем остальном: PB = VB + ASM - MSVBVMxx.DLL + _ быстродействие - плохая_работа_с_оконным_интерфейсом + приятные_мелочи (TCP OPEN, ARRAY SORT и т. д.) Кстати, как можно использовать регулярные выражения из VB в PB. ИМХО, встроенные в PB REGEXPR - тормознуты ![]() Думаю лучше Microsoft VBScript Regular Expressions 5.5, но как ее подключить и использовать из PB... |
|