Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Иванова Г.С. - Основы программирования

.pdf
Скачиваний:
2771
Добавлен:
02.04.2015
Размер:
13.53 Mб
Скачать

Приложение

Последовательно выделяем компоненты, выбираем в списке событий Events Инспектора объектов нужные события и дважды щелкаем мышью на чистом поле рядом с ними. В результате создаются заготовки обработчиков событий, в которые необходимо вписать соответствующие фрагменты про­ граммы. В конечном итоге получаем полный текст модуля MainForm, приве­ денный ниже (операторы, вводимые программистом, выделены полужирным шрифтом).

Unit MainForm;

Interface

Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls; {модули Delphi}

Type

TMainForm= class(TForm){oimcdLUHQ формы - создано автоматически}

InputLabel: TLabel;

OutputLabel: TLabel; {метки}

InputEdit: TEdit;

OutputEdit: TEdit;

{редакторы}

NextButton: TButton; ExitButton: TButton;

{кнопки}

Bevell: TBevel;

 

{рамка}

procedure FormActivatefSender: TObject);

procedure InputEditKeyPress(Sender: TObject; var Key: Char); procedure NextButtonClick(Sender: TObject);

procedure ExitButtonClick(Sender: TObject); end;

Var MainForm: TMainForm; {объект-создано автоматически }

Implementation

uses UnitNumber; {описание класса TNumber}

{$R \DFM}

Procedure TMainForm.FormActivate(Sender: TObject); begin

OutputEdit Visible:=false;

{сделать редактор вывода невидимым}

OutputLabeLVisible:=false; {сделать метку вывода невидимой}

NextButton.Enabled:=false; {слипать кнопку Следующий

InputEdit. Clear;

 

недоступной}

 

{очистить редактор ввода}

InputEdit.ReadOnfy:=false;

{разрешить ввод}

InputEditSetFocus;

{установить фокус ввода на редактор ввода}

end;

Procedure TMainForm.InputEditKeyPress(Sender: TObject; var Key: Char);

Var k:single; Codennteger; begin

ifKey-=#13 then begin

Key:=#0; {чтобы не выдавался звуковой сигнал}

401

Прилоэюение

Val(InputEdit. Text,k,Code); if Code-0 then

begin

N:-TNumber.Create(strtofloat(InputEdit.Text)); {создать объект} OutPutEditText:'=floattostr(N.SqrNumber); {вывести результат}

KDestroy; {уничтожить объект - деструктор TObject} OutPutEditVisible:-true; {сделать редактор вывода видимым} OutputLabel,Visible:=true; {сделать метку вывода видимой}

InputEdit.ReadOnly:-true; {запретить ввод} NextButton.Enabled:=true; {сделать кнопку Следующий

доступной} NextButtonSetFocus; {установить фокус ввода на кнопку

Следующий}

end

else {вывести сообщение об ошибке}

MessageDlgCCmpoKu codep:>/€um недопустимые символы', mtErrorJmbOkJyO)

end;

end;

Procedure TMainForm.NextButtonClick(Sender: TObject);

begin

FormActivate(NextButton); end; {вызываем метод}

Procedure TMainForm,ExitButtonClick(Sender: TObject);

begin

Close; end; {закрываем окно и завершаем приложение}

End,

 

Основную программу приложения - проект Delphi формирует автомати­ чески:

Program ProectXQ;

Uses

Forms,

MainFormUnit in 'MainFormUnit.pas', {Mainform}

UnitNumber in 'UnitNumber.pas';

{$R *.RES}

Begin

Application.Initialize; {инициализация объекта Приложение}

Application.CreateFormfTMainForm, MamForw);{создание формы}

Application,Run; {запуск цикла обработки сообщений}

End.

Чтобы лучше показать возможности среды, в качестве третьего примера рассмотрим, как можно реализовать в Delphi уже знакомый нам пример с записной книжкой (см. пример 12.1).

402

Приложение

:^:%И|||||^^ IBBI&yfl

;:;М1Ш1*#ШШг:1

.Ш11Ш1

шшшшштШс^^утшт

J

ШшЯШШШШШШШШ':'1^^Ш\

р | Щ | 1 ш Ш - : . 1 ш Ш ^

:р:|1р||ГЩ;ЩР;|

 

•,;p.;.j|;;,,-^

вшв

 

1':Ш|й^|р!5^^ ;

^'*1':

 

^^-ЙШ^'Йй^^^^^^^^^^^^^^^^^.

Щ

 

 

ш]

Рис. П5.8. Формы приложения «Записная книжка»:

а -

основная форма; б - форма создания/открытия файла;

в -

форма добавления записей; г - форма поиска записей

Пример П5.3. Разработать приложение «Записная книжка». На рис. П5.8 представлены формы разрабагываемого приложения. Их проекти­ руют с использованием визуальной технологии.

