Вывод табличных данных

 

На одной из знаменитых гравюр Альбрехта Дюрера изображен магический квадрат. Одним из его свойств является то, что суммы по всем столбцам, строкам и диагоналям равны.

Цель работы -создать программу, рассчитывающую суммы по столбцам и строкам вводимых чисел.

Рисунок 53

 

 


1. Добавить на форму сетку – компонент StringGrid. Этот компонент служит для ввода и вывода табличных данных.

2. Необходимо ввести данные и описать событие реагирования на их ввод. В свойстве Options установите пункт Editing, иначе сетка будет доступной только для чтения. Теперь при запуске программы можно вводить текст.

3. Щелкнув мышкой в Инспекторе Объектов, описать обработчик события OnSelectCell, которое возникает, когда пользователь выбирает какую-либо ячейку для редактирования.

4. Теперь при запуске программы и выборе ячейки в заголовке формы отображается информация о столбце и строке ввода.

5. Таким образом, в разделе uses возникла ссылка на модуль Grids, в котором описаны компоненты сеток. В описании класса формы добавилась переменная – ссылка на компонент сетки, а также описание метода – обработчика события. Сам обработчик описан уже в разделе implementation.

6. Обработать событие, возникающее, когда пользователь пытается выделить какую-нибудь ячейку.

procedure Tform1.StringGrid1SelectCell(Sender: Tobject; Acol, Arow: Integer;

var CanSelect: Boolean);

Begin

Caption := ‘Выделена клетка (‘ + IntToStr(Acol) + ‘:’ + IntToStr(Arow) + ‘) ‘;

End;

 

В качестве параметров обработчик получает (кроме Sender) номер столбца, номер строки и переменную CanSelect, которую можно изменить внутри обработчика, так как она передается как var.

 

Рисунок 54

 


Можно, например, запретить выделение ячеек третьего столбца. Для этого вставьте в этот обработчик еще строчку: CanSelect := (Acol <> 3);

В этом случае CanSelect будет равен false, если Acol = 3.

7. Настроить сетку в зависимости от значения констант, которые надо объявить в interface. Теперь при запуске программы сетка имеет размер, заданный в константе, и выглядит значительно аккуратнее. Если изменить значение константы, то при запуске и размер сетки будет соответствующим.

8. Установить размер сетки согласно значению констант Num и сSize, объявленных в interface:

const Num = 4;
cSize = 30;

……

procedure Tform1.FormCreate(Sender: Tobject);
begin
.DefaultColWidth := cSize;
MyGrid.DefaultRowHeight := cSize;
MyGrid.ColCount := Num;
MyGrid.RowCount := Num;
MyGrid.Width := Num * (cSize + 1) + 3;
MyGrid.Height := Num * (cSize + 1) + 3;
MyGrid.Font.Size := cSize div 2;
end;

Рисунок 55

 

 


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

9. Для расчета суммы по столбцам и строкам вводимых чисел написать собственную процедуру и две функции.

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

Теперь надо создать обработчик для нажатия на саму форму и описать в нем вызов расчета. Собственная процедура стоит в коде раньше, чем обработчик, из которого она вызывается. Когда описывается собственная процедура, нужно обращаться к компонентам через форму.

При запуске программы требуется ввести числа в сетку и кликнуть на саму форму.

Function ColSum(n: integer): integer;
var
i: integer;
begin
Result := 0;
for I := 1 to Num – 1 do Result := Result + StrToInt (Form1.MyGrid.Cells[n, i]);
end;
functionRowSum(n: integer): integer;
var
i: integer;
begin
Result := 0;
for I := 1to Num – 1 do Result := Result + StrToInt(Form1.MyGrid.Cells[I, n]);
end;

procedure Calculate;
var i: integer;
begin
forI := 1 to Num – 1do
begin
Form1.MyGrid.Cells[I, 0] := IntToStr(ColSum(i));
Form1.MyGrid.Cells[0, i] := IntToStr(RowSum(i));
end;
end;

В данной программе используется свойство Cells, компонента сетки. Это свойство имеет тип двумерного массива строк. Счет в этом массиве начинается с нуля. Фиксированные (серые) клетки, с точки зрения индексирования массива, ничем не отличаются от прочих. В нашем случае фиксированы первая строка и первый столбец (в массиве они имеют соответствующие нулевые координаты). Поэтому при расчете суммы проходят от 1 (а не от 0) до Num – 1 (при индексировании с нуля последний столбец/строка имеют, понятно, номер Num – 1).

Однако, если произойдет ввод какой-нибудь буквы, сразу возникнет исключительная ситуация. Она, очевидно, возникает из-за невозможности перевода буквы в число в функции StrToInt. Если нежелательно, чтобы при возникновении исключительной ситуации программа в Delphi переходила в режим отладки, можно отключить флажок Menu => Tools => Debugger Options => Language Exceptions => Stop on Delphi Exceptions. Теперь программа будет выполняться так, как если бы она выполнялась из-под Windows. Теперь каждый раз, когда вводится нечисловой символ, программа не останавливается, а только появляется стандартное окно Windows с сообщением об ошибке.

С помощью обработки исключений можно избежать появления этого окна. Для этого надо добавить в функцию конструкцию try..except. Таким образом «опасная» команда (или целый блок) помещается внутрь конструкции try..except..end или try..finally..end:

function StrToVal(s: string): integer;
begin
if S = ‘’ then Result := 0 else
try
Result := StrToInt(s);
except
Result := 0;
Form1.Caption := ‘Вводить надо числа!’;
end;
end;

Если возникает исключительная ситуация, т.е. введено нечисловое значение, считается, что введен ноль, а также выводится сообщение об этом пользователю. Еще нужно добавить вывод информации, что все в порядке. А также удалить код внутри обработчика Click формы. В результате, если введено неправильное значение, то окно ошибки не появляется, а в Caption формы выводится напоминание.









Дата добавления: 2014-12-02; просмотров: 841;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.008 сек.