powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / И снова о скроллинге колесом мыши. MSFlexGrid
63 сообщений из 63, показаны все 3 страниц
И снова о скроллинге колесом мыши. MSFlexGrid
    #36249168
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, поиском попользовался, почитал о решениях проблемы со скроллингом например для DataGrid - http://sql.ru/forum/actualthread.aspx?tid=93660

У MSFlexGrid, правда, нет метода Scroll. Т.е., видимо, надо пользоваться TopRow...

Но, собственно, вопрос такой. Вот тут: http://support.microsoft.com/kb/837910/en-us сказано:

microsoftMouse wheel support in Visual Basic 6.0 is a function of the mouse driver. The WM_MOUSEWHEEL message is sent to the Focus window when you rotate the mouse wheel. Because the Visual Basic 6.0 IDE does not have built-in support for scrolling by using the mouse wheel, the IDE ignores the WM_MOUSEWHEEL message. However, IntelliPoint software version 4.12 provides mouse wheel support and converts the WM_MOUSEWHEEL message to WM_SCROLL. IntelliPoint software version 4.9 and later versions do not have this feature.


Так может просто перехватывать сообщение WM_MOUSEWHEEL для окна и конвертировать его в WM_SCROLL? Тогда метод будет достаточно универсальный и его можно будет применять везде, где нужна прокрутка (например в комбобоксах). Ведь при установке некоторых драйверов (в частности драйвер genius-овский драйвер от NetScroll "с глазами") скролл работает во всех Vb-шных контролах.

Кто тут силен в API? Можно ли так сделать?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36249649
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все уже давно сделано.
Код: plaintext
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
Option Explicit

Private Declare Function SystemParametersInfo Lib "user32.dll" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private 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
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hwnd As Long, ByVal lpString As String, ByVal hData As Long) As Long
Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Const WM_MOUSEWHEEL As Long = &H20A
Private Const WM_CLOSE As Long = &H10
Private Const GWL_WNDPROC As Long = - 4 
Private Const WHEEL_DELTA As Long =  120 
Private Const SPI_GETWHEELSCROLLLINES As Long =  104 

Private Const PROP_PREVPROC = "prevptr"
Private Const PROP_GRIDPTR = "gridptr"
Private Const PROP_DELTA = "delta"

Private Type POINTAPI
    X As Long
    Y As Long
End Type

Public Sub AddScroll2Grids(Form As Form)
Dim Grid As Object
Dim p As Long
Dim hwnd As Long
    If Form.MDIChild Then
        hwnd = GetParent(Form.hwnd)
        hwnd = GetParent(hwnd)
    Else
        hwnd = Form.hwnd
    End If
    If GetProp(hwnd, PROP_PREVPROC) =  0  Then
        p = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf FrmProc)
        SetProp hwnd, PROP_PREVPROC, p
    End If
    For Each Grid In Form.Controls
        Select Case TypeName(Grid): Case "DataGrid", "DBGrid", "MSFlexGrid", "MSHFlexGrid"
            p = SetWindowLong(Grid.hwnd, GWL_WNDPROC, AddressOf GridProc)
            SetProp Grid.hwnd, PROP_PREVPROC, p
            SetProp Grid.hwnd, PROP_GRIDPTR, ObjPtr(Grid)
        End Select
    Next
End Sub

Private Function GridProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lPrevWndProc As Long
Dim lLines2Scroll As Long
Dim GridPtr As Long
Dim Delta As Long
Dim hwnd As Long
Dim oList As Object
Dim pa As POINTAPI
Dim dScroll As Integer
    lPrevWndProc = GetProp(hw, PROP_PREVPROC)
    If lPrevWndProc =  0  Then Exit Function
    Select Case uMsg
        Case WM_MOUSEWHEEL
            GetCursorPos pa
            hwnd = WindowFromPoint(pa.X, pa.Y)
            GridPtr = GetProp(hwnd, PROP_GRIDPTR)
            If GridPtr <>  0  Then
                SystemParametersInfo SPI_GETWHEELSCROLLLINES,  0 , lLines2Scroll,  0 
                Delta = GetProp(hw, PROP_DELTA) + wParam / &H10000
                dScroll = -lLines2Scroll * (Delta \ WHEEL_DELTA) * ( 10  +  9  * (Not (wParam = - 7864316  Or wParam =  7864324 )))
                Set oList = ObjFromPtr(GridPtr)
                Select Case TypeName(oList)
                    Case "DataGrid", "DBGrid"
                        oList.Scroll  0 , dScroll
                    Case "MSFlexGrid", "MSHFlexGrid"
                        On Error GoTo errh
                        If oList.TopRow + dScroll <= oList.FixedRows -  1  Then
                            oList.TopRow = oList.FixedRows
                        ElseIf oList.TopRow + dScroll >= oList.Rows Then
                            oList.TopRow = oList.Rows -  1 
                        Else
                            oList.TopRow = oList.TopRow + dScroll
                        End If
                End Select
                SetProp hw, PROP_DELTA, Delta Mod WHEEL_DELTA
            End If
        Case WM_CLOSE
            RemoveProp hw, PROP_PREVPROC
            RemoveProp hw, PROP_GRIDPTR
            RemoveProp hw, PROP_DELTA
            SetWindowLong hw, GWL_WNDPROC, lPrevWndProc
        Case Else
            GridProc = CallWindowProc(lPrevWndProc, hw, uMsg, wParam, lParam)
    End Select
    Exit Function
