- •5.2.5. Линейка Dialogs
- •5.4. Пример «Перевод в двоичную систему счисления»
- •Глава 6. Структурные типы данных
- •6.1. Совместимость типов
- •6.2. Массивы
- •6.2.1. Статические массивы
- •6.2.2. Физическая структура
- •6.2.3. Операции
- •6.2.4. Компоненты grid
- •6.2.5. Пример 1: умножение матрицы на строку
- •6.2.6. Динамические массивы
- •6.2.7. Пример 2. Неповторяющиеся элементы массива
6.2.5. Пример 1: умножение матрицы на строку
Рассмотрим задачу умножения матрицы 3*3, состоящую из целых чисел, на столбец с использованием компонентов TStringGrid.
Создадим новый проект и на форму выставим три компонента TStringGrid и кнопку Button1. В первых двух таблицах данные будут вводиться, а в третьей будет выводится столбец результата умножения.
В Инспекторе Объектов изменим свойства компонентов:
StringGrid1 |
||
ColCount |
3 |
Число столбцов |
RowCount |
3 |
Число строк |
DefaultColWidth |
60 |
Ширина колонок |
DefaultRowHeight |
20 |
Высота строк |
FixedCols |
0 |
Нет фиксированных столбцов |
FixedRows |
0 |
Нет фиксированных строк |
Options |
[…,goEditing] |
Ячейки можно редактировать |
StringGrid2 |
||
ColCount |
1 |
Число столбцов |
RowCount |
3 |
Число строк |
DefaultColWidth |
60 |
Ширина колонок |
DefaultRowHeight |
20 |
Высота строк |
FixedCols |
0 |
Нет фиксированных столбцов |
FixedRows |
0 |
Нет фиксированных строк |
Options |
[…,goEditing] |
Ячейки можно редактировать |
StringGrid3 |
||
ColCount |
1 |
Число столбцов |
RowCount |
3 |
Число строк |
DefaultColWidth |
60 |
Ширина колонок |
DefaultRowHeight |
20 |
Высота строк |
FixedCols |
0 |
Нет фиксированных столбцов |
FixedRows |
0 |
Нет фиксированных строк |
Button1 |
||
Caption |
Exit |
|
Рис.
6.4
В результате форма должна принять вид как на рис. 6.4.
Мы будем разрешать ввод только целых чисел и, поэтому, на событие onGetEditMask компонента StringGrid1 создадим обработчик события, задающий маску редактора строки:
procedure TForm1.StringGrid1GetEditMask(Sender:
TObject; ACol,ARow: Integer; var Value: String);
begin
Value :='00000;1; ';
end;
Точно такой же обработчик события создадим для компонента StringGrid2.
Для первоначального заполнения таблиц в момент активизации формы заполним нулями ячейки таблиц StringGrid1 и StringGrid2:
procedure Tform1.FormActivate(Sender: Tobject);
var
i,j: byte;
begin
with StringGrid1 do
for i:=0 to ColCount-1 do
for j:=0 to RowCount-1 do Cells[i,j]:='0';
with StringGrid2 do
for i:=0 to RowCount-1 do Cells[0,i]:='0';
end;
Основное событие таблицы StringGrid1 (заполнение ячеек третьей таблицы) назначим на событие onSetEditText, возникающее при изменении содержимого ячейки:
procedure Tform1.StringGrid1SetEditText(Sender:
Tobject; Acol,Arow: Integer; const Value: String);
var
i,j,Sum: integer;
begin
for j:=0 to StringGrid1.ColCount-1 do
begin
Sum:=0;
for i:=0 to StringGrid1.ColCount-1 do
begin
Sum:=Sum+MyStrToInt(StringGrid1.Cells[i,j])*
MyStrToInt(StringGrid2.Cells[0,i]);
end;
StringGrid3.Cells[0,j]:=IntToStr(Sum);
end;
end;
Такое же событие для компонента StringGrid2 в Инспекторе Объектов направим на событие StringGrid1SetEditText.
Преобразование содержимого ячеек реализует целочисленная функция MyStrToInt:
function TForm1.MyStrToInt(s: string): integer;
var
k,Code: integer;
begin
while (s<>'') and (s[Length(s)]=' ') do
Delete(s,Length(s),1);
if s<>'' then
begin
Val(s,k,Code);
if Code=0
then MyStrToInt:=k
else MyStrToInt:=0;
end
else MyStrToInt:=0;
end;
которая очищает строку от пробелов и проверяет возможность преобразования строки в число.