Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУКР ОПр.pdf
Скачиваний:
8
Добавлен:
11.02.2016
Размер:
972.13 Кб
Скачать

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