Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / Программирование в среде Delphi (Часть 2).pdf
Скачиваний:
89
Добавлен:
27.05.2015
Размер:
1.41 Mб
Скачать

Создание фигуры в момент загрузки программы и ее разрушение в момент завершения опишем следующим образом:

procedure TForm1.FormCreate(Sender: TObject); var

Temp : integer; begin

{Будем считать, что фигура имеет размер 1/4 от ширины поверхности рисования}

Temp := Image_I.ClientWidth div 4;

{Создание экземпляра класса с указанием начальных значений параметров фигуры}

Figure := TFigure.Create(

 

 

Image_I.ClientWidth div

2 - Temp div 2, // Координата Х

Image_I.ClientHeight-Temp,

// Координата Y

Temp,

 

// Размер фигуры

Image_I.ClientWidth,

// Размер поверхности рисования

Image_I.Canvas);

// Ссылка на поверхность рисования

Move_T.Enabled := True;

// Включение таймера

end;

 

 

procedure TForm1.FormDestroy(Sender: TObject);

begin

 

 

Move_T.Enabled := False;

// Выключение таймера

Figure.Free;

// Вызов деструктора родителя

end;

 

 

При срабатывании таймера, производится единичное перемещение фи-

гуры:

procedure TForm1.Move_TTimer(Sender: TObject); begin

Figure.Move;

end;

Внешний вид и пример работы программы показаны на рисунке 5.

2.5 Диалоговые окна

Задание: Элементом списка является информация о человеке, включающая ФИО, серию паспорта, номер паспорта (1-999999). Реализовать добавление и редактирование данных человека с использованием диалогового окна, а также удаление данных человека.

27

На форме диалогового окна (People_F) потребуются компоненты:FIO_E класса TEdit для ввода ФИО человека;
28

Рисунок 5 – Внешний вид и пример работы программы, реализующей работу с графикой

Для решения поставленной задачи на основной форме (Main_F) потребуются компоненты:

Spisok_LB класса TListBox для хранения и отображения списка лю-

дей;

Spisok_L класса TLabel для подписи компонента Spisok_LB;

Add_B класса TButton для активизации добавления данных о человеке;

Change_B класса TButton для активизации редактирования данных

выбранного человека;

Del_B класса TButton для активизации удаления данных выбранного человека.

Установим следующие значения свойств компонентов (таблица 5):

Таблица 5 – Значения свойств компонентов основной формы для примера программы, использующей диалоговые окна

Компонент.Свойство

Значение

Spisok_L.Caption

Спи&сок людей

Spisok_L.FocusControl

Spisok_LB

Add_B.Caption

Доб&авить

Change_B.Caption

И&зменить

Del_B.Caption

Уда&лить

Series_E класса TEdit для ввода серии паспорта человека;

Number_E класс TEdit для ввода номера паспорта человека;

FIO_L класса TLabel для подписи компонента FIO_E;

Series_L класса TLabel для подписи компонента Series_E;

Number_L класса TLabel для подписи компонента Number_E;

Ok_B класса TButton для подтверждения добавления или редактирова-

ния;

Cancel_B класса TButton для отмены добавления или редактирования. Установим следующие значения свойств компонентов (таблица 6):

Таблица 6 – Значения свойств компонентов диалогового окна для примера программы, использующей диалоговые окна

Компонент.Свойство

Значение

People_F.BorderStyle

bsDialog

 

 

FIO_L.Caption

ФИО &человека

FIO_L.FocusControl

FIO_E

Series_L.Caption

Се&рия паспорта

Series_L.FocusControl

Series_E

Number_L.Caption

Но&мер паспорта

Number_L.FocusControl

Number_E

Ok_B.Caption

Ok

Ok_B.Default

True

Ok_B.ModalResult

mrOk

Cancel_B.Caption

Отм&ена

Cancel_B.Cancel

True

Cancel_B.ModalResult

mrCancel

 

 

Очистим свойство «Text» у компонентов FIO_E, Series_E, Number_E.

Опишем событие OnCloseQuery формы People_F:

procedure TPeople_F.FormCloseQuery(Sender: TObject;

var CanClose: Boolean);

var

n : integer; begin

{Проверку следует проводить только при нажатии кнопки "Ok"} if ModalResult=mrOk then

{Будем использовать обработку исключительных ситуаций

для проверки на правильность ввода и вывода информации об

ошибках} try

{Проверка ФИО}

if Trim(FIO_E.Text)='' then // Если ничего не введено begin

{Перевод фокуса ввода на компонент FIO_E} FIO_E.SetFocus;