errh:
    Debug.Print Err.Description, oList.Row + dScroll
End Function

Private Function FrmProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lPrevWndProc As Long
Dim hwnd As Long
Dim pa As POINTAPI
    lPrevWndProc = GetProp(hw, PROP_PREVPROC)
    Select Case uMsg
        Case WM_MOUSEWHEEL
            GetCursorPos pa
            hwnd = WindowFromPoint(pa.X, pa.Y)
            If GetProp(hwnd, PROP_PREVPROC) <>  0  Then SendMessage hwnd, uMsg, wParam, lParam
        Case WM_CLOSE
            RemoveProp hw, PROP_PREVPROC
            SetWindowLong hw, GWL_WNDPROC, lPrevWndProc
        Case Else
            FrmProc = CallWindowProc(lPrevWndProc, hw, uMsg, wParam, lParam)
    End Select
End Function

Private Function ObjFromPtr(lObjPtr As Long) As Object
Dim LoTmp As Object
    If lObjPtr <>  0  Then
        CopyMemory LoTmp, lObjPtr,  4 
        Set ObjFromPtr = LoTmp
        CopyMemory LoTmp,  0 &,  4 
    End If
End Function

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36249921
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProТогда метод будет достаточно универсальный и его можно будет применять везде, где нужна прокрутка (например в комбобоксах).Во всех остальных стандартных контролах колесо и так работает.


Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36249977
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё не забывает про чудо-мышки от компании гениус, у них траблы с дровами для работы с vb-прогами , где колесо нужно
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36251327
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВсе уже давно сделано.

Спасибо!

Первичное курение кода показало, что он рассчитан на то, что грид тупо лежит на форме. У меня же гриды лежат в основном внутри юзерконтролов, юзерконтролы могут лежать в других юзерконтролах и фреймах в произвольной комбинации. Кроме того, обработку скролла хочется реализовать на уровне нижнего контрола, содержащего грид, он лежит в отдельной ActiveX-библиотеке и не представляет, куда его закинет судьба, а, тем временем, приведенный вами код требует наличие hwnd от формы, причем, в случае MDI-проекта - от MDI-формы.

Я могу спустить на уровень юзерконтрола MYMDIForm.hwnd - это решит поблему?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36252533
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ могу спустить на уровень юзерконтрола MYMDIForm.hwnd - это решит поблему?Если это вообще возможно, то только добавит новые.

Shocker.Proтем временем, приведенный вами код требует наличие hwnd от формы, причем, в случае MDI-проекта - от MDI-формыПервым делом WM_MOUSEWHEEL получает форма, а пооследним — тот контрол, в котором находится фокус. Мне хотелось сделать скролл, который не зависит от фокуса, это удобней. Если это вам не надо, можете избавиться от FrmProc.

Shocker.ProКроме того, обработку скролла хочется реализовать на уровне нижнего контролаНикаких проблем, лишнее убрал.
Код: plaintext
1.
2.
3.
4.
5.
Public Sub AddScroll2Grids(Grid as Object)
Dim p As Long
    p = SetWindowLong(Grid.hwnd, GWL_WNDPROC, AddressOf GridProc)
    SetProp Grid.hwnd, PROP_PREVPROC, p
    SetProp Grid.hwnd, PROP_GRIDPTR, ObjPtr(Grid)
End Sub

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36252544
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЕсли это вообще возможно, то только добавит новые.Упс, не правильно понял. Да, можете и решит.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36252610
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyМне хотелось сделать скролл, который не зависит от фокуса, это удобней. Если это вам не надо, можете избавиться от FrmProc.

А, ну то есть я спокойно могу перехватывать сообщение на уровне MSFlexGrid.hwnd и будет работать (но при условии, что фокус стоит на сетке)?

А в вашем варианте получается, что скролл будет работать в активной форме, даже если курсор не находится непосредственно над сеткой? или он дополнительно проверяет координаты? (извините, в функциях АПИ совсем не силен).
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36253030
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proили он дополнительно проверяет координаты?Именно.
FrmProc:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
…
Case WM_MOUSEWHEEL 'в форму пришел скролл

    'получаем координаты курсора
    GetCursorPos pa

    'получаем hWnd окна, оказавшегося под курсором
    hwnd = WindowFromPoint(pa.X, pa.Y)

    'проверяем наличие свойства PROP_PREVPROC у найденного окна
    'если нашлось, то это определенно один из наших гридов и мы перенаправляем WM_MOUSEWHEEL непосредственно ему, другие окна его не получат
    If GetProp(hwnd, PROP_PREVPROC) <>  0  Then SendMessage hwnd, uMsg, wParam, lParam

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36253048
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА, ну то есть я спокойно могу перехватывать сообщение на уровне MSFlexGrid.hwnd и будет работать (но при условии, что фокус стоит на сетке)?Да.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36254315
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух!

Работает без обработки напильником!

Спасибо.


Я разнес использование: GridProc затолкал внутрь юзерконтрола и он там себе спокойно переваривается и инициализируется в момент загрузки контрола, а FrmProc определил на уровне MDI_Form-ы, инициализация идет в момент загрузки приложения.

Единственная осталась неприятность: Если фокус стоит на комбобоксе или, скажем treeview, то крутится не сетка, а фокусный контрол, даже если курсор летает над сеткой. Особенно неприятно с комбобоксом, так как, как правило, это фильтр или сортировка для сетки и его смена заставляет сетку обновляться. Уважаемый гуру, можно это победить?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36259345
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оп, и еще одна проблемка возникла: если в режиме отладки возникает неперехватываемая ошибка - Debug не работает, видимо из-за того, что обработчик сообщений для главного окна программы уже испорчен, но сама прога на VB уже не выполняется.

