Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_Delphi_1курс лекции / Тема 06 Таблицы строк.doc
Скачиваний:
62
Добавлен:
23.03.2015
Размер:
180.74 Кб
Скачать

Таблица строк — компонент StringGrid 18

Таблица строк — компонент StringGrid

Страница Additional

Компонент StringGrid представляет собой таблицу, содержащую строки.

Таблица делится на две части - фиксированную и рабочую. Фиксированная служит для показа заголовков столбцов/рядов и для ручного управления их размерами. Обычно фиксированная часть занимает крайний левый столбец и самый верхний ряд таблицы, однако с помощью свойств FixedCols и FixedRows можно задать другое количество фиксированных столбцов и рядов (если эти свойства имеют 0, таблица не содержит фиксированной зоны). Рабочая часть - это остальная часть таблицы. Она может содержать произвольное количество столбцов и рядов, более того, эти величины могут изменяться программно. Рабочая часть может не умещаться целиком в пределах окна компонента, в этом случае в него автоматически помещаются нужные полосы прокрутки. При прокрутке рабочей области фиксированная область не исчезает, но меняется ее содержимое - заголовки строк и рядов.

Данные таблицы могут быть только для чтения или редактируемыми. Каждой ячейке таблицы может быть поставлен в соответствие некоторый объект.

Компонент StringGrid предназначен в первую очередь для отображения таблиц текстовой информации. Однако этот компонент может отображать и графическую информацию.

Основные свойства компонента, определяющие отображаемый текст

Cells[ACol, ARow: Integer]: string – Строка, содержащаяся в ячейке с индексами столбца и строки ACol и ARow.

ColCount : Longint – число столбцов

RowCount : Longint – число строк,

В таблицу TStringGrid невозможно занести что-то во время проектирования. Поэтому тексты или изображения в ячейки заносятся в обработчиках каких-то событий. В качестве простого примера ниже приведен код, заносящий во все ячейки таблицы тексты, содержащие номера ячеек:

var i, j: integer;

...

for i:=0 to StringGrid1.ColCount - 1 do

for j:=0 to StringGrid1.RowCount - 1 do

StringGrid1.Cells[j, i] := IntToStr(i) + ':' + IntToStr(j);

Подобный код (конечно, с более осмысленными текстами) можно вставить, например, в обработчик события OnCreate формы, чтобы обеспечить соответствующий вид таблицы при открытии приложений. А затем можно предоставить пользователю возможность редактирования текстов.

FixedCols : Integer число фиксированных, непрокручиваемых столбцов

FixedRows : Integer число фиксированных, непрокручиваемых строк.

Пример считывания и записи матрицы из/в компонент StringGrid. На форме расположены 3 компонента StringGrid: strgrdA, strgrdB, strgrdResult; 2 кнопки btnRead и btnWrite. При нажатии на кнопку btnRead выполняется считывание 2-х массивов из компонент StringGrid .

type

TMatrix = array of array of integer;

TfrmMatrices = class(TForm)

strgrdB: TStringGrid;

strgrdA: TStringGrid;

strgrdResult: TStringGrid;

btnRead: TButton;

btnWrite: Tbutton;

procedure btnRead(Sender: TObject);

procedure btnWrite(Sender: TObject);

private

{ Private declarations }

procedure ReadMatrix(var fg: TMatrix; StringGrid: TStringGrid);

procedure WriteMatrix(var fg: TMatrix; StringGrid: TStringGrid);

public

{ Public declarations }

end;

var

frmMatrices: TfrmMatrices;

A, B: TMatrix;

implementation

{$R *.dfm}

procedure TfrmMatrices.ReadMatrix(var fg: TMatrix; StringGrid: TStringGrid);

var

i, j: integer;

begin

SetLength(fg, StringGrid.RowCount, StringGrid.ColCount);

with StringGrid do

begin

for i:= 0 to RowCount-1 do

for j:= 0 to ColCount-1 do

begin

fg[i, j] := StrToInt(Cells[j, i]);

end;

end;

end;

procedure TfrmMatrices.WriteMatrix(var fg: TMatrix; StringGrid: TStringGrid);

var

i, j: integer;

begin

StringGrid.ColCount := Length(fg[0]);

StringGrid.RowCount := Length(fg);

for i:= 0 to Length(fg)-1 do

for j:= 0 to Length(fg[i])-1 do

StringGrid.Cells[j, i] := IntToStr(fg[i, j]);

end;

procedure TfrmMatrices.btnRead(Sender: TObject);

begin

try

ReadMatrix(A, strgrdA);

ReadMatrix(B, strgrdB);

except

on EConvertError do

begin

