One of the actions that you will perform the most over a grid is selecting cells. This topic explains how you can select TDBGrid control’s cells from scripts:
To perform these actions, TestComplete must have access to internal methods and properties of the TDBGrid control. This requires the following conditions be met:
When testing Borland TDBGrid controls, use specific methods and properties of the corresponding |
General Notes
The cell selection is only possible if the grid does not work in row selection mode. The row selection mode is active, if the grid’s Options
property contains the dgRowSelect
value (this is an internal property of the TDBGrid control). If you are not sure in which mode the tested grid functions, you may ask the tested application’s developer. Also, you can determine the mode visually by watching the grid’s behavior when you are navigating through the records. If the grid highlights whole rows rather than individual cells, then the row selection mode is active and you cannot simulate the cell selection.
Before selecting a cell, you need to locate the desired record within the grid. For example, you can search for and activate the desired row using methods described here: Searching for Records in Borland TDBGrid. After you have determined the cell position in the grid, you can select the cell in one of the following ways:
-
By simulating a mouse click on the cell using the
BorlandTDBGrid.ClickCell
action. In this case, the cell is automatically put into edit mode so you can modify its value. -
By focusing the row and column in which the desired cell resides using internal properties and methods of the TDBGrid control.
-
By simulating keyboard shortcuts (for example, Arrow keys).
All of these approaches work equally well. However, in case of using the Col
property, TestComplete does not activate the form where the grid resides (if you decide to simulate keystrokes or a click, the grid’s form will be activated). You can use the approach that better suites your needs.
Simulating Clicks on Cells
You can simulate clicks on TDBGrid cells using the ClickCell
, ClickCellR
, DblClickCell
and similar actions of the BorlandTDBGrid
object. All of these actions have parameters that specify the row and column that contain the desired cell. They also have an additional parameter that specifies the key or a combination of keys (Ctrl, Alt, Shift) that are pressed during the simulation of a click.
Below is an example that demonstrates how you can simulate clicks on grid cells:
JavaScript, JScript
function Main ()
{
var p, Grid;
// Obtain the grid object
p = Sys.Process("csdemos");
p.VCLObject("FrmLauncher").VCLObject("BtnViews").ClickButton;
Grid = p.VCLObject("FrmViewDemo").VCLObject("Panel2").VCLObject("DBGrid1");
Grid.ClickCell(0, "EmpNo");
Grid.ClickCell(0, "LastName");
Grid.ClickCell(0, "FirstName");
}
Python
def Main():
# Obtain the grid object
p = Sys.Process("csdemos")
p.VCLObject("FrmLauncher").VCLObject("BtnViews").ClickButton
Grid = p.VCLObject("FrmViewDemo").VCLObject("Panel2").VCLObject("DBGrid1")
Grid.ClickCell(0, "EmpNo")
Grid.ClickCell(0, "LastName")
Grid.ClickCell(0, "FirstName")
VBScript
Sub Main
Dim p, Grid
' Obtain the grid object
Set p = Sys.Process("csdemos")
p.VCLObject("FrmLauncher").VCLObject("BtnViews").ClickButton
Set Grid = p.VCLObject("FrmViewDemo").VCLObject("Panel2").VCLObject("DBGrid1")
Call Grid.ClickCell(0, "EmpNo")
Call Grid.ClickCell(0, "LastName")
Call Grid.ClickCell(0, "FirstName")
End Sub
DelphiScript
procedure Main;
var p, Grid : OleVariant;
begin
// Obtain the grid object
p := Sys.Process('csdemos');
p.VCLObject('FrmLauncher').VCLObject('BtnViews').ClickButton;
Grid := p.VCLObject('FrmViewDemo').VCLObject('Panel2').VCLObject('DBGrid1');
Grid.ClickCell(0, 'EmpNo');
Grid.ClickCell(0, 'LastName');
Grid.ClickCell(0, 'FirstName');
end;
C++Script, C#Script
function Main ()
{
var p, Grid;
// Obtain the grid object
p = Sys["Process"]("csdemos");
p["VCLObject"]("FrmLauncher")["VCLObject"]("BtnViews")["ClickButton"];
Grid["ClickCell"](0, "EmpNo");
Grid["ClickCell"](0, "LastName");
Grid["ClickCell"](0, "FirstName");
}
Using the TDBGrid.Col
Property
The Col
property is only available if the tested application is compiled with debug information. This property is exposed by the Debug Info Agent™. It specifies the currently focused cell in the active row of the grid.
Below is a code snippet that demonstrates how you can select a cell using the Col
property of the TDBGrid control:
Example
JavaScript, JScript
function Main()
{
var p, Grid;
p = Sys.Process("csdemos");
Grid = p.VCLObject("FrmViewDemo").VCLObject("Panel2").VCLObject("DBGrid1");
SelectCell(Grid, 9, 1);
}
// Activate a row by its index (zero-based)
function ActivateRow(GridObject, RowIndex)
{
GridObject.DataSource.DataSet.First();
GridObject.DataSource.DataSet.MoveBy(RowIndex);
}
// Select a call by its indexes (zero-based)
function SelectCell(GridObject, RowIndex, ColIndex)
{
ActivateRow(GridObject, RowIndex);
GridObject.Col = ColIndex + GridObject.IndicatorOffset;
}
Python
def Main2():
p = Sys.Process("csdemos")
Grid = p.VCLObject("FrmViewDemo").VCLObject("Panel2").VCLObject("DBGrid1")
SelectCell(Grid, 9, 1)
# Activate a row by its index (zero-based)
def ActivateRow(GridObject, RowIndex):
GridObject.DataSource.DataSet.First()
GridObject.DataSource.DataSet.MoveBy(RowIndex)
# Select a call by its indexes (zero-based)
def SelectCell(GridObject, RowIndex, ColIndex):
ActivateRow(GridObject, RowIndex)
GridObject.Col = ColIndex + GridObject.IndicatorOffset
VBScript
Sub Main
Set p = Sys.Process("csdemos")
Set Grid = p.VCLObject("FrmViewDemo").VCLObject("Panel2").VCLObject("DBGrid1")
Call SelectCell(Grid, 9, 1)
End Sub
' Selecting a call by its indexes (zero-based)
Sub SelectCell(GridObject, RowIndex, ColIndex)
Call ActivateRow(GridObject, RowIndex)
GridObject.Col = ColIndex + GridObject.IndicatorOffset
End Sub
' Activates a row by its index (zero-based)
Sub ActivateRow(GridObject, RowIndex)
Call GridObject.DataSource.DataSet.First
Call GridObject.DataSource.DataSet.MoveBy(RowIndex)
End Sub
DelphiScript
// Activate a row by its index (zero-based)
procedure ActivateRow(GridObject, RowIndex);
begin
GridObject.DataSource.DataSet.First();
GridObject.DataSource.DataSet.MoveBy(RowIndex);
end;
// Select a call by its indexes (zero-based)
procedure SelectCell(GridObject, Row, Col);
begin
ActivateRow(GridObject, Row);
GridObject.Col := Col + GridObject.IndicatorOffset;
end;
procedure Main;
var
p, Grid : OleVariant;
begin
p := Sys.Process('csdemos');
Grid := p.VCLObject('FrmViewDemo').VCLObject('Panel2').VCLObject('DBGrid1');
SelectCell(Grid, 9, 1);
end;
C++Script, C#Script
function Main()
{
var p, Grid;
p = Sys["Process"]("csdemos");
Grid = p["VCLObject"]("FrmViewDemo")["VCLObject"]("Panel2")["VCLObject"]("DBGrid1");
SelectCell(Grid, 9, 1);
}
// Activate a row by its index (zero-based)
function ActivateRow(GridObject, RowIndex)
{
GridObject["DataSource"]["DataSet"]["First"]();
GridObject["DataSource"]["DataSet"]["MoveBy"](RowIndex);
}
// Select a call by its indexes (zero-based)
function SelectCell(GridObject, RowIndex, ColIndex)
{
ActivateRow(GridObject, RowIndex);
GridObject["Col"] = ColIndex + GridObject["IndicatorOffset"];
}
Simulating Keyboard Shortcuts
You can select a grid cell by simulating keyboard shortcuts over the grid control. For instance, you can simulate the Home shortcut to move the focus to the first cell in a row, and then simulate a number of Right Arrow key presses to move the selection to the desired cell. The following code demonstrates how you can select a cell by simulating shortcuts.
Example
JavaScript, JScript
function Main()
{
var p, Grid;
// Obtain the grid object
p = Sys.Process("csdemos");
Grid = p.VCLObject("FrmViewDemo").VCLObject("Panel2").VCLObject("DBGrid1");
// Activate the inplace editor
SelectCellByKeystrokes(Grid, 4, 1);
}
// Select a cell with the mouse click
function SelectCellByKeystrokes(GridObject, RowIndex, ColIndex)
{
var j;
// Activate the desired row
ActivateRow(GridObject, RowIndex);
// Lock the event messages
Log.LockEvents();
// Move focus to the first column
GridObject.Keys("[Home]");
// Change the desired column index according the indicator's visibility
ColIndex = ColIndex + GridObject.IndicatorOffset;
// Iterate through columns
for(j = GridObject.IndicatorOffset; j < ColIndex; j++)
{
// Move the focus to the next column
GridObject.Keys("[Right]");
}
// Unlock the event messages
Log.UnlockEvents();
}
// Activate a row by its index (zero-based)
function ActivateRow(GridObject, RowIndex)
{
GridObject.DataSource.DataSet.First();
GridObject.DataSource.DataSet.MoveBy(RowIndex);
}
Python
def Main3():
# Obtain the grid object
p = Sys.Process("csdemos")
Grid = p.VCLObject("FrmViewDemo").VCLObject("Panel2").VCLObject("DBGrid1")
# Activate the inplace editor
SelectCellByKeystrokes(Grid, 4, 1)
# Select a cell with the mouse click
def SelectCellByKeystrokes(GridObject, RowIndex, ColIndex):
# Activate the desired row
ActivateRow(GridObject, RowIndex)
# Lock the event messages
Log.LockEvents()
# Move focus to the first column
GridObject.Keys("[Home]")
# Change the desired column index according the indicator's visibility
ColIndex = ColIndex + GridObject.IndicatorOffset
# Iterate through columns
for j in range(GridObject.IndicatorOffset, ColIndex-1):
# Move the focus to the next column
GridObject.Keys("[Right]")
# Unlock the event messages
Log.UnlockEvents()
# Activate a row by its index (zero-based)
def ActivateRow(GridObject, RowIndex):
GridObject.DataSource.DataSet.First()
GridObject.DataSource.DataSet.MoveBy(RowIndex)
VBScript
Sub Main
' Obtaining the grid object
Set p = Sys.Process("csdemos")
Set Grid = p.VCLObject("FrmViewDemo").VCLObject("Panel2").VCLObject("DBGrid1")
' Activating the inplace editor
Call SelectCellByKeystrokes(Grid, 4, 1)
End Sub
' Selecting a cell with the mouse click
Sub SelectCellByKeystrokes(GridObject, RowIndex, ColIndex)
' Activates the desired row
Call ActivateRow(GridObject, RowIndex)
' Locking the event messages
Log.LockEvents
' Moves focus to the first column
GridObject.Keys "[Home]"
' Changes the desired column index according the indicator's visibility
ColIndex = ColIndex + GridObject.IndicatorOffset
' Iterates through columns
For j = GridObject.IndicatorOffset To ColIndex - 1
' Moves the focus to the next column
GridObject.Keys "[Right]"
Next
' Unlocking the event messages
Log.UnlockEvents
End Sub
' Activates a row by its index (zero-based)
Sub ActivateRow(GridObject, RowIndex)
Call GridObject.DataSource.DataSet.First()
Call GridObject.DataSource.DataSet.MoveBy(RowIndex)
End Sub
DelphiScript
// Activate a row by its index (zero-based)
procedure ActivateRow(GridObject, RowIndex);
begin
GridObject.DataSource.DataSet.First();
GridObject.DataSource.DataSet.MoveBy(RowIndex);
end;
// Select a cell with the mouse click
function SelectCellByKeystrokes(GridObject, RowIndex, ColIndex);
var
j : OleVariant;
begin
// Activate the desired row
ActivateRow(GridObject, RowIndex);
// Lock the event messages
Log.LockEvents();
// Move focus to the first column
GridObject.Keys('[Home]');
// Change the desired column index according the indicator's visibility
ColIndex := ColIndex + GridObject.IndicatorOffset;
// Iterate through columns
for j := GridObject.IndicatorOffset to ColIndex - 1 do
begin
// Move the focus to the next column
GridObject.Keys('[Right]');
end;
// Unlock the event messages
Log.UnlockEvents();
end;
procedure Main;
var
p, Grid : OleVariant;
begin
// Obtain the grid object
p := Sys.Process('csdemos');
Grid := p.VCLObject('FrmViewDemo').VCLObject('Panel2').VCLObject('DBGrid1');
// Activate the inplace editor
SelectCellByKeystrokes(Grid, 4, 1);
end;
C++Script, C#Script
function Main()
{
var p, Grid;
// Obtain the grid object
p = Sys["Process"]("csdemos");
Grid = p["VCLObject"]("FrmViewDemo")["VCLObject"]("Panel2")["VCLObject"]("DBGrid1");
// Activate the inplace editor
SelectCellByKeystrokes(Grid, 4, 1);
}
// Select a cell with the mouse click
function SelectCellByKeystrokes(GridObject, RowIndex, ColIndex)
{
var j;
// Activate the desired row
ActivateRow(GridObject, RowIndex);
// Lock the event messages
Log["LockEvents"]();
// Move focus to the first column
GridObject["Keys"]("[Home]");
// Change the desired column index according the indicator's visibility
ColIndex = ColIndex + GridObject["IndicatorOffset"];
// Iterate through columns
for(j = GridObject["IndicatorOffset"]; j < ColIndex; j++)
{
// Move the focus to the next column
GridObject["Keys"]("[Right]");
}
// Unlock the event messages
Log["UnlockEvents"]();
}
// Activate a row by its index (zero-based)
function ActivateRow(GridObject, RowIndex)
{
GridObject["DataSource"]["DataSet"]["First"]();
GridObject["DataSource"]["DataSet"]["MoveBy"](RowIndex);
}
See Also
Working With Borland TDBGrid
ClickCell Action (Grid Controls)
Activating In-place Editors in Borland TDBGrid
Obtaining and Setting Cell Values in Borland TDBGrid
Selecting Multiple Rows in Borland TDBGrid