Компонент StringGrid Delphi (основные свойства)
Компонент StringGrid находится на странице Additional палитры компонентов. Там находятся "дополнительные" компоненты, но StringGrid Delphi, на мой взгляд, достоин большего уважения, лично я разместил бы его на странице Standart!
StringGrid - компонент для отображения различных данных в табличной форме. Как следует из названия, ячейки компонента StringGrid Delphi могут содержать данные, имеющие тип String, а также отображать графику.
Таблица StringGrid состоит из выделенных серым FixedCols и FixedRows - зафиксированных ячеек-заголовков, и обычных, белых ячеек. Содержимое Fixed ячеек недоступно редактированию, и меняется только программно. За возможность редактирования обычных ячеек отвечает одно из значений свойства Options.
Итак, компонент StringGrid имеет возможность адресации каждой отдельной ячейки по номеру столбца и строки. Содержимое ячейки (i, j), где где i - номер столбца, j - номер строки, имеет вид
StringGrid1.Cells[i, j]
и доступно как для чтения, так и для записи. Здесь, как и всегда, номера столбцов ( i ) и строк ( j ) отсчитываются от 0.
Выделенная ячейка таблицы имеет
номер столбца: | StringGrid1.Col | номер строки: | StringGrid1.Row |
поэтому содержимое выделенной ячейки будет адресоваться так:
S:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row];
Не правда ли, написание такой строки - утомительный процесс. Поэтому пользуйтесь оператором присоединения with:
with StringGrid1 do
S:=Cells[Col, Row];
А лучше сразу задать в свойстве Name имя покороче, например SG.
За многие свойства компонента Delphi StringGrid отвечает свойство Options. В Инспекторе Объектов Options - это раскрывающийся список, представляющий собой элементы данного множества. Если значение элемента равно True, то он присутствует в множестве, если False - то нет.
Свойство | Значение | goFixedVertLine | Наличие вертикальных разделительных линий между "фиксированными" ячейками | goFixedHorzLine | Наличие горизонтальных разделительных линий между "фиксированными" ячейками | goVertLine | Наличие вертикальных разделительных линий между "обычными" ячейками | goHorzLine | Наличие горизонтальных разделительных линий между "обычными" ячейками | goRangeSelect | Возможность выделить диапазон ячеек | goDrawFocusSelected | Закрашивание ячейки с фокусом ввода | goRowSizing | Возможность менять высоту строк мышкой | goColSizing | Возможность менять ширину столбцов мышкой | goRowMoving | Возможность менять номер строки, то есть перемещать её, мышкой | goColMoving | Возможность менять номер столбца, то есть перемещать его, мышкой | goEditing | Возможность редактировать содержимое ячейки с клавиатуры | goTabs | При значении True фокус смещается на следующую ячейку в таблице, False - на следующий компонент | goRowSelect | Выделяется вся строка с "фокусированной" ячейкой | goAlwaysShowEditor | При значении True содержимое ячейки при получении фокуса сразу доступно редактированию, False - сначала необходимо щёлкнуть по ней мышкой, либо нажать Enter или F2 (прим.: не действует при goRowSelect=True) | goThumbTracking | При значении True перемещение "бегунка" прокрутки мышкой вызывает немедленное перемещение ячеек, False - ячейки перемещаются только при отпускании "бегунка" |
Как следует из таблицы, за возможность редактировать содержимое ячеек с клавиатуры отвечает элемент goEditing свойства-множества Options. В Инспекторе Объектов установите его значение в True. Чтобы управлять этой возможностью программно, нужно включить или исключить из множества данный элемент:
StringGrid1.Options:=StringGrid1.Options+[goEditing]; //Включаем редактирование, другие элементы не трогаем
StringGrid1.Options:=StringGrid1.Options-[goEditing]; //Выключаем редактирование, другие элементы не трогаем
StringGrid1.Options:=[goEditing, goFixedVertLine, goFixedHorzLine,
goVertLine, goHorzLine, goRowSelect]; //Задаём список необходимых
элементов
Если элементы заданы списком, это аналогично присвоению в Инспекторе Объектов этим элементам значения True, остальным - False.
Ячеек в таблице, как правило, много, и в рамках компонента видна
только часть из них. В программе доступна информация как об общем
количестве строк и столбцов, так и номерах и количестве строк и
столбцов, видимых в рамках таблицы.
Количество строк в Delphi StringGrid равно StringGrid1.RowCount. Количество столбцов в Delphi StringGrid равно StringGrid1.ColCount.
Если ячейки не помещаются в таблице, появляются полосы прокрутки. При прокручивании
StringGrid1.LeftCol | Номер столбца, видимого самым левым | StringGrid1.TopRow | Номер строки, видимой самой верхней | StringGrid1.VisibleColCount | Количество столбцов, видимых в рамках таблицы | StringGrid1.VisibleRowCount | Количество строк, видимых в рамках таблицы |
У таблицы StringGrid также есть свойство и для управления размером ячеек.Для всех ячеек
DefaultRowHeight - высота строк по умолчанию | DefaultColWidth - ширина столбцов по умолчанию |
Эти значения ширины и высоты принимают все новые ячейки. При
необходимости индивидуально установить ширину и высоту столбцов и строк
соответственно, пользуемся свойствами
RowHeights - массив, содержащий высоты строк. То есть, например, RowHeights[5] - высота строки с индексом 5 | ColWidths - массив, содержащий ширины столбцов. То есть, например, ColWidths[5] - ширина строки с номером 5 |
Все эти свойства настраиваем в обработчике события OnCreate
Формы, так же как и надписи заголовков, располагающиеся в строках и
столбцах "фиксированной" зоны таблицы. В результате таблица появляется
уже в "настроенном" виде!
Поскольку ячейки компонента StringGrid можно редактировать, точно так же как и строку ввода Edit,
то возникает вопрос, можно ли программно установить курсор в заданную
позицию в содержимом ячейки? Оказывается, есть такая возможность. Для
этого требуются дополнительный тип данных на основе таблицы и
вспомогательная процедура:
type
TGridCracker = class(TStringGrid);
procedure SetCaretPosition(Grid: TStringGrid; col, row, x_pos: Integer);
begin
Grid.Col := Col;
Grid.Row := Row;
with TGridCracker(Grid) do
InplaceEditor.SelStart := x_pos;
end;
Теперь можно установить желаемую позицию курсора в ячейке, например, по нажатию кнопки:
procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.SetFocus;
with StringGrid1 do
SetCaretPosition(StringGrid1, Col, Row, 2);
end;
Правда, ещё один момент! Чтобы код сработал, нужно установить в Инспекторе Объектов значение параметра goAlwaysShoweEditor свойства Options в True. Можно это сделать также и программно, в той же процедуре нажатия кнопки:
StringGrid.Options:=StringGrid.Options+[goAlwaysShoweEditor];
Отдельно требуется осветить вопрос очистки содержимого таблицы StringGrid. Так как таблица StringGrid, в отличие от, например, компонента Memo,
не имеет метода для очистки содержимого сразу всех ячеек, то для
удаления внесённых в таблицу ранее данных приходится очищать каждую
ячейку отдельно. Делается это двумя вложенными циклами for, пробегающими по столбцам и строкам:
var i, j: Integer;
begin
with StringGRid1 do
for i:=1 to RowCount-1 do //Заголовки строк не трогаем
for j:=1 to ColCount-1 do //Заголовки столбцов не трогаем
Cells[j, i]:='';
end;
Хотя, оказывается, есть метод для очищения содержимого целого столбца или строки:
StringGrid1.Cols[i].Clear; //Очищается столбец с номером i
StringGrid1.Rows[i].Clear; //Очищается строка с номером i
Очевидно, очищение этими методами гораздо быстрее. Однако будут
очищены и ячейки фиксированной зоны, содержащие, например, названия
строк и столбцов, которые удалять не нужно. Их после очистки нужно
просто "написать" заново, на глаз эта манипуляция совершенно незаметна.
Для очистки всей таблицы достаточно последовательно очистить только
строки или только столбцы:
var i, j: Integer;
begin
with StringGRid1 do
for i:=1 to RowCount-1 do //Заголовки столбцов не трогаем - цикл от 1
begin
Rows[i].Clear;
Cells[0, i]:="Заголовок строки i";
end;
end;
Казалось бы, можно поступить и по-другому, просто обнулить количество
строк или столбцов! Однако так делать неправильно, так как при их
последующем добавлении может оказаться, что каждая ячейка содержит
прежние данные.
взято с http://www.delphi-manual.ru/stringgrid.phpПример сортировки StringGrid по щелчку на колонку
Delphi (object Pascal) Пример связки TStringGrid (таблицы) и CSV файла
примеры которые могут быть полезны
В программе имеется несколько TtabSheet и на каждом по StringGrid, как сделать
чтобы какое-либо действие над StringGrid (импорт или экспорт данных,
добавление записей) производилось именно в тот StringGrid, который на
данный момент в активном Tabsheet ?
var x:integer;
begin
for x:=0 to form1.ComponentCount-1 do
if form1.Components[x].ClassType=TStringGrid then
if TStringGrid(form1.Components[x]).Parent=
PageControl1.ActivePage then
Showmessage(TStringGrid(form1.Components[x]).Name);
end;
|