Основы программирования (947332), страница 66
Текст из файла (страница 66)
пример 12.1).402Приложение:^:%И|||||^^IBBI&yflшшшшштШс^^утшт;:;М1Ш1*#ШШг:1J.Ш11Ш1ШшЯШШШШШШШШ':'1^^Ш\р|Щ|1шШ-:.1шШ^•,;p.;.j|;;,,-^вшв:р:|1р||ГЩ;ЩР;|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-—ту—TMainFomiTlnputFomiTAddFomiTFindFomiу ФормируетОткрывает •XBaseI^ ОбрабатываетTObjectРис.
П5.9. Диаграмма классов приложения Записная книжкаUnit BaseUnit;interfaceType str30=-string[30J;rec=recordrfamily, rname, rtelefon:str30;end;Type TBase=Objectpublicffileofrec;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;VarBase:TBase;implementationProcedure TBase.Open;BeginAssignFile(fJhame);404{инициализация файловой переменной}Прилоэюение{$!-}Кезегф; {открытие с проверкой существования}iflOResultoO then ReWrite(f); {создание файла}End;Procedure TBase.Add;Var r.rec;BeginSeek(f,FileSize(f)); {устанавливаем указатель на конец файла}r.rfamily:=afamily; {создаем запись}к тате: =апате;к rtelefon: =atelefon;Write(f,r);{выводим запись в файл}End;Function XBase.
Find;BeginCloseFile(f);{закрываем файл}ReSet(f);{открываем файл для чтения}pjamily:=afamily;{сохраняем данные поиска}рпате:=апате;kl:=p_family<>";{строим ключи поиска}к2:=р_пате<>";Find:=FindNext;{ищем запись по ключам}End;Function TBase.FindNext;Var r:rec; кЗ, k4,ff:boolean; {ключи поиска и его результат}Beginff:=false; {ключ поиска "запись не найдена"}while not Eof(f) and notffdobeginRead(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 кЗ) thenbeginff:=true;{ключ поиска "запись найдена"}jfdmily:=r.rfamily; {копируем результаты поиска}пате:=кгпате;telefon: =^г rtelefon;endend;405ПриложениеFindNext:=ff; {возвращаем ключ поиска}end;Procedure TBase.Closef;beginCloseFile(f); {закрываем файл}end;end.Объект MainForm класса TMainForm для всех кнопок, кроме кнопки Выход, должен вызывать соответствующий объект для выполнения основныхопераций с файлом.
Имя.файла должен вводить объект InputForm, он же должен создать/открыть файл. До открытия файла нельзя разрешать добавлениеи поиск записей, поэтому для компонентов MainForm AddButton иFindButton в Инспекторе объектов устанавливают свойство Enable в состояние false. Тогда при запуске программы эти кнопки будут не активны. Посленормального выполнения InputForm использование этих кнопок будет разрешено: указанное свойство будет установлено в состояние true программно.Unit MainUnit;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTMainForm = 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;implementationuses AddUnit, FindUnit, InputUnit;{$R *.DFM}procedure TMainForm.
OpenButtonClickfSender: TObject);beginif InputForm.ShowModal=mrOk then {если выполнение InputForm}begin{завершилось благополучно, то}AddButton.Enabled: =true;{разрешить добавление}406Прилоэк:ениеFindButton.Enabled:=true; {разрешить поиск}end;end;procedure TMainForm.AddButtonClick(Sender: TObject);beginAddForm.ShowModal;{активизировать AddForm}end;procedure TMainForm.FindButtonClick(Sender: TObject);beginFindForm,ShowModal;{активизировать FindForm}end;procedure TMainForm.ExitButtonClick(Sender: TObject);beginClose; {завершить приложение}end;end.При активации формы InputForm фокус должен быть установлен на редактор ввода.
Ввод обрабатывается автоматически. Завершение ввода осуществляется нажатием клавиши Enter.Unit InputUnit;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;typeTInputForm = class(TForm)InputEdit: TEdit;procedure InputEditKeyPress(Sender: TObject; var Key: Char);procedure FormActivate(Sender: TObject);end;var InputForm: TInputForm;implementationuses Base Unit;{$R *.DFM}procedure TInputForm.FormActivate(Sender: TObject);beginInputEdit.
SetFocus;end;procedure TInputForm.InputEditKeyPress(Sender: TObject; var Key: Char);beginifKey=#13 then407Прилож:ениеbeginКеу:=#0;Base. Open (InputEdit. Text);ModalResult:= mrOK;{завершить благополучно}end;end;end.Объект AddForm отвечает за добавление записей. На рис. П5.10 представлена диаграмма переходов состояний интерфейса для объекта AddForm,которая уточняет его поведение при вводе записи по полям.
Из диаграммыследует, что ввод данных начинается с нажатия кнопки Добавить, переход отполя к полю осуществляется нажитием клавиши Enter, запись в файл происходит после ввода телефона, а выход возможен из любого состояния.Внутренние переходы по вводу отдельных символов не показаны: ониобрабатываются компонентами автоматически.UnitAddUnit;interfaceusesWindowsу Messagesу SysUtils, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;Ввод данныхВыборфункцииВводфамилииEnter/Запись данных'ВводимениEnterВыход•#ЛJ1ВводтелефонаEnterЛJРис.
П5.10. Диаграмма переходов состояний интерфейсадля объекта AddForm408ПрилоэюеииеtypeTAddForm = 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;varAddForm: TAddForm;implementationuses Base Unit;{$R *.DFM}procedure TAddForm.FormActivate(Sender: TObject);beginExitButton, SetFocus;end;procedure TAddForm.AddButtonClick(Sender: TObject);beginFamEdit.SetFocus;end;procedure TAddForm.FamEditKeyPress(Sender: TObject; var Key: Char);beginifKey=#]3 thenbeginKey:=#0;NameEdit.
SetFocus;end; ^end;procedure TAddForm.NameEditKeyPress(Sender: TObject; var Key: Char);beginifKey=#13 thenbeginKey:=#0;409ПриложениеFonEdit.SetFocus;end;end;procedure TAddForm.FonEditKeyPress(Sender: TObject; var Key: Char);beginifKey^#13 thenbeginKey:=#0;Base,Add(FamEdit. Text,NameEdit. Text,FonEdit. Text);ExitButton. Set Focus;end;end;procedure TAddForm.ExitButtonClick(Sender: TObject);beginModalResult:= mrOK;{завершить благополучно}end;end.Объект FindForm отвечает за поиск записей. Переход от поля к полю привводе осуществляется нажитием клавиши Enter.unit FindUnit;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;typeTFindForm = 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ПрилоэюениеprivateProcedure Show;end;varFindForm: TFindForm;implementationuses Base Unit;{$R *.DFM}Procedure TFindForm.
Show;beginFamEdit, Text: =Base/amily;Name Edit. Text: =Base. name;FonEdit. Text: =Base. telefon;end;procedure TFindForm.FormActivatefSender: TObject);beginExitButton. SetFocus;end;procedure TFindForm.FindButtonClickfSender: TObject);beginFamEdit. SetFocus;end;procedure TFindForm.FamEditKeyPressfSender: TObject; var Key: Char);beginifKey=#}3 thenbeginKey:=#0;NameEdit. SetFocus;end;end;procedure TFindForm.NameEditKeyPress(Sender: TObject; var Key: Char);beginifKey=#13 thenbeginKey:=#0;if Base.Find(FamEdit. Text,NameEdit.
Text) thenbeginShow;NextButton. SetFocus;endelsebeginMessageDlg( 'Hem daHHbix\mtInformation,[mbOk],0);411[JpiuioDtceHueExitButton, SetFocus;endend;end;procedure TFindForm.NextButtonClick(Sender: TObject);beginif BascFindNext thenbeginShow;Next Button, SetFocus;endelsebeginMessageDlg( 'Hem daHHbix\mtInformationJmbOkJ,0);ExitButton. SetFocus;endend;procedure TFindForm.ExitButtonClickfSender: TObject);beginModalResult:= mrOK;{завершить благополучно};end;end.В процессе проектирования приложения Delphi автоматически строитфайл проекта.program BookProject;uses Forms,MainUnit in 'MainUnit.pas' {MainFormj,InputUnit in 'InputUnit.pas' {InputForm},AddUnit in 'AddUnit.pas' {AddForm},FindUnit in FindUnit.pas' fFindForm},Base Unit in 'BaseUnit.pas';{$R *.RES}beginApplication.