На рис. OS.9 представлена диаграмма классов приложения. Основное ее отличие от диаграммы, приведенной на рис. 12.13, заключается в том, что в ней использованы интерфейсные компоненты Delphi, и класс XBase наследу­ ется от класса TObject. Кроме того, не предусмотрен специальный класс для выдачи сообщения пользователю, так как в Delphi с этой целью обычно ис­ пользуют специальную процедуру MessageDlg, которая выводит нужное со­ общение.

Описание класса TBase практически полностью совпадает с выполнен­ ным на Borland Pascal 7.0. Внесены всего три изменения: заменены имена процедур Assign и Close соответственно на AssignFile и CloseFile и объявле­ ние объекта Base класса TBase перенесено в модуль, содержащий описание класса.

403

 

Прилоэюение

 

 

TFonn

 

 

 

-—ту—

 

 

TMainFomi

TlnputFomi

TAddFomi

TFindFomi

 

 

у Формирует

 

 

XBase

 

 

Открывает •

I

^ Обрабатывает

TObject

Рис. П5.9. Диаграмма классов приложения Записная книжка

Unit BaseUnit; interface

Type str30=-string[30J; rec=record

rfamily, rname, rtelefon:str30; end;

Type TBase=Object public ffileofrec;

family, nameу telefon:str30; {результаты поиска}

pjamilyp_name:str30;

{данные поиска}

kl, k2:boQlean;

{ключи поиска}

procedure Open(friame:str30); {открытие/создание файла} procedure Add(afamily,aname,atelefon:str30);{добавление записей}

function

Find(afamilyaname:str30).boolean; {поиск первого}

function

FindNext:boolean;

{поиск следующего}

procedure Closef;

 

{закрытие файла}

End;

 

 

 

Var

 

 

 

Base:TBase;

 

 

implementation

 

 

 

Procedure TBase.Open;

 

 

Begin

 

 

 

AssignFile(fJhame);

{инициализация файловой переменной}

404

Прилоэюение

{$!-} Кезегф; {открытие с проверкой существования}

iflOResultoO then ReWrite(f); {создание файла} End;

Procedure TBase.Add; Var r.rec;

Begin

Seek(f,FileSize(f)); {устанавливаем указатель на конец файла} r.rfamily:=afamily; {создаем запись}

ктате: =апате;

кrtelefon: =atelefon;

Write(f,r);

{выводим запись в файл}

End;

 

 

 

Function XBase.Find;

 

 

Begin

 

 

 

CloseFile(f);

{закрываем файл}

ReSet(f);

 

{открываем файл для чтения}

pjamily:=afamily;

{сохраняем данные поиска}

рпате:=апате;

 

 

kl:=p_family<>";

{строим ключи поиска}

к2:=р_пате<>";

 

 

Find:=FindNext;

{ищем запись по ключам}

End;

 

 

 

Function TBase.FindNext;

 

Var r:rec; кЗ, k4,ff:boolean;

{ключи поиска и его результат}

Begin

 

 

 

ff:=false;

{ключ поиска "запись не найдена"}

while not Eof(f) and

notffdo

begin

 

 

 

Read(f,r);

 

 

k3:=pj'amily=r.rfamily;

{строим еще два ключа поиска}

к4: =рпате =к тате;

 

if(kl

and к2 and кЗ and к4) {выбираем записи}

or (not kl and k2 and k4)

or (kl and not k2 and кЗ) then begin

ff:=true; {ключ поиска "запись найдена"} jfdmily:=r.rfamily; {копируем результаты поиска}

пате:=кгпате; telefon: =^г rtelefon;

end

end;

405

Приложение

FindNext:=ff; {возвращаем ключ поиска} end;

Procedure TBase.Closef; begin

CloseFile(f); {закрываем файл} end;

end.

Объект MainForm класса TMainForm для всех кнопок, кроме кнопки Вы­ ход, должен вызывать соответствующий объект для выполнения основных операций с файлом. Имя.файла должен вводить объект InputForm, он же дол­ жен создать/открыть файл. До открытия файла нельзя разрешать добавление и поиск записей, поэтому для компонентов MainForm AddButton и FindButton в Инспекторе объектов устанавливают свойство Enable в состоя­ ние false. Тогда при запуске программы эти кнопки будут не активны. После нормального выполнения InputForm использование этих кнопок будет разре­ шено: указанное свойство будет установлено в состояние true программно.

Unit MainUnit; interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TMainForm = classfTForm) OpenButton; TButton; AddButton: TButton; FindButton: TButton; ExitButton: TButton;

procedure OpenButtonClick(Sender: TObject); procedure AddButtonClickfSender: TObject); procedure FindButtonClick(Sender: TObject); procedure ExitButtonClickfSender: TObject); end;

var MainForm: TMainForm; implementation

uses AddUnit, FindUnit, InputUnit; {$R *.DFM}

procedure TMainForm. OpenButtonClickfSender: TObject); begin

if InputForm.ShowModal=mrOk

then {если выполнение InputForm}

begin

{завершилось благополучно, то}

AddButton.Enabled: =true;

{разрешить добавление}

406

Прилоэк:ение

FindButton.Enabled:=true; {разрешить поиск} end;

end;

procedure TMainForm.AddButtonClick(Sender: TObject); begin

AddForm.ShowModal; {активизировать AddForm} end;

procedure TMainForm.FindButtonClick(Sender: TObject); begin

FindForm,ShowModal; {активизировать FindForm} end;

procedure TMainForm.ExitButtonClick(Sender: TObject); begin

Close; {завершить приложение} end;

end.

При активации формы InputForm фокус должен быть установлен на ре­ дактор ввода. Ввод обрабатывается автоматически. Завершение ввода осуще­ ствляется нажатием клавиши Enter.

Unit InputUnit; interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TInputForm = class(TForm) InputEdit: TEdit;

procedure InputEditKeyPress(Sender: TObject; var Key: Char); procedure FormActivate(Sender: TObject);

end;

var InputForm: TInputForm; implementation

uses BaseUnit; {$R *.DFM}

procedure TInputForm.FormActivate(Sender: TObject); begin

InputEdit.SetFocus; end;

procedure TInputForm.InputEditKeyPress(Sender: TObject; var Key: Char); begin

ifKey=#13 then

407

Прилож:ение

begin Кеу:=#0;

Base. Open (InputEdit. Text);

ModalResult:= mrOK; {завершить благополучно} end;

end;

end.

Объект AddForm отвечает за добавление записей. На рис. П5.10 пред­ ставлена диаграмма переходов состояний интерфейса для объекта AddForm, которая уточняет его поведение при вводе записи по полям. Из диаграммы следует, что ввод данных начинается с нажатия кнопки Добавить, переход от поля к полю осуществляется нажитием клавиши Enter, запись в файл проис­ ходит после ввода телефона, а выход возможен из любого состояния. Внутренние переходы по вводу отдельных символов не показаны: они обрабатываются компонентами автоматически.

UnitAddUnit; interface uses

Windowsу Messagesу SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

Ввод данных

Выбор

функции

Ввод

фамилии

 

 

Enter

Выход

Enter/

'

• #

Л

 

Запись данных

Ввод

 

 

 

 

имени

 

 

J

Enter

1

Л

Ввод

телефона

J

Рис. П5.10. Диаграмма переходов состояний интерфейса для объекта AddForm

408

Прилоэюеиие

type

TAddForm = class(TForm) FamLabel: TLabel; NameLabel: TLabel; FonLabel: TLabel; AddButton: TButton; ExitButton: TButton; FamEdit: TEdit; NameEdit: TEdit; FonEdit: TEdit;

procedure FamEditKeyPress(Sender: TObject; var Key: Char); procedure NameEditKeyPress (Sender: TObject; var Key: Char); procedure FonEditKeyPress(Sender: TObject; var Key: Char); procedure FormActivate(Sender: TObject);

procedure AddButtonClick(Sender: TObject); procedure ExitButtonClick(Sender: TObject); end;

var

AddForm: TAddForm; implementation

uses Base Unit; {$R *.DFM}

procedure TAddForm.FormActivate(Sender: TObject); begin

ExitButton, SetFocus; end;

procedure TAddForm.AddButtonClick(Sender: TObject); begin

FamEdit.SetFocus;

end;

procedure TAddForm.FamEditKeyPress(Sender: TObject; var Key: Char); begin

ifKey=#]3 then begin Key:=#0;

NameEdit.SetFocus; end; ^

end;

procedure TAddForm.NameEditKeyPress(Sender: TObject; var Key: Char); begin

ifKey=#13 then begin Key:=#0;

409

Приложение

FonEdit.SetFocus;

end;

end;

procedure TAddForm.FonEditKeyPress(Sender: TObject; var Key: Char); begin

ifKey^#13 then begin Key:=#0;

Base,Add(FamEdit. Text,NameEdit. Text,FonEdit. Text); ExitButton.SetFocus;

end;

end;

procedure TAddForm.ExitButtonClick(Sender: TObject); begin

ModalResult:= mrOK; {завершить благополучно} end;

end.

Объект FindForm отвечает за поиск записей. Переход от поля к полю при вводе осуществляется нажитием клавиши Enter.

unit FindUnit; interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TFindForm = class(TForm) FamLabel: TLabel; NameLabel: TLabel; FonLabel: TLabel; FindButton: TButton; ExitButton: TButton; NextButton: TButton; FamEdit: TEdit; NameEdit: TEdit; FonEdit: TEdit;

procedure FamEditKeyPress(Sender: TObject; var Key: Char); procedure NameEditKeyPressfSender: TObject; var Key: Char); procedure FormActivate(Sender: TObject);

procedure FindButtonClick(Sender: TObject); procedure NextButtonClick(Sender: TObject); procedure ExitButtonClickfSender: TObject);

410