TStringGrid, часть I
Автор Деймон Чандлер перевод Виктор Алексеев aka prom
StringGrid идеально подходит для отображения больших объемов данных в компактной табличной форме. Концептуально StringGrid проще, чем графическое представление двумерного массива строк. Несмотря на эту концептуальную простоту, работа с классом TStringGrid иногда может вызывать трудности.
В этой статье я расскажу вам, как эффективно использовать класс TStringGrid. Я начну с краткого обзора того, где класс лежит в иерархии VCL, а затем мы обсудим некоторые из наиболее часто используемых свойств. Далее, я рассмотрю некоторые практические аспекты применения класса TStringGrid : как отображать текст каждой ячейки в пользовательском формате, как вставлять и удалять строки или столбцы, и как сохранить StringGrid в файл и как загрузить StringGrid из файла.
.
Иерархия класса
TStringGrid класс является прямым потомком класса TDrawGrid , который в свою очередь является потомком класса TCustomGrid: базового класса для всех стандартных элементов управления StringGrid . Класс TCustomGrid является потомком TCustomControl, который обеспечивает основную функциональность элементов управления Grid - типов .
Класс TDrawGrid добавляет к родительскому классу лишь методы CellRect () и MouseToCell (). Кроме того, добавлено несколько событий, обработчики которых выполняют унаследованные методы. Например, в обработчике событий OnDrawCell вызывается метод DrawCell (). Реализация класса TDrawGrid, содержащая менее 100 строк кода, получает почти все свои функциональные возможности класса TCustomGrid. С другой стороны, родительские классы содержат почти 3000 строк кода. Короче говоря, объект TDrawGrid по существу расширяет объект CustomGrid.
Класс TStringGrid расширяет TDrawGrid класс за счёт поддержки AnsiString ячеек и применение определенных ассоциаций данных. Строки доступны через свойства ячеек, колонок, строк, в то время как данные связаны с объектами.
Свойства ячеек, колонок, строк
Каждой ячейки в StringGrid могут быть присвоены значения типа AnsiString. Это присвоение осуществляется через свойства ячеек, колонок, строк.
Свойство Cells обеспечивает манипуляции содержимым конкретных ячеек. Это двумерный массив и описывается следующим синтаксисом:
__property AnsiString Cells [int ACol] [int ARow] = ( read = GetCells, write = SetCells);
ACol параметр указывает на индекс столбца, к которому принадлежит ячейка, а параметр ARow указывает на индекс строки ячейки. Например, чтобы присвоить значение первой (вверху слева), не фиксированной ячейке, напишем код:
const int target_col = StringGrid1->FixedCols;// Значение свойства FixedCols и FixedRows устан. по умолчанию в 1, а счет колонок и строк
const int target_row = StringGrid1->FixedRows;//начинается с 0. Поэтому и адресуется верхняя левая нефиксир. ячейка.
StringGrid1 -> Cells[target_col] [target_row] = "New String"; // С таким же успехом в частном случае можно:
const int target_col =1;
В свойствах FixedCols и FixedRows надо указать количество фиксированных столбцов и строк, соответственно.
Чтобы извлечь значение из определенной ячейки, надо поступить аналогичным образом. Например, следующий код отображает содержимое последней (нижней правой) ячейки:
const int target_col = StringGrid1->ColCount - 1;
const int target_row = StringGrid1->RowCount - 1;
ShowMessage(StringGrid1->Cells [target_col][target_row]);
Свойства ColCount и RowCount определяют количество столбцов и строк (включая фиксированные) соответственно.
Свойства Cels и Cols обеспечивают доступ к целой строке или к целому столбцу, соответственно. Каждое из этих свойств определены в виде массива TStrings *:
__property Classes::TStrings* Cols[int Index] = {read=GetCols, write=SetCols};
__property Classes::TStrings* Rows[int Index] = {read=GetRows, write=SetRows};
Свойства Cols и Rows. Первое свойство - Cols. Это свойство представляет собой одномерный массив со списками строк. Поэтому, если мы укажем конкретный столбец, например 4-й, то в этом свойстве Cols будут доступны значения всех ячеек принадлежащих этому столбцу. Значение строки в указанной ячейке доступно через свойство String. (Свойство String не доступно в режиме визуального проектирования, точнее его там просто нет).