29

{Создание исключительной ситуации с текстом ошибки} raise Exception.Create('Вы не ввели ФИО человека');

end;

{Проверка серии паспорта}

if Trim(Series_E.Text)='' then begin

Series_E.SetFocus;

raise Exception.Create('Вы не ввели серию паспорта'); end;

{Получение значения номера паспорта} n := StrToInt(Number_E.Text);

{Проверка значения номера паспорта на вхождение в заданный диапазон}

if (n<1) or (n>999999) then begin

Number_E.SetFocus;

raise Exception.Create('Номер паспорта должен быть в диапазоне 1..999999');

end; except

{Если введенное значение номера паспорта не целое число, то обработка данной ошибки}

on EConvertError do begin

CanClose := False;

Number_E.SetFocus; ShowMessage(

'Номер паспорта должен быть целым числом');

end;

{Обработка всех других ошибок} on E:Exception do

begin

CanClose := False;

ShowMessage(E.Message); // E.Message – текст ошибки end;

end;

end;

Опишем событие OnShow формы People_F:

procedure TPeople_F.FormShow(Sender: TObject); begin

{При открытии формы переход на компонент FIO_E} FIO_E.SetFocus;

end;

Опишем пользовательский класс TPeople в разделе type секции implementation модуля основной формы:

TPeople = class public

FIO,Series : string;

30

Number : integer; end;

Опишем событие OnClick кнопки Add_B:

procedure TMain_F.Add_BClick(Sender: TObject); var

People : TPeople; begin

with People_F do begin

{Изменение заголовка диалогового окна} Caption := 'Добавление человека';

{Установка значений полей ввода диалогового окна в значение “по умолчанию”}

FIO_E.Text := ''; Series_E.Text := ''; Number_E.Text := '';

{Вызов диалогового окна и проверка результата завершения

его работы. Если окно закрыто с подтверждением ввода

данных, то выполнение действий по созданию нового

элемента}

if ShowModal=mrOk then begin

People := TPeople.Create; // Создание экземпляра класса

{Заполнение свойств экземпляра класса} People.FIO := Trim(FIO_E.Text); People.Series := Trim(Series_E.Text); People.Number := StrToInt(Number_E.Text); {Добавление нового элемента в список людей}

Spisok_LB.Items.AddObject(People.FIO,People); end;

end;

end;

Опишем событие OnClick кнопки Change_B:

procedure TMain_F.Change_BClick(Sender: TObject); var

People : TPeople; begin

{Проверка, выбран ли элемент для редактирования} if Spisok_LB.ItemIndex>=0 then

with People_F do begin

{Получение редактируемого элемента} People := Spisok_LB.Items.Objects

[Spisok_LB.ItemIndex] as TPeople; {Установка заголовка диалогового окна} Caption := 'Изменение данных человека';

{Установка значений полей ввода диалогового окна в

текущие значения редактируемого элемента}

31

FIO_E.Text := People.FIO; Series_E.Text := People.Series;

Number_E.Text := IntToStr(People.Number);

{Вызов диалогового окна и проверка результата завершения

его работы. Если окно закрыто с подтверждением ввода данных, то выполнение действий по редактированию элемента}

if ShowModal=mrOk then begin

{Изменение свойств редактируемого элемента} People.FIO := Trim(FIO_E.Text); People.Series := Trim(Series_E.Text); People.Number := StrToInt(Number_E.Text); {Изменение строки в списке}

Spisok_LB.Items[Spisok_LB.ItemIndex] := People.FIO; end;

end else

{Если элемент не выбран, то вывод сообщения} ShowMessage('Не выбран человек');

end;

Опишем событие OnClick кнопки Del_B:

procedure TMain_F.Del_BClick(Sender: TObject); begin

{Проверка, выбран ли элемент для удаления} if Spisok_LB.ItemIndex>=0 then

begin

{Получение элемента из списка и его разрушение} Spisok_LB.Items.Objects[Spisok_LB.ItemIndex].Free; {Удаление строки из списка} Spisok_LB.Items.Delete(Spisok_LB.ItemIndex);

end else

{Если элемент не выбран, то вывод сообщения} ShowMessage('Не выбран человек');

end;

Опишем событие OnDestroy основной формы для разрушения всех введенных элементов в момент окончания работы программы:

procedure TMain_F.FormDestroy(Sender: TObject); var

i : integer; begin

for i := 0 to Spisok_LB.Count-1 do Spisok_LB.Items.Objects[i].Free;

end;

Внешний вид и пример работы программы показаны на рисунке 6.

32