Создан заказ №1365530
8 октября 2016
Создание приложений с интерфейсом, управляемым событиями при помощи пакета Turbo Vision
Как заказчик описал требования к работе:
Контрольная работа №1 " Создание приложений с интерфейсом,
управляемым событиями при помощи пакета Turbo Vision "
Цель работы: создать прикладную программу с интерфейсом,
управляемым событиями, при помощи пакета Turbo Vision по индивиду-
альному заданию. Варианты индивидуальных заданий приведены в
таблице 2.
Средства выполнения и форма отчетности: Работа выполняется с
помощью среды Turbo Pascal и библиотеки Turbo Vision, входящих в со-
став пакета Borland Pascal v7.0 (6.0). Результат выполнения работы в виде
файла с исходным текстом программы (программа должна содержать ис-
черпывающие комментарии) и сопутствующих файлов необходимо при-
слать по электронной почте или на дискете.
Вариант 10.
Справочная система "Кулинария"
Система содержит информацию о рецептах блюд. Каж-
дое блюдо кроме названия имеет категорию (закуска,
супы и т.д.) и вид кухни (русская, кавказская и т.д.).
Система должна обеспечивать: ввод нового рецепта
блюда любой категории и вида кухни; вывод перечня
имеющихся рецептов; поиск рецепта по заданной кате-
гории и виду кухни и выдачу рецепта в окно.
1. Планирование структуры программы.
Информацию об объектах (в зависимости от индивидуального зада-
ния это могут быть книги, фильмы, аудиоальбомы и т.д.) лучше представ-
лять в виде коллекции объектов. Каждый объект должен содержать поля
для сохранения его реквизитов. При запуске программы коллекция созда-
ется (или считывается из потока ранее созданная коллекция), а при завер-
шении программы - коллекция записывается в поток.
Строка статуса программы должна содержать, по крайней мере, эле-
менты для активизации меню, для вызова справочной системы и для за-
вершения программы. Меню должно содержать, по крайней мере, пункты
для просмотра коллекции объектов, для ввода нового объекта, для поиска
нужного объекта, а также для вызова справки и выхода из программы.
Процедура просмотра коллекции должна создавать стандартное окно
со скроллером (или объектом TTerminal) и полосами скроллинга. Инфор-
мация в окно выводится из буфера, в который нужно предварительно запи-
сать строки, содержащие значения всех полей объектов коллекции.
Процедура ввода нового объекта коллекции должна создавать диало-
говое окно для ввода информации об объекте. Затем создается новый объ-
ект с введенными характеристиками и вставляется в коллекцию.
Процедура поиска объекта должна создавать диалоговое окно для
ввода шаблона поиска. Затем осуществляется поиск объекта коллекции с
нужными характеристиками и вся информация о найденном объекте выво-
дится в окно сообщений.
2. Создание прикладной программы с меню и строкой статуса.
Опишите свой тип прикладной программы с перекрытым конструк-
тором, методами создания строки статуса и строки меню и обработчиком
событий. Введите переменную этого типа.
Например:
type
TMyAppl = object (TApplication)
constructor Init;
procedure InitStatusLine;
procedure InitMenuBar;
procedure HandleEvent(var Event:TEvent); virtual;
end;
var MyAppl: TMyAppl;
Создайте тело основной программы, включающее вызов методов
Init, Run, Done объекта MyAppl (см. [1], п. 4.2). Не забудьте подключить
основные модули: App, Objects, Views, Drivers, Menus.
Создайте свою строку статуса и собственное меню, переопределив
методы InitStatusLine и InitMenuBar (см. [1] - п. 4.4.2).
Для стандартных команд используйте стандартные коды команд (см.
[1] - табл. 4.1) для того, чтобы они выполнялись автоматически.
Объявите введенные Вами нестандартные команды в разделе кон-
стант. Действие введенных Вами нестандартных команд будете определять
позже по мере создания соответствующих процедур.
В конструкторе программы создайте заставку с информацией о на-
звании системы, ее разработчике. Для этих целей лучше использовать
стандартное окно сообщений MessageBox. Обычно это окно используется
для уведомления пользователя или получения подтверждения перед вы-
полнением определенных действий. При этом оно содержит некоторый
текст и, как правило, кнопку OK или Yes. Для создания окна сообщений
достаточно вызвать функцию MessageBox и передать ей текст сообщения,
список параметров, если используется форматированный вывод (nil - если
неформатированный вывод) и флаг для указания вставляемой кнопки.
Пример:
constructor TMyAppl.Init;
begin
inherited Init;
MessageBox ('Система КОНСУЛЬТАНТ '#13+
'предназначена для … ', nil, mfOkButton);
end;
Функция MessageBox содержится в модуле MsgBox, поэтому не за-
будьте включить его в раздел uses.
3. Создание коллекции объектов.
Определите тип объектов, которые будут храниться в коллекции.
Наследуйте этот тип от абстрактного TObject. Например, если объектами
являются клиенты, для каждого из которых хранится имя и номер телефо-
на, то тип объекта можно определить следующим образом:
type
PClient = ^TClient; {указатель на тип TClient}
TClient = object (TObject) {тип TClient наследуется от TObject }
Name, Phone: PString; {поля для имени и телефона}
constructor Init (N, Ph: String); {конструктор}
destructor Done; virtual; {деструктор}
end;
В конструкторе объекта инициализируются его поля, например:
constructor TClient.Init (N,Ph:String);
begin
Name := NewStr (N);
Phone := NewStr (Ph);
end;
В деструкторе объекта очистите все поля, например:
destructor TClient.Done;
begin
dispose(Name);
dispose(Phone);
end;
В описание типа прикладной программы добавьте новое поле типа
PCollection для хранения вашей коллекции, например:
ClientList: PCollection;
В конструкторе прикладной программы добавьте создание коллек-
ции. Конструктору коллекции передается первоначальный размер коллек-
ции (в элементах) и число элементов, на которое будет увеличиваться
коллекция при заполнении:
ClientList := New (PCollection,Init (10,5));
Кроме того, в конструкторе прикладной программы вставьте не-
сколько элементов в коллекцию с помощью метода Insert, например:
ClientList^.Insert (New (PClient, Init ('Смирнов', '44-56-78')));
…
4. Создание процедуры просмотра коллекции
В описание типа прикладной программы добавьте новый метод для
просмотра коллекции, назвав его, например, PrintClientList. Свяжите вызов
этой процедуры с некоторой командой меню. Для этого перекройте обра-
ботчик событий прикладной программы - метод TApplication.HandleEvent
и в нем сопоставьте вызов данной процедуры соответствующей команде
(см. [1] - п. 4.4.2).
В процедуре PrintClientList сначала необходимо переписать всю ин-
формацию о каждом элементе коллекции в текстовый файл, содержимое
которого потом будет выведено в окно. Для этого введите файловую пере-
менную F типа Text и свяжите ее с именем некоторого файла (например,
'client.txt'). Откройте файл.
Лучше создать отдельную процедуру, которая для каждого элемента
коллекции будет записывать в файл строку, содержащую значения полей
этого элемента. Эта процедура, например PrintClient, вызывается для каждого элемента коллекции с помощью итератора ForEach. Процедура Print-
Client должна быть вложенной и объявленной как дальняя. Пример:
Procedure PrintClient (P: Pclient); far;
begin
With P^ do
Writeln (F, Name^+ ’ ’+ Phone^);
end;
В теле процедуры PrintClientList вызовите итератор с указателем на
процедуру PrintClient:
ClientList^.ForEach (@PrintClient);
Закройте файл 'client.txt'.
Затем необходимо создать окно для просмотра коллекции. В окно
необходимо поместить объект TTerminal, который выводит на экран ин-
формацию со скроллингом из некоторого буфера.
Подключите модуль TextView, содержащий объект TTerminal. Соз-
дайте новый тип окна, содержащий поле с указателем на терминал, поле с
буфером и новый перекрытый конструктор. Например:
type
PMyWindow=^TMyWindow;
TMyWindow=object(TWindow)
Term: PTerminal;
Buff: Text;
constructor Init (Bounds: TRect; WinTitle: String; WindowNo: Integer);
end;
В конструкторе окна создайте и поместите подэлементы (см. [1] -
п. 4.3.2). Для того, чтобы создать объект терминал, необходимо сначала
определить его координаты (он должен занимать всю область окна, кроме
рамки), затем создать экземпляр объекта TTerminal, Его конструктору по-
мимо координат передаются указатели на полосы скроллинга и размер бу-
фера. Для создания полос скроллинга используется функция
StandardScrollBar с параметром sbGorizontal или sbVertical (для создания
горизонтальной или вертикальной полосы), который может быть скомби-
нирован с sbHandleKeyboard, чтобы полоса прокрутки откликалась на
клавиши стрелок и страниц клавиатуры. Пример создания терминала:
…
GetExtent (Bounds); {установить Bounds в размеры окна}
Bounds.Grow (-1,-1); {уменьшить на 1 со всех сторон}
New (Term, Init (Bounds,
StandardScrollBar (sbVertical+ sbHandleKeyboard),
StandardScrollBar (sbHorizontal+ sbHandleKeyboard),
50000);
Прежде, чем вставить терминал в окно, необходимо связать с ним
буфер Buff и переписать в него содержимое текстового файла 'client.txt'.
Введите файловую переменную F, свяжите ее с именем файла'client.
txt', откройте файл, как существующий. Откройте файл Buff как новый.
Организуйте цикл: пока не конец файла F читается строка из файла F и за-
писывается в файл Buff. Закройте файл F с помощью system.close(F). Если
вызвать close без имени модуля system, то будет вызвана процедура закры-
тия окна.
Теперь свяжите Buff с терминалом посредством процедуры
AssignDevice и вставьте терминал в окно:
AssignDevice (Buff,Term);
Insert (Term);
Осталось добавить в процедуру PrintClientList создание экземпляра
окна, например:
R.Assign(0,1,80,24); {координаты окна}
Window:=New(PMyWindow, Init(R, 'Список',WnNoNumber)); {окно}
DeskTop^.Insert(Window); {вставка окна в панель экрана}
5. Создание процедуры пополнения коллекции
В описание типа прикладной программы добавьте новый метод для
ввода элемента коллекции, назвав его, например, InsertClient. Свяжите вы-
зов этой процедуры с некоторой командой меню. Для этого перекройте об-
работчик событий прикладной программы - метод TApplication.
HandleEvent и в нем сопоставьте вызов данной процедуры соответствую-
щей команде (см. [1] - п. 4.4.2).
В процедуре должно создаваться диалоговое окно для пополнения
коллекции новыми элементами. Сначала создайте новый тип диалогового
окна, например, TDialvvod с перекрытым конструктором:
PDialvvod = ^ TDialvvod;
TDialvvod = object(TDialog)
constructor Init (var Bounds: TRect; WinTitle: String);
end;
В конструкторе диалогового окна создайте управляющие элементы
(строки ввода, кластеры радиокнопок, независимых кнопок и др.) для вво-
да данных нового элемента коллекции. Например, для ввода фамилии и
номера телефона клиента в диалоговое окно нужно поместить 2 строки
ввода. Для каждой строки ввода и кластера кнопок нужно создать метку,
поясняющую какую информацию пользователь должен ввести. Поместите
командные кнопки, например, «Ввести», связанную с командой cmOk и«Отменить», связанную с командой cmCancel. Переместите активность на
первый вставленный элемент с помощью SelectNext (False).
Пример создания управляющих элементов см. в [1] - п. 4.3.3.
Теперь в процедуре TApplication.InsertClient создайте экземпляр диа-
логового окна, предварительно задав его координаты, и вставьте с помо-
щью функции ExecView (она делает окно модальным и возвращает код за-
крытия окна):
…
R.Assign(10,5,70,20);
Dialvvod:= New (PDialvvod, Init (R,'Ввод нового элемента'));
Control := DeskTop^. ExecView (Dialvvod);
Создайте запись для сохранения данных диалогового окна. Для этого
опишите тип записи, например, TDataVvod, в которой каждой строке ввода
и каждому кластеру кнопок должно соответствовать одно поле соответст-
вующего типа. Поля должны следовать в том же порядке, что и соответст-
вующие управляющие элементы. Введите глобальную переменную этого
типа, например, DataVvod.
После выполнения диалогового окна (вызова ExecView), если оно
было закрыто по команде cmOk, сохраните введенные данные в DataVvod
с помощью метода GetData.
В конце процедуры предусмотрите вставку нового элемента коллек-
ции с данными, введенными в диалоговом окне и сохраненными в
DataVvod. Например:
ClientList^.Insert (New (PClient, Init (DataVvod.Pole1, DataVvod.Pole2,
…)));
Если одно из полей элемента коллекции вводилось через выбор в
кластере радиокнопок, то необходимо сопоставить номеру выбранной
кнопки соответствующую строку.
6. Создание процедуры поиска элемента коллекции
С помощью этой процедуры вы можете, например, найти клиента с
заданной фамилией и выдать на экран его телефон. В описание типа при-
кладной программы добавьте новый метод для поиска элемента коллекции,
например, SearhItem. Свяжите вызов этой процедуры с некоторой коман-
дой меню в обработчике событий прикладной программы.
В данной процедуре создайте диалоговое окно для ввода шаблона
поиска. Введите новый тип диалогового окна, например, TDialSearh с пе-
рекрытым конструктором. В конструкторе диалогового окна создайте
управляющие элементы: строку ввода для ввода шаблона поиска (или не-
скольких строк если поиск осуществляется по нескольким полям), метку,
командные кнопки «Ввести» и «Отменить». Создайте запись для сохране-
ния данных этого диалогового окна. Например, DataSearh типа TDataSearh.
В процедуре SearhItem определите координаты диалогового окна,
создайте экземпляр окна типа TDialSearh. Предусмотрите сохранение вве-
денной строки в DataSearh.
Процедура SearhItem должна использовать итератор FirstThat, кото-
рый для каждого элемента коллекции вызывает булевскую функцию (на-
пример, NameMatch). Эта функция проверяет, совпадает ли искомая строка
(сохраненная в DataSearh) со значением заданного поля элемента. Для
сравнения строк используется функция Pos, которая возвращает позицию в
строке, начиная с которой строки совпадают, или 0 (если строки не совпа-
дают). Функция NameMatch возвращает истину, если строки совпали и
ложь в противном случае. Функция NameMatch должна быть вложенной и
объявленной как дальняя. Пример:
function NameMatch(Client: PClient):Boolean; far;
begin
NameMatch:=Pos (DataSearh.Pole1, Client^.Name^)0;
end;
В теле процедуры SearhItem вызовите итератор:
FoundClient:=ClientList^.FirstThat(@NameMatch);
Он возвращает указатель на найденный элемент (не забудьте ввести
переменную FoundClient типа Pclient). Затем проверьте, если FoundClient
равен nil, то выдайте сообщение, что клиента с такой фамилией нет (с по-
мощью MessageBox). В противном случае выведите сообщение, что был
найден клиент с такими-то атрибутами и выдайте значения всех полей
клиента.
7. Чтение и запись коллекции в поток
Подготовьте объекты, содержащиеся в коллекции, для использова-
ния с потоком. Для этого, прежде всего, необходимо создать методы Load
и Store объектов. В методе Load осуществляется чтение всех полей, в ме-
тоде Store - запись, например:
constructor TClient.Load(S:TDosStream);
begin
Name := S.ReadStr; {прочитать из потока новое поле}
Phone := S.ReadStr; {то же}
end;
procedure TClient.Store(S:TDosStream);
begin
S.WriteStr(Name); {записать в поток новое поле}
S.WriteStr(Phone); {то же}
end;
Необходимо создать запись регистрации для объектов коллекции.
Запись регистрации определяется, как константа, например:
Const
RClient: TStreamRec = (
ObjType: 2000;
VmtLink: Ofs(TypeOf(TClient)^);
Load: @TClient.Load;
Store: @TClient.Store);
После этого вы можете зарегистрировать объект с помощью метода
RegisterType, например: RegisterType(RClient). Регистрацию лучше осуще-
ствить в конструкторе прикладной программы.
Подготовка коллекции для использования с потоком, если вы ис-
пользуете стандартный тип коллекции (TCollection), сводится лишь к ее
регистрации.
Введите глобальную переменную для потока, например SaveFile ти-
па TDosStream. В конструкторе прикладной программы проинициализи-
руйте поток с режимом доступа только на чтение файла и прочитайте кол-
лекцию из файла, например:
SaveFile.Init ('Client.res', stOpenRead); {инициализация потока на чте-
ние}
ClientList := PCollection (SaveFile.Get); {чтение коллекции}
Проанализируйте поле SaveFile.Status на наличие ошибки. Если была
ошибка инициализации потока (из-за того, что файл еще не был создан), то
проинициализируйте заново поток с режимом доступа stCreate и после это-
го вызовите процедуры инициализации новой коллекции и вставки объек-
тов (написанные ранее). После завершения работы с потоком следует его
удалить с помощью вызова метода SaveFile.Done.
В деструкторе прикладной программы проинициализируйте поток с
режимом доступа только на запись файла и запишите коллекцию в файл,
например:
SaveFile.Init ('Client.res', stOpenWrite); {инициализация потока на
запись}
SaveFile.Put (ClientList); {запись коллекции}
При возникновении ошибки должно выдаваться соответствующее
сообщение. После использования потока удалите его.
8. Создание справочной системы
Задайте для каждого видимого объекта, используемого в Вашей про-
грамме (окон, диалоговых окон, элементов управления диалоговых окон)
контекст помощи. Для этого присвойте полю HelpCtx этого объекта неко-
торую константу hcxxxx (например, hcWindow, hcDialog). Это лучше сде-
лать после инициализации объекта перед его вставкой или в конструкторе
объекта. При этом можете не объявлять эти константы в разделе const, т.к.
затем с помощью компилятора (автоматически) будет создан pas-файл с
этими константами.
Для элементов меню контекст помощи укажите в методе
TApplication.InitMenuBar (при вызове функций NewItem, NewSubMenu).
Создайте текстовый файл, например, ‘Myhelp.txt’. Файл можно соз-
дать с помощью тестового редактора Turbo Pascal.. Введите текст для каж-
дого раздела справки. При этом заголовки разделов и перекрестные ссылки
оформляйте так, как это описано в [1] (п. 4.6). Пример описания справоч-
ного раздела:
.topic MyWindow = 1000
Окно просмотра
Окно выводит содержимое коллекции
См. также {ввод коллекции: InsertCol}
Откомпилируйте текстовый файл вашей справочной системы. Для
этого запустите компилятор TVHC.EXE с параметром Myhelp.txt (имя
файла). При этом будут созданы 2 файла: справочный файл Myhelp.hlp и
файл Myhelp.pas, содержащий константы hcxxxx. Укажите в разделе uses
вашей программы модуль Myhelp наряду с модулем HelpFile.
В конструкторе программы зарегистрируйте все объекты справочной
системы с помощью вызова:
RegisterHelpfile;
Создайте процедуру, например, Help (как метод прикладной про-
граммы) для вывода справочного окна. В методе Help вам необходимо вве-
сти следующие переменные:
HWindow: PHelpWindow; {справочное окно}
HFile : PHelpFile; {справочный файл}
HStream: PDosStream; {поток ДОС для справочного файла}
Затем необходимо выполнить следующее (см. [1] - п.4.6): открыть
поток HStream для чтения; проинициализировать ресурсный файл HFile,
связанный с этим потоком; проинициализировать справочное окно; вста-
вить окно как модальное с помощью вызова ExecView; уничтожить окно
и ресурсный файл.
Добавьте палитру справочного окна к палитре прикладной програм-
мы. Для этого перекройте метод-функцию GetPalette вашей программы. В
этой функции в разделе констант определите строку CNewColor, как сумму
строк CColor и CHelpColor, и новую палитру P, как строку символов
CNewColor. Функция должна возвращать указатель на эту палитру
GetPalette := @P.
Введите команду cmHelp для вызова справочной системы, свяжите
ее с клавишей F1 в строке статуса и с элементом меню "Помощь". Однако
обработку этой команды (вызов процедуры Help) осуществите не в методе
HandleEvent прикладной программы, а в методе GetEvent. Это необходимо
сделать для того, чтобы процедура Help вызывалась и для модальных диа-
логовых окон. Модальное окно сосредотачивает обработку событий в себе
и обработчик прикладной программы при этом не вызывается. Метод же
GetEvent модального окна всегда вызывает соответствующий метод при-
кладной программы.
Перекройте виртуальный метод GetEvent прикладной программы. В
нем вызовите сначала соответствующий метод предка, а затем добавьте
обработку команды cmHelp так же, как делается обработка событий-
команд в обработчике событий.
Создайте строку статуса, которая кроме определения команд и свя-
зывания их с определенными клавишами выполняет еще одну функцию -
отображение контекстно-зависимой подсказки для активного элемента.
Для этого введите новый тип строки статуса, например TMyStatus с
перекрытым методом-функцией Hint. Этой функции передается один па-
раметр – контекст помощи активного в данный момент элемента:
Function Hint.(AHelpCtx: Word): String; virtual;
В этой функции сопоставьте различным идентификаторам контекста
помощи некоторые тексты подсказок, например:
case AHelpCtx of
hcFile: Hint := 'Меню для работы с файлами';
hcFileOpen: Hint := 'Открыть файл';
…
else Hint := '';
end
подробнее
Заказчик
заплатил
заплатил
200 ₽
Заказчик не использовал рассрочку
Гарантия сервиса
Автор24
Автор24
20 дней
Заказчик принял работу без использования гарантии
9 октября 2016
Заказ завершен, заказчик получил финальный файл с работой
5
Создание приложений с интерфейсом, управляемым событиями при помощи пакета Turbo Vision.docx
2017-03-30 13:41
Последний отзыв студента о бирже Автор24
Общая оценка
5
Положительно
Очень понравилось! Договорились о низкой цене, и контрольную выполнил за пару дней, информативно и подробно!