Видимо, придется запретить перехват для MDI формы при работе из-под IDE.

По пердыдущему вопросу - UP!
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36271823
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

UP :(
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36272337
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПервым делом WM_MOUSEWHEEL получает форма, а пооследним — тот контрол, в котором находится фокус.Здесь я наврал. На самом деле первым получает контрол, если он событие отработал, то дальше оно не идет.

По-видимому с этим ничего не сделаешь. При фокусе в комбо в форму приходит только WM_COMMAND.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36272372
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЗдесь я наврал. На самом деле первым получает контрол, если он событие отработал, то дальше оно не идет.

По-видимому с этим ничего не сделаешь. При фокусе в комбо в форму приходит только WM_COMMAND.


Гм. А если перехватить обработку на уровне комбобокса (благо он тоже обернут в ActiveX-юзерконтрол)? И, если курсор мыши не находится непосредственно над ним, отменить и передать дальше?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36272539
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ради бога) Можно передавать его форме.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36272574
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyРади бога) Можно передавать его форме.


Я имел ввиду не передачу куда-то конкретно, а передачу по цепочке. Таким образом, чтобы оно дошло до вышестоящего уровня (MDI-формы) вне зависимости от того, сколько вложенных hwnd встретится на его пути.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36273056
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По цепочке не надо. Лучше вставить обработку WM_MOUSEWHEEL из FrmProc.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36273742
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПо цепочке не надо. Лучше вставить обработку WM_MOUSEWHEEL из FrmProc.

Вставил, в принципе работает, кроме самого себя, т.е. при попытке навести мыша на сам комбобокс и прокрутить, прога вылетает мгновенно вместе с IDE без всяких сообщений (видимо из-за переполнения стека, так как он видимо зацикливается на отправке сообщений самому себе).

P.S.
Помогла доработка процедуры FrmProc до:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
        Case WM_MOUSEWHEEL
            GetCursorPos pa
            hwnd = WindowFromPoint(pa.X, pa.Y)
            If hwnd <> hw Then
              If GetProp(hwnd, PROP_PREVPROC) <>  0  Then SendMessage hwnd, uMsg, wParam, lParam
            Else
              FrmProc1 = CallWindowProc(lPrevWndProc, hw, uMsg, wParam, lParam)
            End If

Таким образом работает и сетка и сам комбобокс, когда курсор находится над ними. Но если фокус стоит на комбобоксе, а курсор летает над TreeView, то TreeView не крутится. Почему так, он игнорирует SendMessage?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36274248
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SendMessage до него не доходит из-за проверки наличия PROP_PREVPROC. Наверное можно ее убрать в вашем случае.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36275716
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariySendMessage до него не доходит из-за проверки наличия PROP_PREVPROC. Наверное можно ее убрать в вашем случае.

Тогда возникают другие глюки....
Пытаюсь подобрать рабочую комбинацию...

Скажите, а в чем разница между
SendMessage hwnd, uMsg, wParam, lParam
и
FrmProc = CallWindowProc(lPrevWndProc, hwnd, uMsg, wParam, lParam)
?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36276513
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Скажите, а в чем разница между
> SendMessage hwnd, uMsg, wParam, lParam

Это ты посылаешь uMsg с помощью сообщений Windows, и пока сообщение не будет принято, отправляемая программа ждет,
иногда лучше использовать PostMessage, которая просто отправляет сообщение и не задерживает программу.

> FrmProc = CallWindowProc(lPrevWndProc, hwnd, uMsg, wParam, lParam)

А это просто вызов функции, со всеми вытекающими последствиями

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36276611
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,

Как раз "вытекающие последствия" меня и интересуют.
Я понимаю, что одно из них "отправить сообщение", другое "вызвать функцию"

Но так как в вышеприведенной программе используются оба способа в рамках одной функции (FrmProc), значит есть какая-то принципиальная разница, вот я ее я и хочу понять для отладки.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36276839
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Как раз "вытекающие последствия" меня и интересуют.
> Но так как в вышеприведенной программе используются оба способа в рамках одной функции (FrmProc), значит есть
> какая-то принципиальная разница, вот я ее я и хочу понять для отладки.

принципиальная разница в том, что сообщения можно слать кому угодно, не только своим контролам и при этом задействуется
внешний механизм передачи сообщений Windows, а вызывать функцию, можно только получив доступ в адресное пространство

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36277373
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбоноспринципиальная разница в том, что сообщения можно слать кому угодно, не только своим контролам и при этом задействуется
внешний механизм передачи сообщений Windows, а вызывать функцию, можно только получив доступ в адресное пространство


Ну это с точки зрения вызова. А с точки зрения функционирования в данном конкретном случае (то есть в пределах моего приложения) есть какая-то разница?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36277428
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> Ну это с точки зрения вызова. А с точки зрения функционирования в данном конкретном случае (то есть в пределах
> моего приложения) есть какая-то разница?

я думаю вызов функции, все-же "дешевле", чем отдаватся на милость виндовой службы сообщений, которая может быть и
занята. В твоем случае сообщения как бумеранг, запустил, он полетал и вернулся, сколько он летает неизвестно. А вызов
функции - это вызов функции.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36277538
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProИгорь Горбоноспринципиальная разница в том, что сообщения можно слать кому угодно, не только своим контролам и при этом задействуется
внешний механизм передачи сообщений Windows, а вызывать функцию, можно только получив доступ в адресное пространство


