Компоненты таблицы имеют форму и функциональные возможности электронных таблиц. В компоненте DrawGrid можно отображать какие-либо данные (числа, рисунки, пиктограммы) в форме таблиц. Кроме того, имеется возможность редактировать данные в каждой ячейке по отдельности. С помощью компонента StringGrid можно обрабатывать строки
и связанные с ними объекты, в полной мере пользуясь возможностями компонента DrawGrid.
С помощью инспектора объектов в свойстве ColCount можно определить количество строк, а в свойстве RowCount задать количество столбцов. Свойства DefaulColWidth и DefaulRowWidth задают ширину всех строк и высоту всех столбцов. Свойство ScrollBar является логическим
и определяет наличие линеек прокрутки. Логическое свойство DefaultDrawing показывает, отображается ли содержание ячейки автоматически. Если данное свойство имеет значение True, то происходит автоматическое отображение содержимого, в противном случае необходимо создавать свои средства отображения.
Каждая таблица должна иметь ячейки, в которых будет выводиться служебная информация, постоянно находящаяся на экране, даже если применяются линейки прокрутки. Поэтому существуют свойства FixedCol, FixedRows и FixedColor, задающие количество фиксированных строк и столбцов таблицы, их цвет (по умолчанию FixedCol=1 и FixedRows=1). Любая таблица должна иметь хотя бы одну строку и один столбец подобных ячеек. Необходимо помнить, что нумерация и строк, и столбцов начинается с нуля. Поэтому, если оставить одну фиксированную строку и столбец, нумерация, доступная для редактирования, будет начинаться с 1.
Рисунок 19
С помощью составного свойства Options можно задать флаги, определяющие поведение таблицы. Среди них отметим следующие: goEditing — показывает, может ли редактироваться содержимое ячеек, goAlweysShowEditing — определяет, становится ли выделенная ячейка сразу и активной (в противном случае ячейка активизируется либо нажатием клавиши F2, либо двойным щелчком мыши, либо нажатием произвольной символьной клавиши).
На рисунке 19 изображена форма с компонентом StringGrid. Большинство описанных свойств представлены в инспекторе объектов.
Следует знать в виду, что в силу своей универсальности таблица типа DrawGrid не имеет конкретного средства отображения реальных изображений в ячейках таблицы и для каждого нового вида изображений необходимо создавать свои средства, поэтому остановимся более подробно на таблице типа StringGrid.
Для доступа к ячейкам таблицы на этапе выполнения программы можно воспользоваться свойствами Cells[ACol, ARow], Cols[ACol], Rows[ARow].
Cells[ACol, ARow] определяет ячейку, находящуюся в столбце ACol
и строке ARow;
Cols[ACol] определяет колонку;
Rows[ARow] определяет строку.
Значения целочисленных свойств Col и Row, допустимых только во время выполнения, указывают на активную в данный момент ячейку, строку или столбец.
При работе с таблицами дополнительно обрабатываются события, связанные с изменениями в ячейках.
Замечание. На этапе проектирования заполнять таблицу начальными данными нельзя.
Пример 1
Заполнить таблицу произвольного размера произвольными числами.
Поместим на форму компонент StringGrid, где будем располагать числа; два компонента Edit, в которых будут вводиться размеры таблицы; кнопку Button, при нажатии на нее произойдет заполнение таблицы. Тогда процедура будет иметь следующий вид:
procedure TForm1.Button1Click(Sender: TObject);
var i,j:Integer;
begin
with StringGrid1 do
begin
ColCount:=StrToInt(Edit1.Text)+1;
RowCount:= StrToInt(Edit1.Text)+1;
for i :=1 to ColCount do
for j:=1 to RowCount do
Cells[i,j]:=IntToStr(50-Random(100));
end;
end;
Пример 2
В числовой таблице, заданной произвольным образом, подсчитать количество отрицательных значений в каждой строке и в дополнительном столбце.
procedure TForm1.Button2Click(Sender: TObject);
var i,j,k:Integer;
begin
with StringGrid1 do
begin
ColCount:= StrToInt(Edit1.Text)+2;
for i:=1 to RowCount-1 do
begin
k:=0;
for j:=1 to ColCount-2 do
If StrToInt(Cells[j,i])<0 Then k:=k+1;
Cells[ColCount-1,i]:=IntToStr(k);
end;
end;
end;
При использовании компонента DrawGrid элементом каждой ячейки является рисунок класса TRect, возможности обработки которого будут продемонстрированы нами в лабораторной работе 7 при изучении графических возможностей.
При работе с компонентом StringGrid имеется один досадный факт,
а именно — в отличие от компонентов Memo и RichEdit в таблицах нет возможности сразу записать все содержимое в файл. Поэтому для работы с файлами данные процедуры необходимо писать самостоятельно. В следующем примере представлены две процедуры, одна из которых записывает содержимое в файл, а вторая читает содержимое из файла, используя только стандартные средства языка программирования Pascal. Это, соответственно, процедуры SaveGrid и LoadGrid. Если не совсем понятно содержимое данных процедур, то соответствующий материал рекомендуется повторить.
Procedure SaveGrid;
var f:textfile;
x,y:integer;
Begin
assignfile (f,’Filename’);
rewrite (f);
writeln (f, StringGrid1.colcount);
writeln (f, StringGrid1.rowcount);
For X:=0 to StringGrid1.colcount-1 do
For y:=0 to StringGrid1.rowcount-1 do
writeln (F, StringGrid1.cells[x,y]);
closefile (f);
end;
Procedure LoadGrid;
var f:textfile;
temp,x,y:integer;
tempstr:string;
begin
assignfile (f,’Filename’);
reset (f);
readln (f,temp);
StringGrid1.colcount:=temp;
readln (f,temp);
StringGrid1.rowcount:=temp;
For X:=0 to StringGrid1.colcount-1 do
For y:=0 to StringGrid1.rowcount-1 do
begin
readln (F, tempstr);
stringgrid.cells[x,y]:=tempstr;
end;
closefile (f);
end;
Задания:
1. Проверьте все примеры из лабораторной работы.
2. Дана таблица размера n×n, посчитайте количество четных элементов главной диагонали.
3. Заполните две таблицы случайными числами и перемножить их по правилу перемножения матриц. Ответ выводится в третьей таблице.
4. Дана таблица размера n×n. Забейте таблицу случайными числами
и отразите элементы относительно главной диагонали.
5. Реализуйте на языке программирования Delphi задания из лабораторных работ по теме «Массива».
Лабораторная работа 6. Окна сообщений и диалоговые окна
Цель: изучить возможности формирования сообщений и использования диалоговых компонентов.
До сих пор нами рассматривались те компоненты, которые не только могут располагаться на форме, но и при выполнении остаются там же. Однако часто возникает необходимость в выдаче каких-либо сообщений или получении определенной информации от пользователя. Для этой цели в языке программирования Delphi имеются некоторые функции, процедуры и компоненты.
Процедура ShowMessage (Msg:String) формирует и выдает на экран окно с сообщением Msg. Помимо сообщения это окно имеет кнопку Ok, при нажатии на которую закрывается данное окно. Заголовок окна совпадает с названием приложения. При необходимости выдаваемая информация разбивается на строки. Окно, сформированное данной процедурой, так же, как и все окна, работает в модальном режиме, когда блокируется выполнение приложения до закрытия данного окна.
Процедура ShowMessagePos (Msg: String, X:Integer; Y:Integer) выдает окно так, чтобы его левый верхний угол находился в точке с абсолютными координатами (X, Y).
Пример использования данной процедуры может иметь следующий вид:
ShowMessage (‘Текст содержит‘ +IntToStr (RichEdit1.Lines.Count ));
Данные процедуры позволяют выдавать на экран сообщение, но
не осуществлять выбор дальнейшего выполнения программы. Для этого служит функция MessageDlg, которая выдает окно с сообщением и набором кнопок.
Общий вид данной функции: MessageDlg(Msg:String; aType:TmsgDlg Type; aButton:TmsgDlgButton; HelpCtx: LongInt): Word;
В переменной Msg задается текст выдаваемого сообщения, в переменной aType тип окна. Всего имеется пять предопределенных окон сообщения, следовательно, параметр aType может иметь пять различных значений, которые перечислены в таблице 2.
Таблица 2. Значения параметра aType
Свойство | Описание |
mtWarning | Окно-предупреждение |
mtError | Окно-сообщение об ошибке |
mtInformation | Информационное окно |
mtConfirmation | Окно-подтверждение |
mtCustom | Окно-сообщение |
Параметр aButton определяет, какие кнопки будет содержать окно сообщения. Это параметр имеет тип множество, и его значение должно быть заключено в квадратные скобки. Для данного параметра могут задаваться значения, перечисленные в таблице 3.
Таблица 3. Значения параметра aButton
Значение | Описание |
mbYes | Кнопка Yes (Да) |
MbNo | Кнопка No (Нет) |
MbOk | Кнопка Ok |
mbCancel | Кнопка Cancel (Отмена) |
mbHelp | Кнопка Help (Помощь) |
mbAbort | Кнопка Abort (Прекратить) |
mbIgnore | Кнопка Ignore (Игнорировать) |
mbAll | Кнопка All (Все) |
mbRetry | Кнопка Retry (Продолжить) |
Параметр HelpCtx определяет текст справки, которая должна выводиться, если пользователь нажмет клавишу [F1].