continued...
Function fnEditSubClass(ByVal hEdit As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Local hCell,hPane,hBase,hGrid As Dword
Local pGridData As GridData Ptr
Local Vtbl,dwPtr As Dword Ptr
Local iReturn,hr As Long
#If %Def(%DEBUG)
Print #fp, " Entering fnEditSubClass"
#EndIf
hCell=GetParent(hEdit) : hPane=GetParent(hCell)
hBase=GetParent(hPane) : hGrid=GetParent(hBase)
pGridData=GetWindowLong(hPane,0)
dwPtr=GetWindowLong(hGrid,4)
Vtbl=@dwPtr
Select Case As Long wMsg
Case %WM_CHAR
#If %Def(%DEBUG)
Print #fp, " Got WM_CHAR Message In fnEditSubClass!"
#EndIf
Call Dword @Vtbl[3] Using ptrKeyPress(dwPtr, wParam, lParam, @pGridData.iEditedCellRow, @pGridData.iEditedRow, @pGridData.iEditedCol) To hr
#If %Def(%DEBUG)
If SUCCEEDED(hr) Then
Print #fp, " Call Dword @Vtbl[3] Using ptrKeyPress() Succeeded!"
End If
#EndIf
If FAILED(hr) Then
Function=0 : Exit Function
End If
If wParam=%VK_RETURN Then
#If %Def(%DEBUG)
Print #fp, " Got WM_CHAR Message %VK_RETURN In fnEditSubClass!"
#EndIf
Call blnFlushEditControl(hGrid)
Call Refresh(hGrid)
#If %Def(%DEBUG)
Print #fp, " Leaving fnEditSubClass"
Print #fp,
#EndIf
Exit Function
Else
@pGridData.hEdit=hEdit
End If
Case %WM_KEYDOWN
#If %Def(%DEBUG)
Print #fp, " Got WM_KEYDOWN Message In fnEditSubClass!"
#EndIf
Call Dword @Vtbl[4] Using ptrKeyDown(dwPtr, wParam, lParam, @pGridData.iEditedCellRow, @pGridData.iEditedRow, @pGridData.iEditedCol) To hr
#If %Def(%DEBUG)
If SUCCEEDED(hr) Then
Print #fp, " Call Dword @Vtbl[4] Using ptrKeyDown() Succeeded!"
End If
#EndIf
If FAILED(hr) Then
Function=0 : Exit Function
End If
#If %Def(%DEBUG)
Print #fp, " iReturn = " iReturn
#EndIf
Case %WM_PASTE
#If %Def(%DEBUG)
Print #fp, " Got WM_PASTE Message In fnEditSubClass!"
#EndIf
Call Dword @Vtbl[7] Using ptrPaste(dwPtr, @pGridData.iEditedCellRow, @pGridData.iEditedRow, @pGridData.iEditedCol) To hr
#If %Def(%DEBUG)
If SUCCEEDED(hr) Then
Print #fp, " Call Dword @Vtbl[7] Using ptrPaste() Succeeded!"
End If
#EndIf
If FAILED(hr) Then
Function=0 : Exit Function
End If
Case %WM_LBUTTONDBLCLK
#If %Def(%DEBUG)
Print #fp, " Got %WM_LBUTTONDBLCLK Message In fnEditSubClass!"
#EndIf
Call Dword @Vtbl[6] Using ptrLButtonDblClk(dwPtr, @pGridData.iEditedCellRow, @pGridData.iEditedRow, @pGridData.iEditedCol) To hr
#If %Def(%DEBUG)
If SUCCEEDED(hr) Then
Print #fp, " Call Dword @Vtbl[6] Using ptrPaste() Succeeded!"
End If
#EndIf
End Select
#If %Def(%DEBUG)
Print #fp, " Leaving fnEditSubClass"
Print #fp,
#EndIf
Function=CallWindowProc(fnEditWndProc,hEdit,wMsg,wParam,lParam)
End Function
Function fnCellProc(ByVal hCell As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case As Long wMsg
Case %WM_CREATE
Call SetWindowLong(hCell,0,%NULL)
Function=0 : Exit Function
Case %WM_LBUTTONDOWN
Local iRange,iCellBufferPos,iGridMemOffset,iRow,iCol,hr As Long
Local hPane,hBase,hGrid As Dword
Local pGridData As GridData Ptr
Local Vtbl,dwPtr As Dword Ptr
Local si As SCROLLINFO
Local pZStr As ZStr Ptr
Register i As Long
Register j As Long
#If %Def(%DEBUG)
Print #fp, " Entering fnCellProc - Case WM_LBUTTONDOWN"
#EndIf
hPane=GetParent(hCell)
hBase=GetParent(hPane)
hGrid=GetParent(hBase)
pGridData=GetWindowLong(hPane,0)
Call blnFlushEditControl(hGrid)
si.cbSize = sizeof(SCROLLINFO)
si.fMask=%SIF_POS
Call GetScrollInfo(hGrid,%SB_VERT,si)
iRange=@pGridData.iCols
For i=1 To @pGridData.iVisibleRows
For j=1 To @pGridData.iCols
iCellBufferPos = dwIdx(i,j)
If @pGridData.@pCellHandles[iCellBufferPos]=hCell Then
iGridMemOffset=iRange*(si.nPos-1)+iCellBufferPos 'get rank of cell memory in
pZStr=@pGridData.@pGridMemory[iGridMemOffset]
iRow=i : iCol=j
Exit, Exit
End If
Next j
Next i
@pGridData.hEdit=CreateWindow _
( _
"edit", _
"", _
%WS_CHILD Or %WS_VISIBLE Or %ES_AUTOHSCROLL, _
1, _
0, _
@pGridData.@pColWidths[iCol-1]-2, _
@pGridData.iRowHeight, _
hCell, _
%IDC_EDIT, _
GetModuleHandle(Byval 0), _
ByVal 0 _
)
If @pGridData.hFont Then
Call SendMessage(@pGridData.hEdit,%WM_SETFONT,@pGridData.hFont,%TRUE)
End If
Call SetWindowText(@pGridData.hEdit,@pZStr)
fnEditWndProc=SetWindowLong(@pGridData.hEdit,%GWL_WNDPROC,CodePtr(fnEditSubClass))
@pGridData.iEditedCellRow=iRow 'This is the one based row number in the visible grig
@pGridData.iEditedRow=iRow+si.nPos-1 'This is the row in the buffer
@pGridData.iEditedCol=iCol
Call SetFocus(@pGridData.hEdit)
dwPtr=GetWindowLong(hGrid,4)
Vtbl=@dwPtr
Call Dword @Vtbl[5] Using ptrLButtonDown(dwPtr, @pGridData.iEditedCellRow, @pGridData.iEditedRow, @pGridData.iEditedCol) To hr
#If %Def(%DEBUG)
Print #fp, " hGrid = " hGrid
Print #fp, " dwPtr = " dwPtr
Print #fp, " Vtbl = " Vtbl
Print #fp, " Leaving fnCellProc - Case WM_LBUTTONDOWN" : Print #fp,
#EndIf
Function=0 : Exit Function
Case %WM_PAINT
Local hDC,hFont,hTmp As Dword
Local pBuffer As ZStr Ptr
Local ps As PAINTSTRUCT
hDC=BeginPaint(hCell,ps)
pBuffer=GetWindowLong(hCell,0)
hFont=GetWindowLong(hCell,4)
If hFont Then
hTmp=SelectObject(hDC,hFont)
End If
Call TextOut(hDC,1,0,@pBuffer,Len(@pBuffer))
If hFont Then
hFont=SelectObject(hDC,hTmp)
End If
Call EndPaint(hCell,ps)
Function=0 : Exit Function
End Select
fnCellProc=DefWindowProc(hCell, wMsg, wParam, lParam)
End Function
Function fnPaneProc(ByVal hPane As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Local si As SCROLLINFO
Register i As Long
Register j As Long
Select Case As Long wMsg
Case %WM_NOTIFY
Local pGridData As GridData Ptr
Local pNotify As HD_NOTIFY Ptr
Local iPos(),iWidth() As Long
Local index,iHt,iRange As Long
Local iCols As Dword
pNotify=lParam
pGridData=GetWindowLong(hPane,0)
Select Case As Long @pNotify.hdr.Code
Case %HDN_TRACK
#If %Def(%DEBUG)
Print #fp, " Entering fnPaneProc() - %HDN_TRACK Case"
#EndIf
If @pGridData.hEdit Then
Call blnFlushEditControl(@pGridData.hGrid)
Call Refresh(@pGridData.hGrid)
End If
If @pGridData.pColWidths Then
@pGridData.@pColWidths[@pNotify.iItem]=@pNotify.@pItem.cxy
End If
iCols=@pGridData.iCols
@pGridData.@pColWidths[iCols]=0
For i=0 To iCols-1
@pGridData.@pColWidths[iCols]=@pGridData.@pColWidths[iCols]+@pGridData.@pColWidths[i]
Next i
si.cbSize = sizeof(SCROLLINFO)
si.fMask = %SIF_RANGE Or %SIF_PAGE Or %SIF_DISABLENOSCROLL
si.nMin = 0 : si.nMax=@pGridData.@pColWidths[iCols]
si.nPage=@pGridData.cx-33
iRange=si.nMax-si.nMin
Call SetScrollInfo(@pGridData.hGrid,%SB_HORZ,si,%TRUE)
If iRange>si.nPage Then 'Original
Call SetWindowPos(@pGridData.hPane,%HWND_TOP,0,0,@pGridData.@pColWidths[iCols],@pGridData.cy,%SWP_NOMOVE Or %SWP_SHOWWINDOW)
Else
Call SetWindowPos(@pGridData.hPane,%HWND_TOP,0,0,@pGridData.@pColWidths[iCols],@pGridData.cy,%SWP_SHOWWINDOW)
End If
Call SetWindowPos(@pGridData.hHeader,%HWND_BOTTOM,0,0,@pGridData.@pColWidths[iCols],@pGridData.iRowHeight,%SWP_NOMOVE Or %SWP_SHOWWINDOW)
#If %Def(%DEBUG)
Print #fp, " si.nMin = " si.nMin
Print #fp, " si.nMax = " si.nMax
Print #fp, " si.nPage = " si.nPage
Print #fp, " @pGridData.@pColWidths[iCols] = " @pGridData.@pColWidths[iCols]
#EndIf
Redim iPos(iCols) As Long
For i=1 To iCols-1
iPos(i)=iPos(i-1)+@pGridData.@pColWidths[i-1]
Next i
If @pGridData.pCellHandles Then
For i=0 To @pGridData.iVisibleRows-1
For j=0 To iCols-1
index=iCols*i+j
iHt=@pGridData.iRowHeight
Call MoveWindow(@pGridData.@pCellHandles[index], iPos(j), iHt+(i*iHt), @pGridData.@pColWidths[j], iHt, %False)
Next j
Next i
Call InvalidateRect(@pGridData.hGrid,Byval %NULL,%TRUE)
End If
Erase iPos()
#If %Def(%DEBUG)
Print #fp, " Leaving fnPaneProc Case" : Print #fp,
#EndIf
Function=0
Exit Function
Case %HDN_ENDTRACK
#If %Def(%DEBUG)
Print #fp, " Entering fnPaneProc() - %END_TRACK Case"
#EndIf
Call InvalidateRect(@pGridData.hGrid,Byval 0,%TRUE)
#If %Def(%DEBUG)
Print #fp, " Leaving %END_TRACK Case"
#EndIf
Function=0 : Exit Function
End Select
Function=0 : Exit Function
End Select
fnPaneProc=DefWindowProc(hPane, wMsg, wParam, lParam)
End Function
Function fnBaseProc(ByVal hBase As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
fnBaseProc=DefWindowProc(hBase, wMsg, wParam, lParam)
End Function
Function fnGridProc_OnCreate(Wea As WndEventArgs) As Long
Local iFlds,iHdlCount,iCols,iCtr,iSize As Long
Local strParseData(),strFieldData() As BStr
Local pGridData1,pGridData2 As GridData Ptr
Local dwStyle,hButton,hCell,hDC As Dword
Local pCreateStruct As CREATESTRUCT Ptr
Local uCC As INIT_COMMON_CONTROLSEX
Local szText As ZStr*64
Local hdrItem As HDITEM
Local strSetup As BStr
Local iPos() As Long
Register i As Long
Register j As Long
Local rc As RECT
#If %Def(%DEBUG)
Print #fp, " Entering %WM_CREATE Case"
#EndIf
pCreateStruct=Wea.lParam
Wea.hInst=@pCreateStruct.hInstance
pGridData1=@pCreateStruct.lpCreateParams
strSetup=@pCreateStruct.@lpszName
Call GetClientRect(Wea.hWnd,rc)
#If %Def(%DEBUG)
Print #fp, " %WM_USER = " %WM_USER
Print #fp, " %WM_APP = " %WM_APP
Print #fp, " hGrid = " Wea.hWnd
Print #fp, " pGridData1 = " pGridData1
Print #fp, " Wea.hInstance = " Wea.hInst
Print #fp, " @pCreateStruct.cx = " @pCreateStruct.cx
Print #fp, " @pCreateStruct.cy = " @pCreateStruct.cy
Print #fp, " rc.Right = " rc.Right
Print #fp, " rc.Bottom = " rc.Bottom
Print #fp, " @pGridData1.iFontSize = " @pGridData1.iFontSize
Print #fp, " @pGridData1.iFontWeight = " @pGridData1.iFontWeight
Print #fp, " @pGridData1.szFontName = " @pGridData1.szFontName
Print #fp, " strSetup = " strSetup
#EndIf
uCC.dwSize = SizeOf(uCC)
uCC.dwICC = %ICC_LISTVIEW_CLASSES
Call InitCommonControlsEx(uCC)
iCols=ParseCount(strSetup,",")
#If %Def(%DEBUG)
Print #fp, " iCols = " iCols
Print #fp, " @pGridData1.iRows = " @pGridData1.iRows
Print #fp, " @pGridData1.iCols = " @pGridData1.iCols
Print #fp, " @pGridData1.iRowHeight = " @pGridData1.iRowHeight
#EndIf
If iCols<>@pGridData1.iCols Then
Function=-1 : Exit Function
End If
pGridData2=GlobalAlloc(%GPTR,sizeof(GridData))
If pGridData2=0 Then
Function=-1 : Exit Function
End If
Call SetWindowLong(Wea.hWnd,0,pGridData2)
@pGridData2.iCtrlID=@pCreateStruct.hMenu
@pGridData2.cx=@pCreateStruct.cx
@pGridData2.cy=@pCreateStruct.cy
@pGridData2.iCols=iCols
@pGridData2.iRows=@pGridData1.iRows
@pGridData2.iRowHeight=@pGridData1.iRowHeight
@pGridData2.iVisibleRows=Fix((rc.Bottom-@pGridData1.iRowHeight)/@pGridData1.iRowHeight)
@pGridData2.iPaneHeight=(@pGridData2.iVisibleRows+1)*@pGridData1.iRowHeight
@pGridData2.hGrid=Wea.hWnd
@pGridData2.hParent=GetParent(Wea.hWnd)
@pGridData1.iVisibleRows=@pGridData2.iVisibleRows
#If %Def(%DEBUG)
Print #fp, " pGridData2 = " pGridData2
Print #fp, " @pGridData2.hParent = " @pGridData2.hParent
Print #fp, " @pGridData2.iCtrlID = " @pGridData2.iCtrlID
Print #fp, " @pGridData2.iPaneHeight = " @pGridData2.iPaneHeight
Print #fp, " @pCreateStruct.cy = " @pCreateStruct.cy
Print #fp, " @pGridData1.iRowHeight = " @pGridData1.iRowHeight
Print #fp, " @pGridData2.iVisibleRows = " @pGridData2.iVisibleRows
Print #fp, " @pGridData2.iRows = " @pGridData2.iRows
#EndIf
Redim strParseData(iCols) As BStr
Parse strSetup,strParseData(),","
@pGridData2.pColWidths=GlobalAlloc(%GPTR,(iCols+1)*%SIZEOF_PTR)
If @pGridData2.pColWidths=0 Then
Call GlobalFree(pGridData2)
Function=-1 : Exit Function
End If
#If %Def(%DEBUG)
Print #fp, " @pGridData2.pColWidths = " @pGridData2.pColWidths
Print #fp,
Print #fp, " i strParseData(i) "
Print #fp, " ============================="
For i=0 To iCols-1
Print #fp, " " i, strParseData(i)
Next i
Print #fp,
#EndIf
@pGridData2.hBase=CreateWindowEx(0,"Base","",%WS_CHILD Or %WS_VISIBLE,0,0,0,0,Wea.hWnd,1499,Wea.hInst,Byval 0)
dwStyle=%WS_CHILD Or %WS_BORDER Or %WS_VISIBLE Or %HDS_HOTTRACK Or %HDS_HORZ
@pGridData2.hPane=CreateWindowEx(0,"Pane","",%WS_CHILD Or %WS_VISIBLE,0,0,0,0,@pGridData2.hBase,%ID_PANE,Wea.hInst,Byval 0) 'Create Pane
@pGridData2.hHeader=CreateWindowEx(0,WC_HEADER,"",dwStyle,0,0,0,0,@pGridData2.hPane,%ID_HEADER,Wea.hInst,Byval 0) 'Create Header Control
Call SetWindowLong(@pGridData2.hPane,0,pGridData2)
#If %Def(%DEBUG)
Print #fp, " @pGridData2.hBase = " @pGridData2.hBase
Print #fp, " @pGridData2.hPane = " @pGridData2.hPane
Print #fp, " @pGridData2.hHeader = " @pGridData2.hHeader
Print #fp,
Print #fp, " i @pColWidths[i] iPos(i) szText"
Print #fp, " =================================================="
#EndIf
hdrItem.mask=%HDI_FORMAT Or %HDI_WIDTH Or %HDI_TEXT
Redim iPos(iCols) As Long
For i=0 To iCols-1
iFlds=ParseCount(strParseData(i),":")
Redim strFieldData(iFlds-1)
Parse strParseData(i), strFieldData(), ":"
@pGridData2.@pColWidths[i]=Val(strFieldData(0))
@pGridData2.@pColWidths[iCols]=@pGridData2.@pColWidths[iCols]+@pGridData2.@pColWidths[i]
hdrItem.cxy=@pGridData2.@pColWidths[i]
szText=strFieldData(1)
hdrItem.pszText=Varptr(szText) : hdrItem.cchTextMax=Len(szText)
hdrItem.fmt=%HDF_STRING Or %HDF_CENTER
'Call Header_InsertItem(@pGridData2.hHeader,i,Varptr(hdrItem))
Call Header_InsertItem(@pGridData2.hHeader,i,hdrItem)
If i Then
iPos(i)=iPos(i-1)+@pGridData2.@pColWidths[i-1]
End If
#If %Def(%DEBUG)
Print #fp, " " i, @pGridData2.@pColWidths[i], iPos(i), szText
#EndIf
Erase strFieldData()
Next i
#If %Def(%DEBUG)
Print #fp,
Print #fp, " @pGridData2.@pColWidths[iCols] = " @pGridData2.@pColWidths[iCols]
Print #fp,
#EndIf
Call MoveWindow(@pGridData2.hBase,12,0,rc.right-12,@pGridData2.iPaneHeight,%FALSE)
Call MoveWindow(@pGridData2.hPane,0,0,@pGridData2.@pColWidths[iCols],@pGridData2.iPaneHeight,%FALSE) 'Size Pane
Call MoveWindow(@pGridData2.hHeader,0,0,@pGridData2.@pColWidths[iCols],@pGridData2.iRowHeight,%TRUE) 'Size Header
'Make Verticle Buttons
@pGridData2.pVButtons=GlobalAlloc(%GPTR,(@pGridData2.iVisibleRows+1)*%SIZEOF_PTR)
#If %Def(%DEBUG)
Print #fp, " @pGridData2.pVButtons = " @pGridData2.pVButtons
Print #fp,
Print #fp, " i @pGridData2.@pVButtons[i] "
Print #fp, " ====================================="
#EndIf
If @pGridData2.pVButtons Then
For i=0 To @pGridData2.iVisibleRows
@pGridData2.@pVButtons[i]=CreateWindow("button","",%WS_CHILD Or %WS_VISIBLE Or %BS_FLAT,0,@pGridData2.iRowHeight*i,12,@pGridData2.iRowHeight,Wea.hWnd,20000+i,Wea.hInst,Byval 0)
#If %Def(%DEBUG)
Print #fp, " " i, @pGridData2.@pVButtons[i]
#EndIf
Next i
Else
Call GlobalFree(@pGridData2.pColWidths)
Call GlobalFree(pGridData2)
Function=-1 : Exit Function
End If
'Try To Create Font ' ANSI_CHARSET '%OEM_CHARSET
#If %Def(%DEBUG)
Print #fp,
Print #fp, " Now Gonna Try To Create Font..."
Print #fp, " @pGridData1.szFontName = " @pGridData1.szFontName
#EndIf
If @pGridData1.szFontName<>"" Then
hDC=GetDC(Wea.hWnd)
@pGridData2.hFont=CreateFont _
( _
-1*(@pGridData1.iFontSize*GetDeviceCaps(hDC,%LOGPIXELSY))/72, _
0, _
0, _
0, _
@pGridData1.iFontWeight, _
0, _
0, _
0, _
%ANSI_CHARSET, _
0, _
0, _
%DEFAULT_QUALITY, _
0, _
@pGridData1.szFontName _
)
Call ReleaseDC(Wea.hWnd,hDC)
End If
#If %Def(%DEBUG)
Print #fp, " @pGridData2.hFont = " @pGridData2.hFont
#EndIf
'Try To Make Cells
iHdlCount=@pGridData2.iCols*@pGridData2.iVisibleRows
@pGridData2.pCellHandles=GlobalAlloc(%GPTR, iHdlCount * %SIZEOF_HANDLE)
If @pGridData2.pCellHandles Then
dwStyle=%WS_CHILD Or %WS_VISIBLE Or %WS_BORDER
#If %Def(%DEBUG)
Print #fp,
Print #fp, " i j iPos(j) yLoc hCell"
Print #fp, " ============================================================="
#EndIf
For i=0 To @pGridData2.iVisibleRows-1
For j=0 To @pGridData2.iCols-1
hCell=CreateWindowEx _
( _
0, _
"Cell", _
"", _
dwStyle, _
iPos(j), _
@pGridData2.iRowHeight+(i*@pGridData2.iRowHeight), _
@pGridData2.@pColWidths[j], _
@pGridData2.iRowHeight, _
@pGridData2.hPane, _
%ID_CELL+iCtr, _
Wea.hInst, _
Byval 0 _
)
@pGridData2.@pCellHandles[iCtr]=hCell
Call SetWindowLong(hCell,4,@pGridData2.hFont)
#If %Def(%DEBUG)
Print #fp, " " i, j, iPos(j), @pGridData2.iRowHeight+(i*@pGridData2.iRowHeight), hCell
#EndIf
Incr iCtr
Next j
Next i
'Create Grid Memory
iSize=@pGridData2.iCols * @pGridData2.iRows
#If %Def(%DEBUG)
Print #fp,
Print #fp, " Now Will Try To Create Grid Row Memory!"
Print #fp,
Print #fp, " iSize = " iSize
#EndIf
@pGridData2.pGridMemory=GlobalAlloc(%GPTR,iSize*%SIZEOF_PTR)
#If %Def(%DEBUG)
Print #fp, " @pGridData2.pGridMemory = " @pGridData2.pGridMemory
#EndIf
Else
Erase strParseData()
Erase iPos()
Call GlobalFree(@pGridData2.pColWidths)
Call GlobalFree(pGridData2)
Function=-1 : Exit Function
End If
Erase strParseData()
Erase iPos()
#If %Def(%DEBUG)
Print #fp,
Print #fp, " Leaving %WM_CREATE Case" : Print #fp,
#EndIf
Function=0
End Function
Function fnGridProc_OnSize(Wea As WndEventArgs) As Long
Local pGridData As GridData Ptr
Local si As SCROLLINFO
Local iCols As Long
#If %Def(%DEBUG)
Print #fp,
Print #fp, " Entering %WM_SIZE Case"
#EndIf
pGridData=GetWindowLong(Wea.hWnd,0)
iCols=@pGridData.iCols
'Set Up Horizontal Scrollbar
si.cbSize=Sizeof(SCROLLINFO)
si.fMask=%SIF_RANGE Or %SIF_PAGE Or %SIF_POS
si.nMin=0
si.nMax=@pGridData.@pColWidths[iCols]
si.nPage=@pGridData.cx-33 '33 is the width of vert
si.nPos=0 'btns + width scroll bar + window edge
Call SetScrollInfo(Wea.hWnd,%SB_HORZ,si,%TRUE)
#If %Def(%DEBUG)
Print #fp, " Horizontal Scrollbar...."
Print #fp, " si.nMin = " si.nMin
Print #fp, " si.nMax = " si.nMax
Print #fp, " si.nPos = " si.nPos
Print #fp,
#EndIf
'Set Up Verticle Scrollbar
si.cbSize=Sizeof(SCROLLINFO)
si.fMask=%SIF_RANGE Or %SIF_PAGE Or %SIF_POS
si.nMin=1
si.nMax=@pGridData.iRows
si.nPage=@pGridData.iVisibleRows
si.nPos=1
Call SetScrollInfo(Wea.hWnd,%SB_VERT,si,%TRUE)
#If %Def(%DEBUG)
Print #fp,
Print #fp, " Verticle Scrollbar...."
Print #fp, " si.nMin = " si.nMin
Print #fp, " si.nMax = " si.nMax
Print #fp, " si.nPos = " si.nPos
Print #fp, " Leaving %WM_SIZE Case" : Print #fp,
#EndIf
fnGridProc_OnSize=0
End Function
Function fnGridProc_OnHScroll(Wea As WndEventArgs) As Long
Local pGridData As GridData Ptr
Local iCols,iScrollPos As Long
Local si As SCROLLINFO
#If %Def(%DEBUG)
Print #fp,
Print #fp, " Entering %WM_HSCROLL Case"
#EndIf
pGridData=GetWindowLong(Wea.hWnd,0)
iCols=@pGridData.iCols
si.cbSize = sizeof(SCROLLINFO) : si.fMask=%SIF_ALL
Call GetScrollInfo(@pGridData.hGrid,%SB_HORZ,si)
iScrollPos=si.nPos
#If %Def(%DEBUG)
Print #fp, " Before Adjustments"
Print #fp, " si.nMin = " si.nMin
Print #fp, " si.nMax = " si.nMax
Print #fp, " si.nPos = " si.nPos
Print #fp,
#EndIf
Select Case As Long Lowrd(Wea.wParam)
Case %SB_LINELEFT
#If %Def(%DEBUG)
Print #fp, " Got In %SB_LINELEFT"
#EndIf
If si.nPos > si.nMin Then
si.nPos=si.nPos-50
End If
Case %SB_PAGELEFT
si.nPos = si.nPos - si.nPage
Case %SB_LINERIGHT
#If %Def(%DEBUG)
Print #fp, " Got In %SB_LINERIGHT"
#EndIf
If si.nPos<si.nMax Then
si.nPos=si.nPos+50
End If
Case %SB_PAGERIGHT
si.nPos = si.nPos + si.nPage
Case %SB_THUMBTRACK
si.nPos=si.nTrackPos
End Select
si.fMask=%SIF_POS
Call SetScrollInfo(@pGridData.hGrid,%SB_HORZ,si,%TRUE)
Call GetScrollInfo(@pGridData.hGrid,%SB_HORZ,si)
If iScrollPos<>si.nPos Then 'Original
If si.nPos=0 Then
Call SetWindowPos(@pGridData.hPane,%HWND_TOP,0,0,@pGridData.@pColWidths[iCols],@pGridData.iPaneHeight,%SWP_SHOWWINDOW)
Else
Call SetWindowPos(@pGridData.hPane,%HWND_TOP,-si.nPos,0,@pGridData.@pColWidths[iCols],@pGridData.iPaneHeight,%SWP_SHOWWINDOW)
End If
End If
#If %Def(%DEBUG)
Print #fp, " After All Adjustments"
Print #fp, " si.nMin = " si.nMin
Print #fp, " si.nMax = " si.nMax
Print #fp, " si.nPos = " si.nPos
Print #fp, " Leaving %WM_HSCROLL Case"
#EndIf
fnGridProc_OnHScroll=0
End Function
Function fnGridProc_OnVScroll(Wea As WndEventArgs) As Long
Local pGridData As GridData Ptr
Local iScrollPos As Long
Local si As SCROLLINFO
Local hCell As Dword
Register i As Long
#If %Def(%DEBUG)
Print #fp,
Print #fp, " Entering %WM_VSCROLL Case"
#EndIf
pGridData=GetWindowLong(Wea.hWnd,0)
Call blnFlushEditControl(@pGridData.hGrid)
si.cbSize = sizeof(SCROLLINFO) : si.fMask=%SIF_ALL
Call GetScrollInfo(@pGridData.hGrid,%SB_VERT,si)
iScrollPos=si.nPos
#If %Def(%DEBUG)
Print #fp, " Before Adjustments"
Print #fp, " si.nMin = " si.nMin
Print #fp, " si.nMax = " si.nMax
Print #fp, " si.nPos = " si.nPos
Print #fp,
#EndIf
Select Case As Long Lowrd(Wea.wParam)
Case %SB_LINEUP
#If %Def(%DEBUG)
Print #fp, " Got In %SB_LINEUP"
#EndIf
If si.nPos > si.nMin Then
si.nPos=si.nPos-1
End If
Case %SB_PAGEUP
si.nPos = si.nPos - si.nPage
Case %SB_LINEDOWN
#If %Def(%DEBUG)
Print #fp, " Got In %SB_LINEDOWN"
#EndIf
If si.nPos<si.nMax Then
si.nPos=si.nPos+1
End If
Case %SB_PAGEDOWN
si.nPos = si.nPos + si.nPage
Case %SB_THUMBTRACK
si.nPos=si.nTrackPos
End Select
si.fMask=%SIF_POS
Call SetScrollInfo(@pGridData.hGrid,%SB_VERT,si,%TRUE)
Call GetScrollInfo(@pGridData.hGrid,%SB_VERT,si)
If iScrollPos<>si.nPos Then
Local iNum,iLast,iRange As Long
iNum=@pGridData.iCols*(si.nPos-1)
iRange=@pGridData.iCols
iLast=(iRange * @pGridData.iVisibleRows) - 1
For i=0 To iLast
hCell=@pGridData.@pCellHandles[i]
Call SetWindowLong(hCell,0,@pGridData.@pGridMemory[iNum])
Incr iNum
Next i
End If
Call InvalidateRect(@pGridData.hGrid,Byval %NULL,%TRUE)
#If %Def(%DEBUG)
Print #fp, " After All Adjustments"
Print #fp, " si.nMin = " si.nMin
Print #fp, " si.nMax = " si.nMax
Print #fp, " si.nPos = " si.nPos
Print #fp, " Leaving %WM_VSCROLL Case"
#EndIf
fnGridProc_OnVScroll=0
End Function
Function fnGridProc_OnCommand(Wea As WndEventArgs) As Long 'from other code
Local iCellRow,iGridRow,hr As Long
Local pGridData As GridData Ptr
Local Vtbl,dwPtr As Dword Ptr
Local si As SCROLLINFO
#If %Def(%DEBUG)
Print #fp,
Print #fp, " Entering fnGridProc_OnCommand()"
Print #fp, " Lowrd(Wea.wParam) = " Lowrd(Wea.wParam)
#EndIf
If Lowrd(Wea.wParam)>20000 Then
pGridData=GetWindowLong(Wea.hWnd,0)
Call blnFlushEditControl(@pGridData.hGrid)
si.cbSize = sizeof(SCROLLINFO)
si.fMask=%SIF_POS
Call GetScrollInfo(@pGridData.hGrid,%SB_VERT,si)
iCellRow=Lowrd(Wea.wParam)-20000 : iGridRow=si.nPos+iCellRow-1
dwPtr=GetWindowLong(Wea.hWnd,4)
Vtbl=@dwPtr
Call Dword @Vtbl[8] Using ptrVButtonClick(dwPtr, iCellRow, iGridRow) To hr
#If %Def(%DEBUG)
If SUCCEEDED(hr) Then
Print #fp, " Call Dword @Vtbl[8] Using ptrVButtonClick() Succeeded!"
End If
#EndIf
End If
#If %Def(%DEBUG)
Print #fp, " Leaving fnGridProc_OnCommand()"
Print #fp,
#EndIf
Function=0
End Function
Function fnGridProc_OnDestroy(Wea As WndEventArgs) As Long
Local pGridData As GridData Ptr
Local blnFree,iCtr As Long
Local pMem As ZStr Ptr
Register i As Long
Register j As Long
#If %Def(%DEBUG)
Print #fp,
Print #fp, " Entering fnGridProc_OnDestroy()"
#EndIf
pGridData=GetWindowLong(Wea.hWnd,0)
If pGridData Then
#If %Def(%DEBUG)
Print #fp, " @pGridData.iCols = " @pGridData.iCols
Print #fp, " @pGridData.iRows = " @pGridData.iRows
Print #fp, " @pGridData.pColWidths = " @pGridData.pColWidths
#EndIf
blnFree=GlobalFree(@pGridData.pColWidths)
#If %Def(%DEBUG)
Print #fp, " blnFree(pColWidths) = " blnFree
#EndIf
If @pGridData.hFont Then
blnFree=DeleteObject(@pGridData.hFont)
#If %Def(%DEBUG)
Print #fp, " blnFree(hFont) = " blnFree
#EndIf
End If
'Grid Row Memory
#If %Def(%DEBUG)
Print #fp,
Print #fp, " i j iCtr strCoordinate pMem"
Print #fp, " ============================================================================"
#EndIf
iCtr=0
For i=1 To @pGridData.iRows
For j=1 To @pGridData.iCols
pMem=@pGridData.@pGridMemory[iCtr]
#If %Def(%DEBUG)
Print #fp, " " i,j,iCtr,@pMem Tab(72) pMem
#EndIf
Incr iCtr
Next j
Next i
#If %Def(%DEBUG)
Print #fp,
Print #fp,
Print #fp, " i j iCtr blnFree"
Print #fp, " ==========================================="
#EndIf
iCtr=0
For i=1 To @pGridData.iRows
For j=1 To @pGridData.iCols
pMem=@pGridData.@pGridMemory[iCtr]
If pMem Then
blnFree=GlobalFree(pMem)
#If %Def(%DEBUG)
Print #fp, " " i,j,iCtr,blnFree
#EndIf
End If
Incr iCtr
Next j
Next i
blnFree=GlobalFree(@pGridData.pGridMemory)
#If %Def(%DEBUG)
Print #fp,
Print #fp, " blnFree(@pGridData.pGridMemory) = " blnFree
#EndIf
blnFree = GlobalFree(pGridData)
#If %Def(%DEBUG)
Print #fp, " blnFree = " blnFree
#EndIf
End If
#If %Def(%DEBUG)
Print #fp, " Leaving fnGridProc_OnDestroy()"
#EndIf
Function=0
End Function
Function fnGridProc(ByVal hWnd As Long,ByVal wMsg As Long,ByVal wParam As Long,ByVal lParam As Long) As Long
Local wea As WndEventArgs
Register iReturn As Long
Register i As Long
For i=0 To 5
If wMsg=MsgHdlr(i).wMessage Then
wea.hWnd=hWnd: wea.wParam=wParam: wea.lParam=lParam
Call Dword MsgHdlr(i).dwFnPtr Using FnPtr(wea) To iReturn
fnGridProc=iReturn
Exit Function
End If
Next i
fnGridProc=DefWindowProc(hWnd,wMsg,wParam,lParam)
End Function
Sub AttachMessageHandlers()
ReDim MsgHdlr(5) As MessageHandler 'Associate Windows Message With Message Handlers
MsgHdlr(3).wMessage=%WM_CREATE : MsgHdlr(3).dwFnPtr=CodePtr(fnGridProc_OnCreate)
MsgHdlr(2).wMessage=%WM_SIZE : MsgHdlr(2).dwFnPtr=CodePtr(fnGridProc_OnSize)
MsgHdlr(1).wMessage=%WM_HSCROLL : MsgHdlr(1).dwFnPtr=CodePtr(fnGridProc_OnHScroll)
MsgHdlr(0).wMessage=%WM_VSCROLL : MsgHdlr(0).dwFnPtr=CodePtr(fnGridProc_OnVScroll)
MsgHdlr(5).wMessage=%WM_COMMAND : MsgHdlr(5).dwFnPtr=CodePtr(fnGridProc_OnCommand)
MsgHdlr(4).wMessage=%WM_DESTROY : MsgHdlr(4).dwFnPtr=CodePtr(fnGridProc_OnDestroy)
End Sub
Function IConnectionPointContainer_QueryInterface(ByVal this As IConnectionPointContainer1 Ptr, ByRef iid As Guid, ByVal ppv As Dword Ptr) As Long
#If %Def(%DEBUG)
Prnt " Entering IConnectionPointContainer_QueryInterface()"
#EndIf
@ppv=%NULL
Select Case iid
Case $IID_IUnknown
#If %Def(%DEBUG)
Prnt " Looking For IID_IUnknown"
#EndIf
Decr this : @ppv=this
Call IGrid_AddRef(this)
#If %Def(%DEBUG)
Prnt " Leaving IConnectionPointContainer_QueryInterface()"
#EndIf
Function=%S_OK : Exit Function
Case $IID_IFHGrid
#If %Def(%DEBUG)
Prnt " Looking For IID_IFJHGrid"
#EndIf
Decr this : @ppv=this
Call IGrid_AddRef(this)
#If %Def(%DEBUG)
Prnt " Leaving IConnectionPointContainer_QueryInterface()"
#EndIf
Function=%S_OK : Exit Function
Case $IID_IConnectionPointContainer
#If %Def(%DEBUG)
Prnt " Looking For IID_IConnectionPointContainer"
#EndIf
Call IConnectionPointContainer_AddRef(this)
#If %Def(%DEBUG)
Prnt " Leaving IConnectionPointContainer_QueryInterface()"
#EndIf
@ppv=this : Function=%S_OK : Exit Function
Case $IID_IConnectionPoint
#If %Def(%DEBUG)
Prnt " Looking For IID_IConnectionPoint"
#EndIf
Incr this : @ppv=this
Call IConnectionPoint_AddRef(this)
#If %Def(%DEBUG)
Prnt " Leaving IConnectionPointContainer_QueryInterface()"
#EndIf
Function=%S_OK : Exit Function
Case Else
#If %Def(%DEBUG)
Prnt " Looking For Something I Ain't Got!"
Prnt " Leaving IConnectionPointContainer_QueryInterface()"
#EndIf
End Select
Function=%E_NOINTERFACE
End Function
Function IConnectionPointContainer_AddRef(ByVal this As IConnectionPointContainer1 Ptr) As Long
Local pGrid As CGrid Ptr
#If %Def(%DEBUG)
Prnt " Entering IConnectionPointContainer_AddRef()"
#EndIf
Decr this
pGrid=this
#If %Def(%DEBUG)
Prnt " @pGrid.m_cRef = " & Str$(@pGrid.m_cRef) & " << Before"
#EndIf
Incr @pGrid.m_cRef
#If %Def(%DEBUG)
Prnt " @pGrid.m_cRef = " & Str$(@pGrid.m_cRef) & " << After"
Prnt " Leaving IConnectionPointContainer_AddRef()"
#EndIf
Function=@pGrid.m_cRef
End Function
Function IConnectionPointContainer_Release(ByVal this As IConnectionPointContainer1 Ptr) As Long
Local pGrid As CGrid Ptr
#If %Def(%DEBUG)
Prnt " Entering IConnectionPointContainer_Release()"
#EndIf
Decr this : pGrid=this
#If %Def(%DEBUG)
Prnt " @pGrid.m_cRef = " & Str$(@pGrid.m_cRef) & " << Before"
#EndIf
Decr @pGrid.m_cRef
If @pGrid.m_cRef=0 Then
Call DestroyWindow(@pGrid.hWndCtrl)
#If %Def(%DEBUG)
Prnt " @pGrid.m_cRef = 0 And Will Now Delete pGrid!"
#EndIf
Call CoTaskMemFree(this)
Call InterlockedDecrement(g_lObjs)
Function=0
Else
#If %Def(%DEBUG)
Prnt " @pGrid.m_cRef = " & Str$(@pGrid.m_cRef) & " << After"
#EndIf
Function=@pGrid.m_cRef
End If
#If %Def(%DEBUG)
Prnt " Leaving IConnectionPointContainer_Release()"
#EndIf
End Function
Function IConnectionPointContainer_EnumConnectionPoints(ByVal this As Dword, Byval ppEnum As Dword) As Long
Function=%E_NOTIMPL
End Function
Function IConnectionPointContainer_FindConnectionPoint(ByVal this As IConnectionPointContainer1 Ptr, ByRef iid As Guid, ByVal ppCP As Dword Ptr) As Long
Local hr As Long
#If %Def(%DEBUG)
Prnt " Entering IConnectionPointContainer_FindConnectionPoint()"
#EndIf
If iid=$IID_IFHGrid_Events Then
#If %Def(%DEBUG)
Prnt " this = " & Str$(this)
Prnt " @ppCP = " & Str$(@ppCP)
#EndIf
hr=IConnectionPointContainer_QueryInterface(this, $IID_IConnectionPoint, ppCP)
#If %Def(%DEBUG)
Prnt " @ppCP = " & Str$(@ppCP)
Prnt " Leaving IConnectionPointContainer_FindConnectionPoint()" : Prnt ""
#EndIf
Function=hr : Exit Function
End If
Function=%E_NOINTERFACE
End Function
Function IConnectionPoint_QueryInterface(ByVal this As IConnectionPoint1 Ptr, ByRef iid As Guid, ByVal ppv As Dword Ptr) As Long
#If %Def(%DEBUG)
Prnt " Entering IConnectionPoint_QueryInterface()"
#EndIf
@ppv=%NULL
Select Case iid
Case $IID_IUnknown
Decr this : Decr this
@ppv=this
Call IGrid_AddRef(this)
Function=%S_OK : Exit Function
Case $IID_IFHGrid
Decr this : Decr this
@ppv=this
Call IGrid_AddRef(this)
Function=%S_OK : Exit Function
Case $IID_IConnectionPointContainer
Decr this
@ppv=this
Call IConnectionPointContainer_AddRef(this)
Function=%S_OK : Exit Function
Case $IID_IConnectionPoint
@ppv=this
Call IConnectionPoint_AddRef(this)
Function=%S_OK : Exit Function
Case Else
#If %Def(%DEBUG)
Prnt " Looking For Something I Ain't Got!"
Prnt " Leaving IConnectionPoint_QueryInterface()"
#EndIf
End Select
Function=%E_NOINTERFACE
End Function
Function IConnectionPoint_AddRef(ByVal this As IConnectionPoint1 Ptr) As Long
Local pGrid As CGrid Ptr
#If %Def(%DEBUG)
Prnt " Entering IConnectionPoint_AddRef()"
#EndIf
Decr this : Decr this
pGrid=this
#If %Def(%DEBUG)
Prnt " @pGrid.m_cRef = " & Str$(@pGrid.m_cRef) & " << Before"
#EndIf
Incr @pGrid.m_cRef
#If %Def(%DEBUG)
Prnt " @pGrid.m_cRef = " & Str$(@pGrid.m_cRef) & " << After"
Prnt " Leaving IConnectionPoint_AddRef()"
#EndIf
Function=@pGrid.m_cRef
End Function
Function IConnectionPoint_Release(ByVal this As IConnectionPoint1 Ptr) As Long
Local pGrid As CGrid Ptr
#If %Def(%DEBUG)
Prnt " Entering IConnectionPoint_Release()"
#EndIf
Decr this : Decr this
pGrid=this
#If %Def(%DEBUG)
Prnt " @pGrid.m_cRef = " & Str$(@pGrid.m_cRef) & " << Before"
#EndIf
Decr @pGrid.m_cRef
If @pGrid.m_cRef=0 Then
Call DestroyWindow(@pGrid.hWndCtrl)
#If %Def(%DEBUG)
Prnt " @pGrid.m_cRef = 0 And Will Now Delete pGrid!"
#EndIf
Call CoTaskMemFree(this)
Call InterlockedDecrement(g_lObjs)
#If %Def(%DEBUG)
Prnt " Leaving IConnectionPoint_Release()"
#EndIf
Function=0
Else
#If %Def(%DEBUG)
Prnt " @pGrid.m_cRef = " & Str$(@pGrid.m_cRef) & " << After"
Prnt " Leaving IConnectionPoint_Release()"
#EndIf
Function=@pGrid.m_cRef
End If
End Function
Function IConnectionPoint_GetConnectionInterface(Byval this As Dword, Byref iid As Dword) As Long
Function=%E_NOTIMPL
End Function
Function IConnectionPoint_GetConnectionPointContainer(Byval this As Dword, Byval ppCPC As Dword) As Long
Function=%E_NOTIMPL
End Function
Function IConnectionPoint_Advise(Byval this As IConnectionPoint1 Ptr, Byval pUnkSink As Dword Ptr, Byval pdwCookie As Dword Ptr) As Long
Local Vtbl,dwPtr As Dword Ptr
Local pGrid As CGrid Ptr
Local hr As Long
#If %Def(%DEBUG)
Prnt " Entering IConnectionPoint_Advise()! Grab Your Hardhat And Hang On Tight!"
Prnt " this = " & Str$(this)
#EndIf
Decr this : Decr this
pGrid=this
#If %Def(%DEBUG)
Prnt " pGrid = " & Str$(pGrid)
Prnt " @pGrid.hControl = " & Str$(@pGrid.hWndCtrl)
Prnt " pUnkSink = " & Str$(pUnkSink)
Prnt " @pUnkSink = " & Str$(@pUnkSink)
#EndIf
Vtbl=@pUnkSink
#If %Def(%DEBUG)
Prnt " Vtbl = " & Str$(Vtbl)
Prnt " @Vtbl[0] = " & Str$(@Vtbl[0])
#EndIf
Call Dword @Vtbl[0] Using ptrQueryInterface(pUnkSink,$IID_IFHGrid_Events,Varptr(dwPtr)) To hr
#If %Def(%DEBUG)
Prnt " dwPtr = " & Str$(dwPtr)
#EndIf
Call SetWindowLong(@pGrid.hWndCtrl,4,dwPtr)
If SUCCEEDED(hr) Then
#If %Def(%DEBUG)
Prnt " Call Dword Succeeded!"
#EndIf
@pdwCookie=1
Else
@pdwCookie=0
End If
#If %Def(%DEBUG)
Prnt " Leaving IConnectionPoint_Advise() And Still In One Piece!" : Prnt ""
#EndIf
Function=hr
End Function
Function IConnectionPoint_Unadvise(Byval this As IConnectionPoint1 Ptr, Byval dwCookie As Dword) As Long
Local Vtbl,dwPtr As Dword Ptr
Local pGrid As CGrid Ptr
Local iReturn As Long
#If %Def(%DEBUG)
Prnt " Entering IConnectionPoint_Unadvise()"
Prnt " this = " & Str$(this)
#EndIf
Decr this : Decr this
pGrid=this
#If %Def(%DEBUG)
Prnt " @pGrid.hWndCtrl = " & Str$(@pGrid.hWndCtrl)
#EndIf
dwPtr=GetWindowLong(@pGrid.hWndCtrl,4)
Vtbl=@dwPtr
#If %Def(%DEBUG)
Prnt " dwPtr = " & Str$(dwPtr)
#EndIf
Call Dword @Vtbl[2] Using ptrRelease(dwPtr) To iReturn
#If %Def(%DEBUG)
If SUCCEEDED(iReturn) Then
Prnt " IGrid_Events::Release() Succeeded!"
End If
Prnt " Release() Returned " & Str$(iReturn)
Prnt " Leaving IConnectionPoint_Unadvise()" : Prnt ""
#EndIf
Function=%NOERROR
End Function
Function IConnectionPoint_EnumConnections(Byval this As Dword, Byval ppEnum As Dword) As Long
Function=%E_NOTIMPL
End Function