Ну это с точки зрения вызова. А с точки зрения функционирования в данном конкретном случае (то есть в пределах моего приложения) есть какая-то разница?Игорь видимо покурил сегодня что-то забористое

SendMessage это отправка сообщения окну, а CallWindowProc это вызов обработчика оконных сообщений.

FrmProc = CallWindowProc(lPrevWndProc, hwnd, uMsg, wParam, lParam) это вызов оригинального обрабатчика, который мы заменили своим FrmProc. Так как мы обрабатываем не все сообщения, то для нормального функционирования окна обязаны вызывать старый обработчик.

А вообще на все вопросы типа "что такое %functionname%?" есть ответы в MSDN.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36277564
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Antonariy
> Игорь видимо покурил сегодня что-то забористое

Если-бы, похоже сказалось "чемоданное настроение", таких сказок нарасказывал, аж сам поверил. Прошу прощения за
заблуждения

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36277690
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА вообще на все вопросы типа "что такое %functionname%?" есть ответы в MSDN.

Ну больше-то вопросов возникает не о том, как работает функция, а о каких-то особенностях.

AntonariySendMessage до него не доходит из-за проверки наличия PROP_PREVPROC. Наверное можно ее убрать в вашем случае.

Ну тогда получается такая вот фиговина:
Работают две оконных функции FormProc, для MDI-формы и для комбика.
Работает как хотелось бы, за исключением одного сочетания: если фокус стоит на комбике, а мышь находится над формой (просто над любой формой), при попытке прокрутить колесо - вылетает "выполнило недопустимую операцию. То есть виновата команда SendMessage в обработчике для MDI - по идее сообщение должно быть отправлено форме, форма не содержит никаких прокруток, ничего не должно отрабатываться по идее, однако вот.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36278033
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем нужен пример, который повторяет этот глюк. Вы уже настолько творчески переработали и размазали первоначальный код по всему проекту, что без результата перед глазами я могу только гадать, что там происходит.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36281021
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВ общем нужен пример, который повторяет этот глюк. Вы уже настолько творчески переработали и размазали первоначальный код по всему проекту, что без результата перед глазами я могу только гадать, что там происходит.

Да, вы правы, давно надо было вытащить все в отдельный проект. Занялся, заодно во многом разобрался, сейчас могу сформулировать свои желания предельно ясно. Но сначала немного философии.

AntonariyА вообще на все вопросы типа "что такое %functionname%?" есть ответы в MSDN.

Только не сочтите за упрек лично вам, это я просто сетую на свой неспециализм в API. Я давно заметил, что этим грешат практически все самоучители по языку (любому). Автор поясняет свои мысли примерами, но он часто не поясняет, что в примерах является встроенными в язык функциями/константами/операторами, а что он сам определил как захотела его левая нога, а не потому что есть какие-то требования. Ему-то очевидно, он легко читает код и не обращает внимания, а новичку, который еще на набил руку, зачастую это просто неясно и приходится тратить много времени/усилий, чтобы разобраться в этом, вместо того, чтобы изучать суть алгоритма.

В данном конкретном случае до меня далеко не сразу дошло, что константы
Public Const PROP_PREVPROC = "prevptr"
Public Const PROP_GRIDPTR = "gridptr"
Public Const PROP_DELTA = "delta"
это не константы из API, которые требовалось определить именно так, чтобы правильно вызывать функции API, а произвольный код программиста..... Для меня это просто неочевидно, из-за неопытности, соответственно, я не смог сразу правильно врубиться в код, к тому же я впервые столкнулся с реальной работой с оконными сообщениями.



Теперь по делу.
Заставить скроллиться ГРИД - проблема понятная и решенная - ему только сообщение подай, так что про него пока не говорим.


Есть более глобальная задача, которую хотелось бы решить в идеале именно в такой постановке.
Задача:
Заставить скроллиться во всех случаях то, над чем находится мышиный курсор, а не то, на чем стоит фокус (то есть так, как поступает genius-драйвер).
Допущение:
Приложение в варианте MDI.

Решение: (вариант А)
а) Перехватить оконные сообщения для всех элементов, которые имеют тенденцию к скроллу (это достаточно легко, так как контролы оформлены в виде юзерконтролов, а также есть централизованная система управления формами, которая может установить перехватчик при загрузке формы) , запретить им обрабатывать скролл стандартно и отправлять его на hwnd под курсором.
б) Перехватить наиболее вышестоящее сообщение для тех, кто скролл не обрабатывает и отправить его опять же в hwnd под курсором. В данном случае на MDI-форме.


Нехватка знаний возникает в п.б), а именно: если юзер пытается проскроллить элемент, который скролл не обрабатывает (например Child-форму), сообщение передается по цепочке наверх вплоть до обработчика MDI, та его перехватывает, определяет место под курсором, отправляет туда сообщение, получает его обратно по цепочке и так до переполнения стека. То есть ваше предложение убрать проверку "PROP_PREVPROC" не подходит.

Пример проекта с этим глюком приложен к сообщению. Если курсор находится над списком (при этом неважно, где находится фокус) - скроллится список. Если курсор над формой - при попытке скролла падает. Проект надо компилировать и запускать экзешник , запуск под IDE при наличии перехвата оконных сообщений - бессмысленен.

Каким-то образом нужно порвать порочную цепочку. Можно, конечно, попробовать поиграть с SetProp, GetProp, но я не знаю, насколько быстро будет это работать (в любом случае, не приветствуется вариант, который пожрет много ресурсов). Можно попробовать еще поставить перехват на все формы, но я не уверен, что не будет такого места, где переход по цепочке наверх пройдет мимо формы, ну как минимум, есть внутреннее подчиненное окно в самой MDI-форме.
Может вы подскажете сходу более удобоваримый вариант.

Возможно также, что существует "Вариант Б", который позволит управлять оконными сообщениями как-то извне.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36281747
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProМожно, конечно, попробовать поиграть с SetProp, GetProp, но я не знаю, насколько быстро будет это работать (в любом случае, не приветствуется вариант, который пожрет много ресурсов).Именно это и нужно делать применительно к пункту б.

Перед отправкой сообщения проверяем наличие у окна под мышкой свойства, назовем его PROP_MSGSENT. Если его нет, устанавливаем и отправляем сообщение, если есть — снимаем и все. Таким образом сообщение сделает максимум две ходки — вопрос о скорости и ресурсоемкости отпадает автоматически.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36281835
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати совсем не обязательно для каждой формы создавать отдельную процедуру.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36281984
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПеред отправкой сообщения проверяем наличие у окна под мышкой свойства, назовем его PROP_MSGSENT. Если его нет, устанавливаем и отправляем сообщение, если есть — снимаем и все.

А не сможет случиться так, что между двумя возникновениями этого сообщения мышиный курсор сдвинется и вернет разное hwnd?

AntonariyТаким образом сообщение сделает максимум две ходки — вопрос о скорости и ресурсоемкости отпадает автоматически.

Ну тут вопрос только в скорости работы самой установки/проверки свойств окна - не тормознутая ли это функция.

Я в свое время релизовывал одну функцию с обработкой On Error при обработке полей рекордсета, так как по условиям было неизвестно, есть поле с определенным названием в рекордсете или нет. Получилось очень тормозно. Усложнил функцию, добавив первичное составление карты полей, и анализ уже по карте, а не по самой коллекции Fields - получилось раз в сто быстрее. Потому есть фобии


AntonariyКстати совсем не обязательно для каждой формы создавать отдельную процедуру.

Это я понимаю . Просто делал разные функции для контролов и для MDI-формы для экспериментов.

AntonariyК сообщению приложен файл (scroll2.zip - 5Kb) cкачать

Не нашел отличий, это вы случайно приложили мой файл или не тот архив приложили?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36282044
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нашел отличий, это вы случайно приложили мой файл или не тот архив приложили?Упс, да.


Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36282060
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не сможет случиться так, что между двумя возникновениями этого сообщения мышиный курсор сдвинется и вернет разное hwnd?А вы попробуйте одновременно скроллить и елозить мышкой ;))
В любом случае сообщения отработаются раньше, чем курсор сдвинется хоть на пиксель.

Я в свое время релизовывал одну функцию с обработкой On Error при обработке полей рекордсета, так как по условиям было неизвестно, есть поле с определенным названием в рекордсете или нет. Получилось очень тормозно.Обработка исключений это всегда очень тормозно, в цикле вообще недопустимо. Проверку чего-либо с помощью исключений нужно делать когда по-другому сделать невозможно.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36282102
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА вы попробуйте одновременно скроллить и елозить мышкой ;))
Jah loves you.

Попробовал, жутко неудобно
Хотя зачастую так и происходит но неосознанно
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36282135
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
Попробовал, жутко неудобно
Хотя зачастую так и происходит но неосознанно

Ну на крайняк, на каком-нить из hwnd зависнет признак PROP_MSGSENT и впоследствии будет пропущено одно событие WHELL. Это не страшно...
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36282773
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyКстати совсем не обязательно для каждой формы создавать отдельную процедуру

Кстати, можно вообще объединить FrmProc и GridProc и сделать одну процедуру на все случаи жизни.

Код: plaintext
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Public Function GridProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'http://www.sql.ru/forum/actualthread.aspx?tid=703320

Dim lPrevWndProc As Long
Dim lLines2Scroll As Long
Dim GridPtr As Long
Dim Delta As Long
Dim hwnd As Long
Dim oList As Object
Dim pa As POINTAPI
Dim dScroll As Integer
    lPrevWndProc = GetProp(hw, PROP_PREVPROC)
    If lPrevWndProc =  0  Then Exit Function
    Select Case uMsg
        Case WM_MOUSEWHEEL
            GetCursorPos pa
            hwnd = WindowFromPoint(pa.X, pa.Y)
            GridPtr = GetProp(hwnd, PROP_GRIDPTR)
            If GridPtr <>  0  Then
                SystemParametersInfo SPI_GETWHEELSCROLLLINES,  0 , lLines2Scroll,  0 
                Delta = GetProp(hw, PROP_DELTA) + wParam / &H10000
                dScroll = -lLines2Scroll * (Delta \ WHEEL_DELTA) * ( 10  +  9  * (Not (wParam = - 7864316  Or wParam =  7864324 )))
                Set oList = ObjFromPtr(GridPtr)
                Select Case TypeName(oList)
                    Case "DataGrid", "DBGrid"
                        oList.Scroll  0 , dScroll
                    Case "MSFlexGrid", "MSHFlexGrid"
                        On Error GoTo errh
                        If oList.TopRow + dScroll <= oList.FixedRows -  1  Then
                            oList.TopRow = oList.FixedRows
                        ElseIf oList.TopRow + dScroll >= oList.Rows Then
                            oList.TopRow = oList.Rows -  1 
                        Else
                            oList.TopRow = oList.TopRow + dScroll
                        End If
                End Select
                SetProp hw, PROP_DELTA, Delta Mod WHEEL_DELTA
            ElseIf hwnd <> hw Then
                If GetProp(hwnd, PROP_MSGSENT) =  0  Then
                    SetProp hwnd, PROP_MSGSENT,  1 
                    SendMessage hwnd, uMsg, wParam, lParam
                Else
                    RemoveProp hwnd, PROP_MSGSENT
                End If
            Else
                GridProc = CallWindowProc(lPrevWndProc, hw, uMsg, wParam, lParam)
            End If
        Case WM_CLOSE
            RemoveProp hw, PROP_PREVPROC
            RemoveProp hw, PROP_GRIDPTR
            RemoveProp hw, PROP_DELTA
            RemoveProp hw, PROP_MSGSENT
            SetWindowLong hw, GWL_WNDPROC, lPrevWndProc
        Case Else
            GridProc = CallWindowProc(lPrevWndProc, hw, uMsg, wParam, lParam)
    End Select
    Exit Function
