Hello Lane,
To calculate coordinates of the TrueDBGrid cells, you can use the Left, Width and RowHeight properties and the RowTop method of the grid.
For example, you can modify the code Helen posted in the following way:
' Calculates coordinates of a grid cell by its row index and column index or caption
' And simulates a click in the specified cell
Sub ClickCell(grid, rowIndex, column)
Dim SplitNo, SplitCount
' Checks whether the grid contains the specified row
If rowIndex < 1 Or rowIndex > grid.ApproxCount Then
Log.Error "Row index " & rowIndex & " is out of bounds 1 ... " & grid.ApproxCount & "."
Exit Sub
End If
' Checks whether the grid contains the specified column
If Not aqObject.GetVarType(column) = 8 Then
If column < 0 Or column >= grid.Columns.Count Then
Log.Error "Column index " & column & " is out of bounds 0 ... " & grid.Columns.Count & "."
Exit Sub
End If
Else
Err.Clear
On Error Resume Next
Set col = grid.Columns(column)
If Err.Number <> 0 Then
Log.Error Err.Description
Exit Sub
End If
End If
' Checks whether the row is visible
If (grid.VisibleRows + grid.FirstRow) < rowIndex Or grid.FirstRow > rowIndex Then
' Scrolls to the specified row
grid.FirstRow = rowIndex
' Obtains the index of the specified row among the visible rows
rowIndexV = 0
Else
' Obtains the index of the specified row among the visible rows
rowIndexV = rowIndex - grid.FirstRow
End If
' Obtains the number of splits in the grid
SplitCount = grid.Splits.Count
SplitNo = 0
For i = 0 To SplitCount - 2
columnIndex = grid.Splits(SplitNo).Columns(column).ColIndex
If columnIndex >= grid.Splits(i).LeftCol And columnIndex < grid.Splits(i+1).LeftCol Then
SplitNo = i
Else
SplitNo = grid.Splits.Count - 1
End If
Next
' Checks whether the column is visible
FirstVisisble = grid.Splits(SplitNo).LeftCol
LastVisible = grid.Splits(SplitNo).LeftCol + grid.VisibleCols - 1
If LastVisible <= grid.Splits(SplitNo).Columns(column).ColIndex _
Or FirstVisible >= grid.Splits(SplitNo).Columns(column).ColIndex Then
' Scrolls to the specified column
grid.Splits(SplitNo).LeftCol = grid.Splits(SplitNo).Columns(column).ColIndex
End If
' Calculates the horizontal coordinates of the cell (in VB twips)
xTwips = grid.Splits(SplitNo).Columns(column).Left + (grid.Splits(SplitNo).Columns(column).Width / 2)
' Converts twips to pixels
x = CLng(TwipsToPixelsX(xTwips))
' Calculates the vertical coordinates of the cell (in VB twips)
yTwips = grid.RowTop(rowIndexV) + grid.RowHeight / 2
' Converts twips to pixels
y = CLng(TwipsToPixelsY(yTwips))
' Clicks the specified cell
Log.Message "Clicking cell (" & rowIndex & ", " & column & ")"
grid.Click x, y
End Sub
Const TWIPSPERINCH = 1440
Function TwipsToPixelsX(XTwips)
Dim Xdpi
Xdpi = Win32API.GetDeviceCaps(Win32API.GetDC(0), Win32API.LOGPIXELSX)
TwipsToPixelsX = XTwips / TWIPSPERINCH * Xdpi
End Function
Function TwipsToPixelsY(YTwips)
Dim Ydpi
Ydpi = Win32API.GetDeviceCaps(Win32API.GetDC(0), Win32API.LOGPIXELSY)
TwipsToPixelsY = YTwips / TWIPSPERINCH * Ydpi
End Function
' Obtains the grid and simulates clicks on its cells
Sub Test
Dim grid
Set grid = Sys.Process("Ub2RsCls").VBObject("UB2ADO").VBObject("TDBGrid1")
ClickCell grid, 10, 3
ClickCell grid, 25, "Notes"
ClickCell grid, 100, "Comments"
End Sub
You can use this sample code as a base for your own code that suits your needs better.
Please let me know whether this information helps, or whether you have any additional questions.
Thanks you.