If any of the methods shown above do not achieve the required report look then a report script can be used instead. The “Cross-tab” object has the following events:
We can use the following methods of the “Cross-tab” object in these events:
Let's show how to highlight the third column (in our example the “November 1999” date). Select the cross-tab object on the report design page, in the object inspector click on the events tab, locate the “OnPrintCell” event and create a handler on the code page by double-clicking in the empty list to the right of the event name. The script editor will appear with the basic declaration created for you, then add the code required in the empty 'begin...end' block of the declaration:
Pascal script:
procedure Cross1OnPrintCell(Memo: TfrxMemoView;
RowIndex, ColumnIndex, CellIndex: Integer;
RowValues, ColumnValues, Value: Variant);
begin
if ColumnIndex = 2 then
Memo.Color := clRed;
end;
C++ Script:
void Cross1OnPrintCell(
TfrxMemoView Memo,
int RowIndex,
int ColumnIndex,
int CellIndex,
Variant RowValues,
Variant ColumnValues,
Variant Value)
{
if (ColumnIndex == 2) { Memo.Color = clRed; }
}
We will see the following when the report is previewed:
To highlight a column title, create an “OnPrintColumnHeader” event handler in a similar way :
Pascal script:
procedure Cross1OnPrintColumnHeader(Memo: TfrxMemoView;
HeaderIndexes, HeaderValues, Value: Variant);
begin
if (VarToStr(HeaderValues[0]) = '1999') and
(VarToStr(HeaderValues[1]) = '11') then
Memo.Color := clRed;
end;
C++ Script:
void Cross1OnPrintColumnHeader(
TfrxMemoView Memo,
Variant HeaderIndexes,
Variant HeaderValues,
Variant Value)
{
if ((VarToStr(HeaderValues[0]) == "1999") &&
(VarToStr(HeaderValues[1]) == "11"))
{
Memo.Color = clRed;
}
}
The report preview is now:
This is how the script works: the “OnPrintCell” event handler is called before printing a cell in the table’s data area (note that cells in the table titles call either the “OnPrintColumnHeader” or the “OnPrintRowHeader” handler). The “OnPrintCell” handler parameters include: a link to the “Text” object which represents the table cell (the “Memo” parameter) and the cell’s “address” as the location of the row, column and cell (cell is relevant if your cross-tab contains multi-leveled cells) as the “RowIndex”, “ColumnIndex”, and “CellIndex” parameters respectively. The parameter list also has the header's values specified as Variants (the “RowValues” and “ColumnValues” parameters) and the “Value” Variant parameter which holds the cell contents.
In our example it is easier to specify the “address” using the “RowIndex” and “ColumnIndex”. Numbering of columns and rows begins at “0” so “ColumnIndex = 2” refers to the third column. We could also specify the correct column by looking at its data content (we need the 11th month of 1999):
Pascal script:
procedure Cross1OnPrintCell(Memo: TfrxMemoView;
RowIndex, ColumnIndex, CellIndex: Integer;
RowValues, ColumnValues, Value: Variant);
begin
if (VarToStr(ColumnValues[0]) = '1999') and
(VarToStr(ColumnValues[1]) = '11') then
Memo.Color := clRed;
end;
C++ Script:
void Cross1OnPrintCell(
TfrxMemoView Memo,
int RowIndex,
int ColumnIndex,
int CellIndex,
Variant RowValues,
Variant ColumnValues,
Variant Value)
{
if ((VarToStr(ColumnValues[0]) == "1999") &&
(VarToStr(ColumnValues[1]) == "11"))
{
Memo.Color = clRed;
}
}
The “RowValues” and “ColumnValues” parameters are arrays of the Variant type, having a zero base. The “0” element is at the highest level of the table title, the “1” element is at the next level, etc. In our example “ColumnValues[0]” contains years and “ColumnValues[1]” contains months.
Why is the “VarToStr” function required? This prevents errors during type conversion. When working with the Variant type FastReport tries to automatically cast strings to number format, which in turn can lead to errors when casting the “Total” and “Grand Total'” column values.
The “OnPrintColumnHeader” event handler is called during output of the column title cells. The parameter list is similar to that of the “OnPrintCell” handler, though in this case the cell's “address” (“HeaderIndexes” and “HeaderValues” parameters) is in a different form. The “HeaderValues” parameter holds the same values as the “ColumnValues” and “RowValues” in the “OnPrintCell” handler. The “HeaderIndexes” parameter is also an array of values of Variant type, and contains the address of the title cell in a different form: the “0” element is the index at the highest level in the table title, the “1” one is at the next level, etc. To clarify the principle of cell numbering refer to the picture below:
In our example it was easier to use the “HeaderValues” parameter, but the following handler could be used instead:
Pascal script:
procedure Cross1OnPrintColumnHeader(Memo: TfrxMemoView;
HeaderIndexes, HeaderValues, Value: Variant);
begin
if (HeaderIndexes[0] = 0) and (HeaderIndexes[1] = 2) then
Memo.Color := clRed;
end;
C++ Script:
void Cross1OnPrintColumnHeader(
TfrxMemoView Memo,
Variant HeaderIndexes,
Variant HeaderValues,
Variant Value)
{
if ((HeaderIndexes[0] == 0) && (HeaderIndexes[1] == 2)) { Memo.Color = clRed; }
}
|