TStringGrid, часть I
Автор Деймон Чандлер перевод Виктор Алексеев aka prom
Пример: выбираем 3-ю колонку и хотим просмотреть значение строки в этой колонке, напр. в 4-й:
const int target_col = 2;
const int target_row = 3;
ShowMessage(StringGrid1->Cols [target_col]->Strings[target_row]);
Свойство Cels аналогично, только здесь выбираем строку и просматриваем ячеек всех столбцов, которые попали в эту строку.
Пример: выбираем 4-ю строку и в ней просматривает значение 3-го столбца.
const int target_col = 2;
const int target_row = 3;
ShowMessage(StringGrid1->Rows [target_row]->Strings[target_col]);
Свойство Objects
Свойство Objects - это указатель на объект типа TObject*. Каждую ячейку можно ассоциировать с каким-то объектом, и значит получить доступ к свойствам и методам этого объекта. Синтаксис объявления свойства Objects:
__property System:: TObject * Objects [INT ACol] [INT ARow] = ( read = GetObjects, write = SetObjects);
Через свойство Objects мы получаем доступ к свойствам Объекта не напрямую, а через ячейки ассоциированные с данным объектом. Это делает Grid универсальным средством для визуального отображения разнотипной информации. Ниже пример, где для ассоциирования с целочисленным значением используется свойство Objects.
const int target_col = StringGrid1->FixedCols;
const int target_row = StringGrid1->FixedRows;
const int associated_data = 1001;
StringGrid1->Objects [target_col][target_row] = reinterpret_cast <TObject*>(associated_data);
Отметим также, что класс TStringGrid автоматически не освобождает память, поэтому программисту это надо иметь в виду.
Управление выравниванием текста
Класс TStringGrid обеспечивает не только хранение данных каждой ячейкой, но и автоматический рендеринг текста (прим. пер.: под рендерингом понимается прорисовка грида). Эта задача решается методом DrawCell (), который в свою используется методом TextRect (). Однако, можно отформатировать каждую ячейку, по собственному усмотрению. Например, если есть столбец с денежными суммами, то представление желательно прижать к правой стороне ячейки.
Хотя TStringGrid класс не предоставляет прямых способов управления форматированием, он предоставляет обработчик события OnDrawCell, с помощью которого можно манипулировать форматированием ячейки.
Событие OnDrawCell
Как уже упоминалось, событие OnDrawCell наследуется от класса TDrawGrid, где оно продекларировано следующим образом:
__property TDrawCellEvent OnDrawCell = {read=FOnDrawCell, write=FOnDrawCell};
TDrawCellEvent имеет нестандартный тип события, разработанного специально для рендеринга элементов управления типа грид:
typedef void __fastcall (__closure *TDrawCellEvent)
( System::TObject* Sender, long ACol,long ARow, Windows::TRect Rect, TGridDrawState State);
Параметр Sender это указатель на сам объект StringGrid. Параметры ACol и ARow - индексы текущего столбца и строки ячейки, которая требует рендеринга, а параметр Rect определяет прямоугольник области рендеринга.
Параметр State - перечисление, который показывает состояние текущей ячейки. Этот параметр может содержать следующие значения: gdSelected, gdFocused и gdFixed. Значения этого параметра определяют рендеринг ячейки или группы ячееек.