Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,617
Записей в блоге: 1

Скролл по DBGrid'у с помощью колесика мышки

14.10.2009, 13:37. Показов 4005. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Извините если надоел этой крысой...
Подскажите пожалуйста, как сделать скрол по DBGrid'у колесиком крысы?

Toxa33rus и Abu. Ну Вы же точно знаете, ни где не смог найти...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.10.2009, 13:37
Ответы с готовыми решениями:

Запрет прокрутки RichTextBox с помощью колесика мышки
Здравствуйте. В частности нужна отмена вертикальной прокрутки мышкой у RichTextBox. Спасибо.

Прокрутка колёсика мышки
Наверняка уже обсуждалось, но в поиске не нашёл... Требуется отслеживать изменение положения колёсика и далее надо будет применять те...

Блокировка прокрутки колесика мышки
Привет, подскажите как в jQuery осуществляется Блокировка прокрутки колесика мышки до окончания выполнения скрипт. Есть слайдер с...

14
 Аватар для Toxa33rus
3924 / 925 / 125
Регистрация: 16.04.2009
Сообщений: 1,977
18.10.2009, 19:43
Да у меня не установлен VB. Ничем не могу помочь. Не предусмотрен там скролл
0
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,617
Записей в блоге: 1
18.10.2009, 20:32  [ТС]
А в VB2008?
0
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,617
Записей в блоге: 1
25.10.2009, 17:19  [ТС]
Цитата Сообщение от DM_AND Посмотреть сообщение
А в VB2008?
Abu, я знаю что ты владеешь NET. (Прости что выдал). Там предусмотрен? Я тогда просто апргейдил бы в NET'e, добавил что надо и скомпилировал...
0
 Аватар для Abu
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
25.10.2009, 21:59
Цитата Сообщение от DM_AND Посмотреть сообщение
Abu, я знаю что ты владеешь NET.
Эт какая-то левая инфа у тебя, дай в глаз тому, кто тебе такую чушь сказал. Я его поставила тока неделю или две назад, и с тех пор всего пару раз запускала.

Теперь по теме: я понятия не имею, как сделать скролл, но точно знаю что это реально, т.к. где-то совсем недавно видела пример. В итоге есть два варианта решения твоей проблемы: 1. - ты ищешь в сети сам, 2. - ищу я и как тока найду кину тебе ссылку на страничку.
0
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,617
Записей в блоге: 1
25.10.2009, 22:21  [ТС]
Цитата Сообщение от Abu Посмотреть сообщение
Эт какая-то левая инфа у тебя, дай в глаз тому, кто тебе такую чушь сказал. Я его поставила тока неделю или две назад, и с тех пор всего пару раз запускала.

Теперь по теме: я понятия не имею, как сделать скролл, но точно знаю что это реально, т.к. где-то совсем недавно видела пример. В итоге есть два варианта решения твоей проблемы: 1. - ты ищешь в сети сам, 2. - ищу я и как тока найду кину тебе ссылку на страничку.
Не знаю, в нете просидел долго ни чего не нашел. Бросил дело и обратился к тебе. Найдешь, в долгу не останусь.

Это последнее что есть
сабклассингом (ретранслировать WM_MOUSEWHEEL в WM_VSCROLL). Но не очень мне понятно.
0
 Аватар для Abu
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
25.10.2009, 23:29
Смотри лс. Если ссылы помогут, то прикрути к своему коду и вложи потом свой вариант тут, для тех кто столкнётся той же проблемой.
1
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,617
Записей в блоге: 1
26.10.2009, 00:48  [ТС]
Цитата Сообщение от Abu Посмотреть сообщение
Смотри лс. Если ссылы помогут, то прикрути к своему коду и вложи потом свой вариант тут, для тех кто столкнётся той же проблемой.
Код был не совсем понятен и вроде не гриду а к листу он привел пример, короче переделал ругается на
Visual Basic
1
2
3
4
Private Sub Form_Load()
  
pObj = ObjPtr(DBGrid1)
    lpPrevWndProc = SetWindowLong(DBGrid1.hWnd, [OFF]вот на следующее [/OFF]GWL_WNDPROC, AddressOf WindowProc)
Че это за адрес, или другое.
В общем код разбирать не ночью. Завтра с утрица попробую...

Добавлено через 16 минут
GWL_WNDPROC, ловля сообщений. Сто-то я с ним не сильно добился толка. Абушечка может посмотришь Или посмотри все-таки тот сайт, где ты увидала скролл.
0
 Аватар для Abu
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
26.10.2009, 19:17
Ща поищу, тока искать для vb6.0 или для .NET?

P.S.
Я гляжу тут какая-то новая забава с перемещением тем.
0
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,617
Записей в блоге: 1
26.10.2009, 22:52  [ТС]
Цитата Сообщение от Abu Посмотреть сообщение
Ща поищу, тока искать для vb6.0 или для .NET?

P.S.
Я гляжу тут какая-то новая забава с перемещением тем.
для 6, а найдешь к NET так

Во-во, с темами перегнули. Причем здесь тема к NET, ну один раз слово вставил. Тут же не все чисто VB6. Знаю что есть и с NET
0
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,617
Записей в блоге: 1
27.10.2009, 20:56  [ТС]
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
'
Public pObj As Long
'
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim X As Integer
Dim dlist As Object
    On Error Resume Next
    If uMsg = 522 Then
        CopyMemory dlist, pObj, Len(pObj)
        If wParam > 0 Then
            dlist.Scroll 0, -1
        Else
            dlist.Scroll 0, 1
        End If
        Set dlist = Nothing
    End If
    WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function
 
 
Private Sub Form_Load()
    pObj = ObjPtr(dgList)
    lpPrevWndProc = SetWindowLong(dgList.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Вот здесь ругается на dgList, может кто попробует. Нет сил уже. Все излазил все перепробовал.
Может кто подскажет стороннего разработчика грида, бесплатного...
0
 Аватар для Abu
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
27.10.2009, 21:13
Значит так, поискать у меня не получилось, а вот узнать чё такое сабклассинг и как его его юзать вроде удалось. Короче, вот полу-рабочий код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
'в модуле:
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
 
Public Const GWL_WNDPROC = -4
Const WM_MOUSEWHEEL = &H20A
 
Public OldProc As Long
Public Function ScrollDBGrid(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_MOUSEWHEEL Then
    If wParam < 0 Then
        Form1.DBGrid1.Scroll 0, 1
    ElseIf wParam > 0 Then
        Form1.DBGrid1.Scroll 0, -1
    End If
End If
ScrollDBGrid = CallWindowProc(OldProc, hwnd, Msg, wParam, lParam)
End Function
 
 
' в форме:
Private Sub Form_Load()
OldProc = SetWindowLong(DBGrid1.hwnd, GWL_WNDPROC, AddressOf ScrollDBGrid)
End Sub
 
Private Sub Form_Terminate()
Call SetWindowLong(DBGrid1.hwnd, GWL_WNDPROC, OldProc)
End Sub
Прикол в том, что он работает только когда выделенная ячейка не в пределах видимости (т.е. за границами окна DBGrid-a). Прокрути таблицу скролом, чтоб выделенная ячейка ушла за границы, и ты увидешь, что мышиный скрол работает. Причём, если повесить на форму пару кнопок и крутить таблицу тем же методом Scroll, но через кнопки, то всё работает независимо оттого где стоит курсор, в области видимости или нет.
Visual Basic
1
2
3
4
5
6
7
Private Sub Command1_Click()
DBGrid1.Scroll 0, -1
End Sub
 
Private Sub Command2_Click()
DBGrid1.Scroll 0, 1
End Sub
Пара попыток трассировки показала, что пока ячейка с курсором в пределах поля DBGrid-a, то отлова сообщений самому DBGrid-у не происходит. Я в этом не шарю, но мне кажется, что это происходит из-за того, что пока ячейка с курсором видна - сообщения идут именно ей (по крайней мере сообщения самого скролинга мышью DBGrid-у не идут). Чтоб прикрутить к коду саму ячейку надо знать её хэндл, а я не знаю, если вообще есть такое св-во у DBGrid-a, как хэндл выделенной ячейки. И как ни искала в Object Browser-e не нашла ничё похожего. Так что тут запара. Ещё раз повторюсь, что я в этом особо не шарю, поэтому могу ошибаться. Слова о том что я видела где-то пример, беру назад. Я действительно видела пример, но т.к. с базами не работаю, могла просто перепутать DBGrid с FlexGrid-ом, или ещё с каким-нить гридом. Но слова о том, что это реально назад брать не стану, ибо считаю, что нет ничего нереально в программировании. Но опять же, я могу и ошибаться, т.к. многого не знаю. Вот. Как вариант могу предложить кинуть поверх DBGrid-a, в том месте где DBGrid-ский скролл, самый обычный VScroll, привязать к процедуре VScroll1_Change() метод DBGrid-a Scroll, субклассировать саму форму, и тогда мышиный скроллинг будет работать всегда, правда при любом скроле на месте формы. Но это вариант из разряда "через ж**у".

Вариант два - заменить BDGrid на FlexGrid, в нём у меня скроллинг получился.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
' в модуле:
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
 
Public Const GWL_WNDPROC = -4
Const WM_MOUSEWHEEL = &H20A
 
Public FlGrOldProc As Long
 
Public Function ScrollFlGrid(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_MOUSEWHEEL Then
    If wParam < 0 Then
        If Form1.MSFlexGrid1.Rows > Form1.MSFlexGrid1.TopRow + 1 Then _
        Form1.MSFlexGrid1.TopRow = Form1.MSFlexGrid1.TopRow + 1
    ElseIf wParam > 0 Then
        If Form1.MSFlexGrid1.TopRow > 1 Then _
        Form1.MSFlexGrid1.TopRow = Form1.MSFlexGrid1.TopRow - 1
    End If
End If
ScrollFlGrid = CallWindowProc(FlGrOldProc, hwnd, Msg, wParam, lParam)
End Function
 
' в форме:
Private Sub Form_Load()
FlGrOldProc = SetWindowLong(MSFlexGrid1.hwnd, GWL_WNDPROC, AddressOf ScrollFlGrid)
End Sub
 
Private Sub Form_Terminate()
Call SetWindowLong(MSFlexGrid1.hwnd, GWL_WNDPROC, FlGrOldProc)
End Sub
Вариант три, искать, искать и искать. Ну или обратиться к гуру.

В общем как-то так. Сразу предупрежу, все коды сырые, и специально не тестились, работают и ладно. Если чё-нить из вышесказанного подойдёт, то кури сабклассинг.

Если будешь тестить коды - не завершай работу программы кнопкой End, только через крестик (т.е. стандартный Unload). А то vb будет вылетать, это обратная сторона сабклассинга.

P.S. Модеры, верните уже тему в vb6.0!
2
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,617
Записей в блоге: 1
28.10.2009, 21:35  [ТС]
Да, и в прям. Только вот с флексом проблемы, Абушечка. Может есть по Флексу что-нибудь. А то сильно грид корявый получился. И надо все переписывать...
0
 Аватар для Abu
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
29.10.2009, 20:23
Значит так,
1. В каком смысле с флексом проблемы?
2. Что значит
Цитата Сообщение от DM_AND Посмотреть сообщение
Может есть по Флексу что-нибудь.
Что-нить - это что?
3. Тебе просили передать, что если нужен скрол по гриду, то юзай SGrid. В личку кину ссылку на него.
1
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,617
Записей в блоге: 1
30.10.2009, 19:37  [ТС]
По флексу что-нибудь, это любой help
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.10.2009, 19:37
Помогаю со студенческими работами здесь

Отловить действие мышки: прокрутка колесика
Понял, что надо использовать функцию LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam), UINT message...

Нажатие кнопки поворот колёсика мышки
Добрый день. Нужна помощь. Можно ли переключать кнопу колёсиком мышки без фокуса.

Прокрутка колесика мышки в своем компоненте
Помогите разобраться с прокруткой колесика мышки в своем компоненте: Предположим, что у меня есть компонент, в котором лежит...

Отловить действие мышки: прокрутка колесика
Понял, что надо использовать функцию LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam), UINT message...

Как заставить FlexGrid, DataGrid прокручиваться от колесика мышки?
Скажите, кто знает, как заставить FlexGrid, DataGrid прокручиваться от колесика мышки?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru