Delphi. Панель Additional. Компонент StringGrid.

Компонент «StringGrid» расположен на вкладке «Additional».

По сути, он представляет из себя модифицированную таблицу.

Верхние ячейки таблицы выделены цветом и служат для размещения заголовков столбцов. Количество таких строк может быть от 0 до требуемого программистом и задаётся свойством «FixedRows».

Аналогично левый столбец — количество таких столбцов задаётся свойством «FixedCols».

Такие ячейки называются фиксированными и их цвет можно установить с помощью свойства «FixedColor».

Начальное количество рядов и колонок для обычных ячеек задаётся свойствами «RowCount» и «ColCount»,

Цвет фона «StringGrid» задаётся свойством «Color».

Толщина линий сетки задаётся свойством «GridLineWidth».

Свойство «Options»

Большое количество настроек содержится в свойстве «Options»:

Значения, установленные по умолчанию, представлены на рисунке (цифры на рисунок добавлены для идентификации строк).

  1. GoFixedVertLine — если выставить «false», то вертикальные линии сетки для фиксированных ячеек отображаться не будут.
  2. GoFixedHorzLine — Аналогично для горизонтальных линий.
  3. GoVertLine — если выставить «false», то при «GridLineWidth=1» не будут отображаться вертикальные линии сетки. При других значениях «GridLineWidth» линии сетки отображаются.
  4. GoHorzLine —Аналогично для горизонтальных линий.
  5. GoRangeSelect — Можно выделять мышью (или сочетанием клавиш) сразу некоторый диапазон ячеек. (рис.1)
  6. goDrawFocusSelected — Закрашивание ячейки с фокусом ввода. Если «false» — то рис.3.1, если «true» — то рис.3.2.
  7. GoRowSizing – можно мышью изменять высоту строки (если только FixedColsне равно нулю). Изменить высоту можно, захватив горизонтальную линию мышью в области фиксированного столбца (рис.2).
  8. GoColSizing можно мышью изменять ширину колонки.
  9. GoRowMoving — Возможность менять номер строки, то есть перемещать её мышкой, ухватив за фиксированную ячейку.
  10. GoColMoving — то же, но для столбца.
  11. GoEditing — Если свойство установлено в «false», то значения в ячейках доступны только для чтения. При значении «true» их можно редактировать.
  12. GoTabs – при «true» можно последовательно перемещать фокус ячейки клавишей «tab»
  13. GoRowSelect – щелчок по ячейке выделяет всю строку.
  14. GoAlwausShowEditor — при перемещении в ячейку фокуса текст в ней сразу доступен редактированию (при goEditing=True) без дополнительных действий;
  15. GoThumbTracking — определяет поведение таблицы при протягивании пользователем ползунка скроллинга мышкой:
       — при значении «False» скроллинг происходит только после того как пользователь отпустит ползунок;
       — при значении «True» скроллинг происходит одновременно с движением ползунка.
рис.1
рис.2
рис.3-1
рис.3-2

Свойство «ScrollBars» определяет наличие/отсутствие горизонтальной и вертикальной полос прокрутки.

Свойство «DefaultColWidth» определяет ширину колонок.

Свойство «DefaultRowHeight» определяет высоту строк.

В самом компоненте «StringGrid» нет механизма автоматического сохранения введённых в ячейки сетки значений.

Соответственно, и заполнение ячеек сетки должно производиться из какого-то хранилища данных (например, из массива или файла).

Чтобы прочитать значение из какой либо ячейки, необходимо указать номер колонки и номер ряда, на пересечении которых находится эта ячейка:

var s:string;
s:=StringGrid1.Cells[col,row];

Замечание. Если присутствуют фиксированные строка и ряд, то [0,i] заполнит значениями фиксированный столбец, а [i,0] заполнит фиксированную строку. Например:

Ввести значение в ячейку можно непосредственно, если свойство «Options» содержит значение «goEditing» (то есть в инспекторе объектов это значение установлено в «true»).

Также можно ввести значение в ячейку программно:

var s:string;
s:=’ABC’;
StringGrid1.Cells[col,row]:=s;

Замечание. Свойство «Options» имеет тип «TgridOptions»:
property Options: TGridOptions;
Тип TgridOptions является множеством: TGridOptions = set of TGridOption;
Множество «Options» может содержать значения «goRowSizing», «goEditing» и так далее.

Пример использования свойства «Options».

Посмотрим в динамике, как влияет установка того или иного свойства «Options» на поведение «StringGrid».

Для этого разместим на форме компонент «GroupBox», а в самом компоненте расположим семь компонентов «CheckBox».

Создадим обработчики кликов по «CheckBox» и пропишем в них следующий код:

procedure TForm1.CheckBox1Click(sender: Tobject);
begin
if TCheckBox( sender).Checked=true then
begin
self.StringGrid1.Options:=self.StringGrid1.Options+[goDrawFocusSelected];
self.Label1.Caption:=’true’;
end
else
begin
self.StringGrid1.Options:=self.StringGrid1.Options-[goDrawFocusSelected];
self.Label1.Caption:=’true’;
end;
end;

procedure TForm1.CheckBox2Click(Sender: Tobject);
begin
if TCheckBox( sender).Checked=true then
begin
self.StringGrid1.Options:=self.StringGrid1.Options+[goRowSizing];
self.Label2.Caption:=’true’;
end
else
begin
self.StringGrid1.Options:=self.StringGrid1.Options-[goRowSizing];
self.Label2.Caption:=’true’;
end;
end;

procedure TForm1.CheckBox3Click(Sender: Tobject);
begin
if TCheckBox( sender).Checked=true then
begin
self.StringGrid1.Options:=self.StringGrid1.Options+[goColSizing];
self.Label3.Caption:=’true’;
end
else
begin
self.StringGrid1.Options:=self.StringGrid1.Options-[goColSizing];
self.Label3.Caption:=’true’;
end;
end;

procedure TForm1.CheckBox4Click(Sender: Tobject);
begin
if TCheckBox( sender).Checked=true then
begin
self.StringGrid1.Options:=self.StringGrid1.Options+[goRowMoving];
self.Label4.Caption:=’true’;
end
else
begin
self.StringGrid1.Options:=self.StringGrid1.Options-[goRowMoving];
self.Label4.Caption:=’true’;
end;
end;

procedure TForm1.CheckBox5Click(Sender: Tobject);
begin
if TCheckBox( sender).Checked=true then
begin
self.StringGrid1.Options:=self.StringGrid1.Options+[goColMoving];
self.Label5.Caption:=’true’;
end
else
begin
self.StringGrid1.Options:=self.StringGrid1.Options-[goColMoving];
self.Label5.Caption:=’true’;
end;
end;

procedure TForm1.CheckBox6Click(Sender: Tobject);
begin
if TCheckBox( sender).Checked=true then
begin
self.StringGrid1.Options:=self.StringGrid1.Options+[goEditing];
self.Label6.Caption:=’true’;
end
else
begin
self.StringGrid1.Options:=self.StringGrid1.Options-[goEditing];
self.Label6.Caption:=’true’;
end;
end;

procedure TForm1.CheckBox7Click(Sender: Tobject);
begin
if TCheckBox( sender).Checked=true then
begin
self.StringGrid1.Options:=self.StringGrid1.Options+[goTabs];
self.Label7.Caption:=’true’;
end
else
begin
self.StringGrid1.Options:=self.StringGrid1.Options-[goTabs];
self.Label7.Caption:=’true’;
end;
end;

Компонент Bevel.

Посмотрим внимательнее на рисунок:

Мы видим, что для улучшения внешнего вида и читаемости каждая строка подчёркнута прямой линией.

Это сделано с поомщью компонента «Bevel». С его помощью можно рисовать простейшие геометрические фигуры, в частности — прямую горизонтальную линию.

Для этого надо установить в соответствующее значение свойство «Shape». В нашем случае оно равно «bsBottomLine» — что означает: «линия внизу».

Свойство «Style» определяет тип линии — «выпуклая»или «утопленная».

Второй вариант кода.

Объём приведённого кода можно значительно сократить. Посмотрим, как это осуществить.

Для этого дополним «TForm» дополнительным методом:

procedure CheckBox7Click(Sender: Tobject);
procedure check(options:tGridOptions; sender,sender1: TObject; tag:integer);

Через параметр «options» будем передавать значение, которое мы хотим активизировать. Например, «goRowSizing»;

Через параметр «sender» будем передавать ссылку на «CheckBox», по которому осуществлён клик мышью.

Через параметр «sender1» будем передавать ссылку на «Label». В итоге:

procedure check(options:tGridOptions; sender,sender1: TObject; tag:integer);
var s:string;
begin

if TCheckBox(sender).Checked=true then //проверяем, включён ли флажок
begin
self.StringGrid1.Options:=self.StringGrid1.Options+options;//добавляем ко множеству переданное через параметр значение
s:=’true’;
end
else
begin
self.StringGrid1.Options:=self.StringGrid1.Options-options;//удаляем из множества переданное значение, если флажок не включён
s:=’false’;
end;

Tlabel(sender1).Caption:=s;

end;

Здесь TcheckBox(sender) — это приведение ссылки на объект к нужному типу (в нашем случае, к типу TcheckBox). Если, например, передана ссылка на «CheckBox1», то TcheckBox(sender) будет эквивалентно обращению к «CheckBox1».

Аналогично для ссылки на метку «Tlabel(sender1)».

Обработчики кликов по «СheckBox» -ам преобразуем следующим образом.

procedure TForm1.CheckBox1Click(sender: TObject);
begin
check([goDrawFocusSelected], sender, label1);
end;

procedure TForm1.CheckBox2Click(Sender: TObject);
begin
check([goRowSizing], sender, label2);
end;

procedure TForm1.CheckBox3Click(Sender: TObject);
begin
check([goColSizing], sender, label3);
end;

procedure TForm1.CheckBox4Click(Sender: TObject);
begin
check([goRowMoving], sender, label4);
end;

procedure TForm1.CheckBox5Click(Sender: TObject);
begin
check([goColMoving], sender, label5);
end;

procedure TForm1.CheckBox6Click(Sender: TObject);
begin
check([goEditing], sender, label6);
end;

procedure TForm1.CheckBox7Click(Sender: TObject);
begin
check([goTabs], sender, label7);
end;

Здесь [goDrawFocusSelected] и так далее — элементы множества, которые надо добавить или удалить к/из множества «Optons».

Sender — передаваемый в функцию параметр, содержащий ссылку на объект. Например, если это procedure TForm1.CheckBox1Click(sender: TObject), то «sender» содержит ссылку на «CheckBox1» и так далее.

Так как ссылка организована через родительский тип (то есть преобразована к родительскому типу), то в дальнейшем надо совершать обратное преобразование

Третий параметр — ссылка на метку.

Как видно, код получается значительно короче и более структурированным.

***

Обновлено: 01.08.2021 — 10:32

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *