powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / DataGrid
4 сообщений из 29, страница 2 из 2
DataGrid
    #34563936
ЕленаMC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
Public Sub AddScroll(Grid As DataGrid)
Dim p As Long
    p = SetWindowLong(Grid.hwnd, GWL_WNDPROC, AddressOf WindowProc)
    SendMessage Grid.hwnd, WM_SETPREVPTR, p,  0 
    SendMessage Grid.hwnd, WM_SETGRID, ObjPtr(Grid),  0 
End Sub
на строке AddressOf WindowProc ругается... Invalid use addressOf operator
...
Рейтинг: 0 / 0
DataGrid
    #34563983
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Весь этот код должен находиться в модуле, а не форме.
...
Рейтинг: 0 / 0
DataGrid
    #34643496
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более универсальный способ обработки колеса.
Отличия от предыдущего:
- Поддержка колеса добавляется всем гридам на форме одним вызовом AddScroll2Grids Me и они друг другу не мешают.
- Сабклассинг снимается автоматически.
- Скролл работает не зависимо от того, где находится фокус.
- Скролл работает в том гриде, над которым находится курсор мыши, опять таки независимо от фокуса.

Код: 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.
Option Explicit

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 Type POINTAPI
    x As Long
    y As Long
End Type

Private Const WM_CLOSE = &H10
Private Const GWL_WNDPROC = - 4 

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, "prevptr") =  0  Then
        p = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf FrmProc)
        SetProp hwnd, "prevptr", p
    End If
    For Each Grid In Form.Controls
        If TypeOf Grid Is DataGrid Then
            p = SetWindowLong(Grid.hwnd, GWL_WNDPROC, AddressOf WindowProc)
            SetProp Grid.hwnd, "prevptr", p
            SetProp Grid.hwnd, "gridptr", ObjPtr(Grid)
        End If
    Next
End Sub

Private Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lpPrevWndProc As Long
Dim GridPtr As Long
Dim hwnd As Long
Dim pa As POINTAPI
Dim oList As Object
    lpPrevWndProc = GetProp(hw, "prevptr")
    If lpPrevWndProc =  0  Then Exit Function
    Select Case uMsg
        Case  522 
            GetCursorPos pa
            hwnd = WindowFromPoint(pa.x, pa.y)
            GridPtr = GetProp(hwnd, "gridptr")
            If GridPtr <>  0  Then
                Set oList = ObjFromPtr(GridPtr)
                If Abs(wParam) =  7864320  Then
                    oList.Scroll  0 , -(wParam / Abs(wParam))
                Else
                    oList.Scroll  0 , -(wParam / Abs(wParam)) *  10 
                End If
            End If
        Case WM_CLOSE
            RemoveProp hw, "prevptr"
            RemoveProp hw, "gridptr"
            SetWindowLong hw, GWL_WNDPROC, lpPrevWndProc
        Case Else
            WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
    End Select
End Function

Private Function FrmProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lpPrevWndProc As Long
Dim hwnd As Long
Dim pa As POINTAPI
    lpPrevWndProc = GetProp(hw, "prevptr")
    Select Case uMsg
        Case  522 
            GetCursorPos pa
            hwnd = WindowFromPoint(pa.x, pa.y)
            If GetProp(hwnd, "prevptr") <>  0  Then SendMessage hwnd, uMsg, wParam, lParam
        Case WM_CLOSE
            RemoveProp hw, "prevptr"
            SetWindowLong hw, GWL_WNDPROC, lpPrevWndProc
        Case Else
            FrmProc = CallWindowProc(lpPrevWndProc, 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
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
DataGrid
    #37179504
ChicH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, форумчане!

нужна помощь...
Есть форма с DataGrid, в которую подгружается бд аксеса:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim db As ADODB.Connection
  Set db = New ADODB.Connection
  db.CursorLocation = adUseClient
  db.Open "PROVIDER=Microsoft.Jet.OLEDB.3.51;Data Source=C:\KorrespBaseback.mdb;"
  Set adoPrimaryRS = New ADODB.Recordset
  adoPrimaryRS.Open "select EnterNum,EnterDate,OutName,OutDate,Korr,Soderg,Ispolnit,DatePered,Otmetka,Komment from Base", db, adOpenStatic, adLockOptimistic
  Set grdDataGrid.DataSource = adoPrimaryRS
  mbDataChanged = True
  Exit Sub
AddErr:
  MsgBox "Убедитесь, что база расположена на диске С:\", vbCritical, "База не найдена"
End Sub

и есть форма с текстбоксами и контролом Data в который так же подгружается бд аксеса по средствам: DatacaseName: C:\KorrespBaseback.mdb

вопрос такой:

Как связать эти 2-е формы, чтоб при выборе записи в форме с DataGrid форма с текстбоксами меняла значения на выбранные в таблице DataGrid..

буду рад любому ответу/комментарию...
заранее спасибо.
...
Рейтинг: 0 / 0
4 сообщений из 29, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / DataGrid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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