Лабораторная работа 43
Разработка многооконного приложения
Двумерные массивы удобно вводить через компонент StringGrid, который находится на вкладке Additional (Дополнительная). В отличии от работы с одномерными массивами надо указывать количество строк и столбцов (RowCount, ColCount). Обращение к ячейке осуществляется следующим образом: StringGrid1.Cells[столбец,строка].
Внимание: На первом месте всегда номер столбца.
Выводить элементы массива можно в компонент StringGrid или на форму через метку Label.
Рассмотрим ввод и вывод элементов массива на конкретных задачах.
Задача №1. Найти в целочисленном массиве минимальный и максимальный элементы и поменять их местами.
Ввод элементов массива осуществляется через StringGrid, а вывод результатов на форму через Label (см. рис.1). На форме помещены три кнопки: Вычислить, Сброс, Выход.
При нажатии кнопки Вычислить активизируется следующая процедура:
procedure TForm1.Button1Click(Sender: TObject);
var a: array [1..5,1..5] of integer;
max,min,i,j,maxi,maxj,mini,minj: integer;
Begin
for j:=1 to 5 do
Begin
for i:=1 to 5 do
Begin
a[i,j]:=strtoint(StringGrid1.Cells[i-1,j-1]);
label5.Caption:=Label5.Caption+inttostr(a[i,j])+' ';
end;
label5.Caption:=Label5.Caption+#13;
end;
max:=a[1,1]; maxi:=1; maxj:=1;
min:=max; mini:=1; minj:=1;
for j:=1 to 5 do
for i:=1 to 5 do
begin if a[i,j]>max then begin max:=a[i,j];
maxi:=i;
maxj:=j
end;
if a[i,j]<min then begin min:=a[i,j];
mini:=i;
minj:=j;
end;
end;
a[maxi,maxj]:=min;
Label7.Caption:='max='+inttostr(max);
a[mini,minj]:=max;
Label8.Caption:='min='+inttostr(min);
for j:=1 to 5 do
Begin
for i:=1 to 5 do
label6.Caption:=Label6.Caption+inttostr(a[i,j])+' ';
label6.Caption:=Label6.Caption+#13;
end;
end;
Текст процедуры обработки события KeyPress приведен ниже. Процедура осуществляет контроль вводимых данных, разрешая вводить в ячейку таблицы только цифры. Перемещение курсора в нужную ячейку таблицы осуществляется по нажатию клавиши Enter. Свойства Col и Row содержат соответственно номера колонки и строки таблицы, в которой находится курсор. Надо учитывать, что колонки и строки нумеруются с нуля.
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
Begin
case key of
#8,'0'..'9':;
#13: begin if stringGrid1.Col< stringGrid1.ColCount-1
then stringGrid1.Col:=stringGrid1.Col+1 {переход на следующую колонку}
Else begin
if stringGrid1.Row< stringGrid1.RowCount-1
Then
begin stringGrid1.col:=0;
stringGrid1.Row:=stringGrid1.Row+1 {переход на следующую строку}
end;
end;
end;
else key:=Chr(0);
end;
end;
При нажатии кнопки Сброс происходит очистка полей ввода-вывода:
procedure TForm1.Button2Click(Sender: TObject);
var i,j: integer;
Begin
for j:=1 to 5 do
for i:=1 to 5 do
StringGrid1.Cells[i-1,j-1]:='';
label5.Caption:='';
label6.Caption:='';
label7.Caption:='';
label8.Caption:='';
stringGrid1.col:=0; {установка курсора в позицию 0,0 таблицы}
stringGrid1.row:=0;
end;
При нажатии кнопки Выход происходит закрытие приложения. См. предыдущие работы.
Задача №2: В целочисленной квадратной матрице (массиве) найти максимальный элемент среди элементов, лежащих на главной диагонали и ниже ее.
В этой задаче элементы массива вводятся через генератор случайных чисел, а вывод осуществляется в компонент StringGrid. Вид формы см. на рис.2.
|
При нажатии кнопки Вычислить активизируется следующая процедура:
procedure TForm1.Button1Click(Sender: TObject);
var a: array [1..5,1..5] of integer;
max,min,i,j,maxi,maxj,mini,minj: integer;
begin randomize; {активизация генератора случайных чисел}
for j:=1 to 5 do
for i:=1 to 5 do
Begin
a[i,j]:=random(50); {заполнение массива}
StringGrid1.Cells[i-1,j-1]:=inttostr(a[i,j]); {вывод элементов массива в таблицу StringGrid}
end;
max:=a[1,1]; maxi:=1; maxj:=1;
for j:=1 to 5 do
for i:=1 to j do
begin if a[i,j]>max then begin max:=a[i,j];
maxi:=i;
maxj:=j
end;
end;
Label2.Caption:='max='+inttostr(max); {вывод найденного значения}
Label3.Caption:='i='+inttostr(maxj)+' j='+inttostr(maxi);
end;
При нажатии клавиши Сброс происходит очистка полей вывода:
procedure TForm1.Button2Click(Sender: TObject);
var i,j:i nteger;
Begin
for j:=1 to 5 do
for i:=1 to 5 do
StringGrid1.Cells[i-1,j-1]:='';
label2.Caption:='';
label3.Caption:='';
stringGrid1.col:=0;
stringGrid1.row:=0;
end;
Реакция на нажатие клавиши Выход аналогична рассмотренной ранее.
В заключении можно сказать, что обработка двумерных массивов Delphi осуществляется так же как и в языке Pascal. Отличие заключается только в формах ввода-вывода элементов массива. Надо помнить, что в Delphi:
· на первом месте стоит номер колонки, а на втором – номер строки
· колонки и строки нумеруются с нуля.
Задача №3: Работа со списками
Компонент UpDown – счѐтчик предназначен для пошагового регулирования числовой величины. Он имеет пару кнопок, с помощью которых величина наращивается или уменьшается. Сам по себе этот элемент не имеет возможности что–либо менять, а обычно его связывают с текстовым полем Edit, которое отображает регулируемую величину.
Связанный компонент называется компаньоном. Сам компонент UpDown находится во вкладке Win32.
Свойства компонента UpDown
Компонент ListBox – список, представляет собой стандартный для Windows список, с помощью которого пользователь может выбрать один или несколько пунктов. В этом компоненте предусмотрена возможность программной прорисовки пунктов, поэтому список может содержать не только текстовые строки, но и произвольные изображения.