MessageDlg('Ошибка конвертирования. В поля можно вводить только числа.' +

#13#10 + 'Все ячейки должны быть заполнены', mtError, [mbOK], 0);

exit;

end;

end;

Задание 1. Напишите обработчик нажатия кнопки btnWrite в котором выведите элементы массива А в StringGrid.

Col : Longint – Индекс столбца, содержащего выделенную ячейку

Row : Longint – Индекс строки выделенной ячейки

Cols[Index: Integer]: TStringsСписок строк, содержащихся в столбце с индексом Index.

Rows[Index: Integer]: TStrings Список строк, содержащихся в строке с индексом Index.

Objects [ACol, ARow: Integer]:TObjectОбъект, связанный со строкой, содержащейся в ячейке с индексами столбца и строки ACol и ARow

Все эти свойства доступны во время выполнения. Задавать тексты можно программно или по отдельным ячейкам, или сразу по столбцам и строкам с помощью методов класса TStrings.

FixedColor : TColor, где TColor = -$7FFFFFFF-1..$7FFFFFFF; Цвет фона фиксированных ячеек

ColWidths [Index: Longint]: Integer – Указывает ширину в пикселях указанного столбца таблицы

RowHeights [Index: Longint]: Integer; – Высота строки с указанным индексом

DefaultColWidth : Integer; – Ширина в пикселях всех столбцов таблицы, размеры которых явно не изменялись

DefaultRowHeight : Integer; – Высота в пикселях всех строк таблицы, размеры которых явно не изменялись

LeftCol : Longintопределяет индекс первого видимого на экране в данный момент прокручиваемого столбца.

TopRow : Longintопределяет индекс первой видимой прокручиваемой строки.

ScrollBars : TScrollStyle, где TScrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth); – определяет наличие в таблице полос прокрутки. Причем полосы прокрутки появляются и исчезают автоматически в зависимости от того, помещается таблица в соответствующий размер, или нет.

Свойство Options является множеством, определяющим многие свойства таблицы:

goEditing – возможность редактировать содержимое таблицы (по умолчанию False).

goTabs – пользователь может перемещаться по ячейкам, используя Tab и Shift+Tab(по умолчанию False).

goAlwaysShowEditorпри переходе в ячейку, ее содержимое выделяется для редактирования (по умолчанию False). Если goEditing установлено в False, то значение goAlwaysShowEditor игнорируется.

goFixedVertLine и goFixedHorzLine – наличие разделительных вертикальных и горизонтальных линий в фиксированных ячейках (по умолчанию True).

goVertLine и goHorzLine – наличие разделительных вертикальных и горизонтальных линий в нефиксированных ячейках (по умолчанию True).

goColSizing и goRowSizing – возможность для пользователя изменять с помощью мыши размеры столбцов и строк (по умолчанию False),

goColMoving и goRowMoving возможность для пользователя перемещать столбцы и строки

(по умолчанию False)

и многое другое

В основном компонент StringGrid используется для выбора пользователем каких-то значений, отображенных в ячейках. Возможно также выделение пользователем множества ячеек, строк и столбцов.

Чтобы разрешить редактирование в таблице TStringGrid, надо включить в ее свойстве Options опцию goEditing. Во время проектирования это можно сделать с помощью Инспектора Объектов. Во время выполнения это делается оператором:

StringGrid1.Options := StringGrid1.Options + [goEditing];

Если вы разрешаете пользователю редактировать данные, то имеет смысл разрешить пользователю и изменять ширину столбцов (опция goColSizing свойства Options), а возможно, и разрешить ему переставлять столбцы (опция goColMoving). Если разрешение этих операций надо делать программно, приведенный выше оператор изменится следующим образом:

StringGrid1.Options := StringGrid1.Options +

[goEditing, goColSizing, goColMoving];

Selection :TGridRect Указывает область текущего выделения ячеек.

TGridRect = record

case Integer of

0: (Left, Top, Right, Bottom: Longint);

1: (TopLeft, BottomRight: TGridCoord);

end;

Пример

При потере фокуса таблицей TStringGrid ячейки, которые до этого были выделены, остаются закрашенными, что в ряде случаев создает неприятный эффект и отвлекает внимание пользователя. Устранить это проще всего, удалив выделение при потере таблицей фокуса, т.е. в обработчике события OnExit:

procedure TForm1.StringGrid1Exit(Sender: TObject);

begin

StringGrid1.Selection := TGridRect(Rect(-1, -1, -1, -1));

end;

(функция Rect создает структуру TRect с указанными координатами, затем выполняется приведение типа TRect к типу TGridRect)

В этом коде выделение указывается ячейками с отрицательными индексами. Поскольку таких индексов не бывает, выделение просто снимается.

В некоторых случаях недостатком такого подхода может являться то, что при повторном получении таблицей фокуса в ней не запоминается предшествующее выделение. Это нетрудно исправить, если ввести глобальную переменную, в которой будет запоминаться предшествующее выделение, и из которой оно будет восстанавливаться при получении таблицей фокуса, т.е. в обработчике события OnEnter:

var SelRect: TGridRect;

...

procedure TForm1.StringGrid1Exit(Sender: TObject);

begin

SelRect := StringGrid1.Selection;

StringGrid1.Selection := TGridRect(Rect(-1, -1, -1, -1));

end;

procedure TForm1.StringGrid1Enter(Sender: TObject);

begin

StringGrid1.Selection := SelRect;

end;