errh:
    Debug.Print Err.Description, oList.Row + dScroll
End Function


Вопрос, а зачем уничтожать свойства при выгрузке окна
RemoveProp hw, PROP_PREVPROC
RemoveProp hw, PROP_GRIDPTR
RemoveProp hw, PROP_DELTA
RemoveProp hw, PROP_MSGSENT
если окно все равно сейчас будет уничтожено?

Мало того, ведь в VB есть возможность отменить выгрузку окна, а свойства уже будут стерты.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36282947
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос, а зачем уничтожать свойства при выгрузке окнаMSND рекомендует.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36282955
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заодно универсальная процедура инициализации:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Sub InitWndProc(Obj As Object)
'http://www.sql.ru/forum/actualthread.aspx?tid=703320

Dim hwnd As Long
If App.LogMode <>  0  Then
  hwnd =  0 
  On Error Resume Next
  hwnd = Obj.hwnd
  On Error GoTo  0 
  
  If hwnd <>  0  Then
    If GetProp(hwnd, PROP_PREVPROC) =  0  Then
      SetProp hwnd, PROP_PREVPROC, SetWindowLong(hwnd, GWL_WNDPROC, AddressOf GridProc)
      If ValIN(TypeName(Obj), "DataGrid", "DBGrid", "MSFlexGrid", "MSHFlexGrid") Then
        SetProp hwnd, PROP_GRIDPTR, ObjPtr(Obj)
      End If
    End If
  End If
End If

End Sub

ValIN - вспомогательная библиотечная функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Public Function ValIN(Value As Variant, Arg1 As Variant, Optional Arg2 As Variant, Optional Arg3 As Variant, Optional Arg4 As Variant, Optional Arg5 As Variant, Optional Arg6 As Variant, Optional Arg7 As Variant, Optional Arg8 As Variant, Optional Arg9 As Variant, Optional Arg10 As Variant) As Boolean

ValIN = True
If Value = Arg1 Then Exit Function
If Not IsMissing(Arg2) Then If Value = Arg2 Then Exit Function
If Not IsMissing(Arg3) Then If Value = Arg3 Then Exit Function
If Not IsMissing(Arg4) Then If Value = Arg4 Then Exit Function
If Not IsMissing(Arg5) Then If Value = Arg5 Then Exit Function
If Not IsMissing(Arg6) Then If Value = Arg6 Then Exit Function
If Not IsMissing(Arg7) Then If Value = Arg7 Then Exit Function
If Not IsMissing(Arg8) Then If Value = Arg8 Then Exit Function
If Not IsMissing(Arg9) Then If Value = Arg9 Then Exit Function
If Not IsMissing(Arg10) Then If Value = Arg10 Then Exit Function
ValIN = False

End Function

AntonariyMSND рекомендует.
А как быть с отменой выгрузки? Переинициализировать в случае отмены выгрузки - громоздко.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36283059
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В смысле с отменой? WM_CLOSE происходит когда уже никакая отмена невозможна.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36283065
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValIn нужно переписать расово правильно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Public Function ValIN(Value As Variant, ParamArray Arg1()) As Boolean
Dim x as Integer
    For x = LBound(Arg1) To Ubound(Arg1)
        If Value = Arg1(x) Then 
            ValIN = True
            Exit Function
        End If
    Next
End Function
Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36283079
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyValIn нужно переписать расово правильно
Расово правильно - это на PERL-е. А так - просто грамотно.
Я пришел со своей библиотекой на VB6 с Access 2.0 (под Win 3.1), кажется, там не было ParamArray...

AntonariyВ смысле с отменой? WM_CLOSE происходит когда уже никакая отмена невозможна.
Понял.


Интегрирую код в рабочий проект.
VB-шные контролы - сволочи поголовно. Даже CommandButton - сама не обрабатывает WHEEL и другим не дает. Получается, перехватывать оконные сообщения придется на всех контролах формы, на которых только может оказаться фокус. "Доктор, неаккуратненько как-то". Неужели нет возможности перехватить сообщение на уровне приложения?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36283091
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proсама не обрабатывает WHEEL и другим не дает.

Я поторопился, сорри. На тестовом проекте работает, значит где-то у меня закралась ошибка
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36283132
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyValIn нужно переписать расово правильно
Расово правильно - это на PERL-е. А так - просто грамотно. Расово в смысле не по-индусски
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36283179
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

В общем, все работает как я хотел, даже с драйвером Genius-a не дерется.
Куда пиво слать?


P.S.
Можно продолжить тута:
http://www.sql.ru/forum/actualthread.aspx?tid=708313
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36283378
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ пришел со своей библиотекой на VB6 с Access 2.0 (под Win 3.1)
O_O Это же сколько лет оно работает?

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36283419
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyO_O Это же сколько лет оно работает?

Начало проекта - 1996 год Access 2.0
В 2000-м портировано на VB6/JET
В 2004-м на VB6/SQL
Теперь думаю, как бы в .NET затолкать, да больно кода много
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36758931
h7h2vC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, подскажите пожалуйста..
Использую Ваш код из второго сообщения (/topic/703320&pg=1&hl=addscroll2grids#7782886)

Добавляю AddScroll2Grids Me в Form_Load. Скроллинг работает, но при закрытии приложения из IDE программа вылетает (ОС Windows 7, пробовал на соседнем компьютере из под WinXP - не вылетает):
- Картинка
- Текст ошибки:Visual BasicProblem signature:
Problem Event Name:\tAPPCRASH
Application Name:\tvb6.exe
Application Version:\t6.0.81.76
Application Timestamp:\t3592011f
Fault Module Name:\tVBA6.dll
Fault Module Version:\t6.0.0.8169
Fault Module Timestamp:\t358b0c74
Exception Code:\tc0000027
Exception Offset:\t0017cb61
OS Version:\t6.1.7600.2.0.0.256.1
Locale ID:\t1049
Additional Information 1:\t84ee
Additional Information 2:\t84eeb8916e43c4d31bca2602858ebb12
Additional Information 3:\t758a
Additional Information 4:\t758a5b02d22b26008ceb531d98cca97f

Read our privacy statement online:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409

If the online privacy statement is not available, please read our privacy statement offline:
C:\\Windows\\system32\\en-US\\erofflps.txt
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36758939
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
h7h2vC,

/topic/703320&pg=-1#7805030
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36758982
h7h2vC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProОп, и еще одна проблемка возникла: если в режиме отладки возникает неперехватываемая ошибка - Debug не работает, видимо из-за того, что обработчик сообщений для главного окна программы уже испорчен, но сама прога на VB уже не выполняется.

Видимо, придется запретить перехват для MDI формы при работе из-под IDE.

По пердыдущему вопросу - UP!
Я скорее всего чего-то не понимаю, но вот несколько моментов:
1) Неперехватываемых ошибок при выгрузке формы никаких не возникает. Код отлажен, в скомпилированном модуле выход проходит нормально.
2) MDI форм в проекте нет
3) А все-таки что же делать?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36759034
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
h7h2vC,

Убедитесь, что при закрытии формы срабатывает ветка
Код: plaintext
1.
        Case WM_CLOSE
            RemoveProp hw, PROP_PREVPROC
дело где-то вокруг того, что не очищается оконный обработчик.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36759204
h7h2vC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, был неправ - на WinXP тоже вылетает, просто без ошибки - схлопывается и все.

В Case перед RemoveProp поставил MsgBox - сообщения при выходе не было.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36759254
h7h2vC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо MsgBox поставил App.LogEvent - сообщение в журнале не появилось..
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36759525
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
h7h2vC,

Значит именно в этом причина.
Попробуйте поставить remove насильно к примеру на Form_Unload.

А что такое "закрытие приложения из под IDE"? вы, часом, не на Stop жмете????
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36759550
h7h2vC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, поставил RemoveProp hWnd, "prevptr" в Form_Unload. Процедура отработала и все-равно после этого программа вылетела с ошибкой.

На Stop не жму, закрываю крестом или Alt+F4.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36759592
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот эта ветка отрабатывает?
Код: plaintext
1.
2.
3.
4.
5.
        Case WM_CLOSE
            RemoveProp hw, PROP_PREVPROC
            RemoveProp hw, PROP_GRIDPTR
            RemoveProp hw, PROP_DELTA
            SetWindowLong hw, GWL_WNDPROC, lPrevWndProc
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36759603
h7h2vC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, нет - не выполняется.

Я создал новый пустой проект с одним только гридом и он выгружается нормально - так что думаю мне нужно будет искать какие-то другие косяки в программе..
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36759620
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
h7h2vCShocker.Pro, нет - не выполняется.

Я создал новый пустой проект с одним только гридом и он выгружается нормально - так что думаю мне нужно будет искать какие-то другие косяки в программе..
remove должно сработать для всего, для чего был set, иначе IDE вылетает аварийно и правильно делает. Ищите косяки.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36760649
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрите может этот вариант подойдет , нашел в инете

Код: plaintext
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' модуль для прокручивания msflexgrid 
' Private Sub Form_Load()
' Hook Form & Control to be ignored
'  Call WheelHook(Me.hWnd)
'  Call WheelHook(Combo1.hWnd)
'  Combo1.Tag = "Hooked"
'  Call WheelHook(Text1.hWnd)
'Option Explicit
'Private Sub Form_Unload(Cancel As Integer)
'  Call WheelUnHook(Me.hWnd)
'  Call WheelUnHook(Combo1.hWnd)
'  Combo1.Tag = "UnHooked"
'  Call WheelUnHook(Text1.hWnd)
'End Sub
' Here you can add scrolling support to controls that don't normally respond
'Public Sub MouseWheel(ByVal MouseKeys As Long, ByVal Rotation As Long, ByVal Xpos As Long, ByVal Ypos As Long)
'  Dim ctl As Control
'
'  For Each ctl In Me.Controls
'    If TypeOf ctl Is MSFlexGrid Then
'      If IsOver(ctl.hWnd, Xpos, Ypos) Then FlexGridScroll ctl, MouseKeys, Rotation, Xpos, Ypos
'    End If
'  Next ctl
'End Sub



Private Declare Function GetProp Lib "user32.dll" Alias "GetPropA" ( _
                ByVal hWnd As Long, _
                ByVal lpString As String) As Long

Private Declare Function SetProp Lib "user32.dll" Alias "SetPropA" ( _
                ByVal hWnd As Long, _
                ByVal lpString As String, _
                ByVal hData As Long) As Long

Private Declare Function RemoveProp Lib "user32.dll" Alias "RemovePropA" ( _
                ByVal hWnd As Long, _
                ByVal lpString As String) As Long

Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" ( _
                ByVal lpPrevWndFunc As Long, _
                ByVal hWnd As Long, _
                ByVal Msg As Long, _
                ByVal wParam As Long, _
                ByVal lParam As Long) As Long

Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
                ByVal hWnd As Long, _
                ByVal nIndex As Long, _
                ByVal dwNewLong As Long) As Long

Private Declare Function GetWindowRect Lib "user32" ( _
                ByVal hWnd As Long, _
                lpRect As RECT) As Long
                
Private Declare Function GetParent Lib "user32" ( _
                ByVal hWnd As Long) As Long

Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
                ByVal hWnd As Long, _
                ByVal Msg As Long, _
                wParam As Any, _
                lParam As Any) As Long

Private Const GWL_WNDPROC = - 4 
Private Const WM_MOUSEWHEEL = &H20A
Private Const CB_GETDROPPEDSTATE = &H157

Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Private Function WindowProc(ByVal Lwnd As Long, ByVal Lmsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  Dim MouseKeys As Long
  Dim Rotation As Long
  Dim Xpos As Long
  Dim Ypos As Long
  Dim fFrm As Form

  Select Case Lmsg
  
    Case WM_MOUSEWHEEL
    
      MouseKeys = wParam And  65535 
      Rotation = wParam /  65536 
      Xpos = lParam And  65535 
      Ypos = lParam /  65536 
      
      Set fFrm = GetForm(Lwnd)
      If fFrm Is Nothing Then
        ' it's not a form
        If Not IsOver(Lwnd, Xpos, Ypos) And IsOver(GetParent(Lwnd), Xpos, Ypos) Then
          ' it's not over the control and is over the form,
          ' so fire mousewheel on form (if it's not a dropped down combo)
          If SendMessage(Lwnd, CB_GETDROPPEDSTATE,  0 &,  0 &) <>  1  Then
            GetForm(GetParent(Lwnd)).MouseWheel MouseKeys, Rotation, Xpos, Ypos
            Exit Function ' Discard scroll message to control
          End If
        End If
      Else
        ' it's a form so fire mousewheel
        If IsOver(fFrm.hWnd, Xpos, Ypos) Then fFrm.MouseWheel MouseKeys, Rotation, Xpos, Ypos
      End If
  End Select
  
  WindowProc = CallWindowProc(GetProp(Lwnd, "PrevWndProc"), Lwnd, Lmsg, wParam, lParam)
End Function

Public Sub WheelHook(ByVal hWnd As Long)
  On Error Resume Next
  SetProp hWnd, "PrevWndProc", SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub WheelUnHook(ByVal hWnd As Long)
  On Error Resume Next
  SetWindowLong hWnd, GWL_WNDPROC, GetProp(hWnd, "PrevWndProc")
  RemoveProp hWnd, "PrevWndProc"
End Sub

Public Sub FlexGridScroll(ByRef FG As MSFlexGrid, ByVal MouseKeys As Long, ByVal Rotation As Long, ByVal Xpos As Long, ByVal Ypos As Long)
  Dim NewValue As Long
  Dim Lstep As Single

  On Error Resume Next
  With FG
    Lstep = .Height / .RowHeight( 0 )
    Lstep = Int(Lstep)
    If .Rows < Lstep Then Exit Sub
    Do While Not (.RowIsVisible(.TopRow + Lstep))
      Lstep = Lstep -  1 
    Loop
    If Rotation >  0  Then
        NewValue = .TopRow - Lstep
        If NewValue <  1  Then
            NewValue =  1 
        End If
    Else
        NewValue = .TopRow + Lstep
        If NewValue > .Rows -  1  Then
            NewValue = .Rows -  1 
        End If
    End If
    .TopRow = NewValue
  End With
End Sub

Public Function IsOver(ByVal hWnd As Long, ByVal lX As Long, ByVal lY As Long) As Boolean
  Dim rectCtl As RECT
  GetWindowRect hWnd, rectCtl
  With rectCtl
    If lX >= .Left And lX <= .Right And lY >= .Top And lY <= .Bottom Then IsOver = True
  End With
End Function

Private Function GetForm(ByVal hWnd As Long) As Form
  For Each GetForm In Forms
    If GetForm.hWnd = hWnd Then Exit Function
  Next GetForm
  Set GetForm = Nothing
End Function

...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #37106635
`dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста как прикрутить к MS H Flexgrid.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #37106759
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно так же как к остальным. Мой код поддерживает MSHFlexgrid.
...
Рейтинг: 0 / 0
63 сообщений из 63, показаны все 3 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / И снова о скроллинге колесом мыши. MSFlexGrid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]