Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

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

 

  Вопрос: HScroll в ListBox Добавлено: 09.03.05 23:05  

Автор вопроса:  ZagZag | ICQ: 295002202 

Есть процедура установки горизонтальной полосы прокрутки у стандартного
ЛистБокса:
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
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 10.03.05 00:22
Чем тебе не нравится вариант с константой?

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #2
Добавлено: 10.03.05 03:19
Другой способ не скажу - влом искать (если он конечно вообще существует), а вот максимальную ширину можно вычислить с помощью GetTextExtentPoint32.

Ответить

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



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #3 Добавлено: 10.03.05 18:17
Sharp, константа не подходит, т. к. текст может иметь разную длину. Если
есть вариант - выстави его здесь, только я хочу чтобы скролл появлялся в
точь под длину максимальной строки.

CyRax, не хочется подключать gdi32.dll - в моем проекте я уМУДряюсь пока
обходиться без нее

В ЛистБоксе хранятся имена файлов (полные). Адреса можно динамически
добавлять/удалять. Я хочу чтобы можн было просмотреть имя файла от начала до
конца, а если имя слишком длинное - появился HScroll (принадлежащий ЛБ)

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #4
Добавлено: 10.03.05 19:17

CyRax, не хочется подключать gdi32.dll

 Не хочется - не подключай. Поищи тогда что то типа TextWidth(List1.List(Index))

Ответить

Номер ответа: 5
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #5 Добавлено: 12.03.05 00:47
Вместо GetTextExtentPoint32 я обычно использую скрытый контрол Label с AutoSize = True :))

Ответить

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



Вопросов: 117
Ответов: 1538
 Профиль | | #6 Добавлено: 12.03.05 05:36
А что тебя пугает gdi32.dll? Её ведь не надо таскать с собой, в любой винде она есть.
А TextWidth или Label.Autosize в любом случае полезут в эту самую gdi32.dll либо в user32.dll.
Оба этих метода либо GetTextExtentPoint32 либо DrawText вызывают.

Если с Label'ом, то надо его шрифт установить такой же, как в листбоксе

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #7
Добавлено: 12.03.05 11:38

А TextWidth или Label.Autosize в любом случае полезут в эту самую gdi32.dll либо в user32.dll.

 Во во, надо почаще открывать глаза VB-шникам, а то у них виртуальная машина - нечто вроде внеземной технологий и земному разуму её не понять :)

Ответить

Номер ответа: 8
Автор ответа:
 ZagZag



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #8 Добавлено: 13.03.05 00:11
CyRax, я не обоими ногами VB'шник :)
Я уже пытаюсь "напряженные" процедуры на асме или Power Basic писать. (Хотя
ПБ столько ненужных функций в ЕХЕ подключает :( )

Подкиньте примерчик, если у кого есть. Неужели Offline-клиент не использует
подобной конструкции?

Ответить

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



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #9
Добавлено: 13.03.05 13:32
Клиент не нуждается в подобной конструкции-лишь по одной причине - он ListBox не использует :) ему ListView больше по душе :)

Ответить

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #10
Добавлено: 14.03.05 00:43
Неужели Offline-клиент не использует подобной конструкции?
Мой тоже, там не только ListBox, но и даже ListView нет :)

Ответить

Номер ответа: 11
Автор ответа:
 ZagZag



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #11 Добавлено: 14.03.05 14:49
А вот интересно - что быстрее работает с 100-10000 строками имен файлов? LB
или LV?
Если последний, то почему бы мне его не использовать? Всеравно Common
Controls подключаю...

Ответить

Номер ответа: 12
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #12 Добавлено: 14.03.05 17:30
ZagZag
LV и LB - всего лишь средство отображения состояния куска ОЗУ. Если нужно быстро показать данные, то тогда можно сравнивать LV и LB. Думаю, листбокс побыстрее заполнится. С другой стороны, есть virtual listview, который заполнять вообще не нужно. Он сам запросит количество данных, необходимое только для видимых на экране итемов. Остальные он не будет запрашивать и заполнять. Соответственно, времени нужно только на то, чтобы заполнить видимую часть.

А если нужно быстро обрабатывать данные, то это достигается алгоритмом, а не LV и LB.

Ответить

Номер ответа: 13
Автор ответа:
 CyRax



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #13
Добавлено: 14.03.05 17:54

virtual listview

 Что за монстрозный контрол? Фирменный или доморощенный?

Ответить

Номер ответа: 14
Автор ответа:
 CyRax



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #14
Добавлено: 14.03.05 17:57

Хотя ПБ столько ненужных функций в ЕХЕ подключает

 Фигня это всё. Сколько VB6 DLL-ок подключает? Одну. А загружается прога (первый раз) довольно долго. А PB'шная прога загружается моментально, потому что все адреса расчитываются компилятором, а не загрузчиком, как в VB.

Ответить

Номер ответа: 15
Автор ответа:
 ZagZag



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...

Ответить

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

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



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