- •Введение
- •Состав курсовой работы
- •Задание на курсовую работу
- •Объем курсовой работы
- •Разработка алгоритмов
- •Разработка расчетного модуля
- •Разработка приложения
- •Составление описания приложения
- •Порядок выполнения курсовой работы.
- •Разработка расчетного модуля.
- •Создание описания данных.
- •Создание функций сохранения и чтения матрицы.
- •Разработка расчетных процедур и функций.
- •Отсортировать по возрастанию все строки матрицы.
- •Отладка процедур и функций расчетного модуля.
- •Разработка модуля главного окна приложения.
- •Разработка модуля окна редактирования матрицы.
- •Разработка окна информации о разработчике.
- •Разработка описания и инструкции пользователя.
- •Оформление пояснительной записки
- •Титульный лист, содержание
- •Описание приложения
- •Алгоритмы, исходные данные и результаты расчета
- •Текст модулей проекта
- •Список использованной литературы
- •Приложение. Таблица вариантов
- •Литература.
16
2.3Разработка модуля окна редактирования матрицы.
Вданном модуле описана функция редактирования матрицы и окно редактирования.
Для создания этого модуля необходимо в проект добавить новое окно, переместить его из списка автоматически создаваемых (Auto-create forms) в список доступных форм (Available forms) . Пример оформления интерфейса окна приведен на рис.3.
RowCountSe
DataEd
ColCountSe
DataSg
Button1 Button2
Рис. 3. Вид окна редактирования матрицы.
В данном окне использованы следующие основные компоненты: RowCountSe: TSpinEdit – поле редактирования целого числа. Для
изменения количества строк матрицы;
ColCountSe: TSpinEdit – поле редактирования целого числа. Для изменения количества столбцов матрицы;
DataEd: TEdit – строковое поле редактирования. Используется для изменения значения выделенного элемента массива.
DataSg: TStringGrid – элемент управления для представления строковых данных в табличной форме. Используется для отражения и выбора значений элементов матрицы.
Button1: TButton – кнопка «Ok», предназначенная для подтверждения результатов редактирования.
17
Button2: TButton – кнопка «Cancel», предназначенная для отмены результатов редактирования.
Вид интерфейсной части модуля приведен ниже.
unit Edit; interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, Spin, Menus, ToolWin, ActnMan, ActnCtrls, ActnMenus, CustomizeDlg, ComCtrls, Count;
type
TEditFm = class(TForm) RowCountSe: TSpinEdit; ColCountSe: TSpinEdit; DataEd: TEdit; DataSg: TStringGrid; Label1: TLabel; Label2: TLabel; Label3: TLabel; Button1: TButton; Button2: TButton;
procedure DataEdKeyPress(Sender: TObject; var Key: Char); procedure RowCountSeChange(Sender: TObject);
procedure ColCountSeChange(Sender: TObject); procedure DataSgSelectCell(Sender: TObject; ACol,
ARow: Integer;
var CanSelect: Boolean); private
Mt : TMatr; public
procedure SetSgText; end;
procedure EditMatr(var Mt : TMatr);
Следует обратить внимание, что в классе окна описана дополнительная переменная Mt, хранящая копию матрицы, что позволяет произвести откат (отмену редактирования) при отказе пользователя от результатов редактирования (нажатие кнопки «Cancel»).
Для редактирования матрицы, в модуль добавлена процедура EditMatr, которую и должен вызывать пользователь модуля. В ней производится динамическое создание окна с эго последующем уничтожением, копирование матрицы для ее редактирования, показ модального окна редактирования. В случае подтверждения пользователем результатов редактирования производится обратное копирование исправленной матрицы. Текст процедуры приведен в следующем листинге.
18
procedure EditMatr(var Mt : TMatr); var
EditFm: TEditFm; begin
EditFm := TEditFm.Create(Application); EditFm.Mt.NI := Mt.NI;
EditFm.Mt.NJ := Mt.NJ; EditFm.Mt.Data := copy(Mt.Data);
EditFm.RowCountSe.Value := Mt.NI;
EditFm.ColCountSe.Value := Mt.NJ;
EditFm.DataSg.ColCount := Mt.NJ+1;
EditFm.DataSg.RowCount := Mt.NI+1;
EditFm.SetSgText;
EditFm.DataEd.Text := EditFm.DataSg.Cells[1,1];
EditFm.Label3.Caption := 'Значение[1,1]';
if EditFm.ShowModal = mrOk then begin Mt.NI := EditFm.Mt.NI;
Mt.NJ := EditFm.Mt.NJ;
Mt.Data := copy(EditFm.Mt.Data); end;
EditFm.Free; end;
Обработчики событий в окне редактирования поясняются далее.
Два обработчика события OnChange связанные с изменением размеров матрицы (для компонентов RowCountSe и ColCountSe). В них производится установка размера матрицы, для изменения состояния интерфейса вызывается процедура SetSgText.
procedure TEditFm.RowCountSeChange(Sender: TObject); begin
DataSg.RowCount := RowCountSe.Value+1; Mt.NI := RowCountSe.Value;
SetLength(Mt.Data,DataSg.RowCount-1,DataSg.ColCount-1); SetSgText;
end;
procedure TEditFm.ColCountSeChange(Sender: TObject); begin
DataSg.ColCount := ColCountSe.Value+1; Mt.NJ := ColCountSe.Value;
SetLength(Mt.Data,DataSg.RowCount-1,DataSg.ColCount-1); SetSgText;
end;
Процедура изменения состояния интерфейса SetSgText приведена ниже. В ней серыt поля (первые строка и столбец в компоненте DataSg, при этом у компонента должны быть выставлены следующие свойства FixedRow = 1 и
19
FixedCol =1) заносятся значения номеров строк и столбцов, в белые – значения элементов матрицы.
procedure TEditFm.SetSgText; var
I,J : Integer; begin
for I := 1 to DataSg.RowCount - 1 do DataSg.Cells[0,I] := IntToStr(I); for I := 1 to DataSg.ColCount - 1 do DataSg.Cells[I,0] := IntToStr(I); for I := 1 to DataSg.RowCount - 1 do
for J := 1 to DataSg.ColCount - 1 do DataSg.Cells[J,I] := FloatToStrF(Mt.Data[I-1,J-1],
ffFixed,8,3);
end;
Следующие два обработчика предназначены для функционирования интерфейса редактирования в целом (обработчик события OnKeyPress у компонента DataEd и обработчик события OnSelectCell компонента DataSg). Первый блокирует ввод нецифровых символов при редактировании значения элемента матрицы, производит преобразование текста в поле редактирования в значение при нажатии клавиши Enter и переводит фокус редактирования на следующий элемент. Второй обеспечивает выбор редактируемого элемента матрицы в таблице.
procedure TEditFm.DataEdKeyPress(Sender: TObject; var Key: Char); var
FVal : Double; Kt : Char;
begin
if Key = #13 then begin try
FVal := StrToFloat(DataEd.Text); Mt.Data[DataSg.Row-1,DataSg.Col-1] := FVal; DataEd.Text := FloatToStrF(Mt.Data[DataSg.Row-1,
DataSg.Col-1],ffFixed,8,3); DataSg.Cells[DataSg.Col,DataSg.Row] := DataEd.Text;
except
on E:EConvertError do begin
DataEd.Text := DataSg.Cells[DataSg.Col,DataSg.Row]; Exit;
end; end;
if DataSg.Col < DataSg.ColCount-1 then DataSg.Col := DataSg.Col + 1
else if DataSg.Row < DataSg.RowCount-1 then begin DataSg.Row := DataSg.Row + 1;
DataSg.Col := 1; end else begin