TURBO PASCAL |
Новости
|
Инкапсуляция новых полей и методов
При попытке откомпилировать полученный вариант программы Турбо Паскаль сообщит о неизвестном идентификаторе DisableCommands. На первый взгляд это кажется странным - ведь аналогичное обращение в обработчике событий TNotebook.HandleEvent не вызывало проблем! Все дело в том, что мы работаем с объектами, а следовательно, здесь очень важным становится контекст программ. Обработчик TNotebook-HandleEvent - это метод объекта TNotebook, который унаследовал от своих родителей многие свойства, в том числе и метод DisableCommands. Процедура FileOpen не является потомком объектов Turbo Vision и не имеет доступа к их полям и методам. В Turbo Vision все новые процедуры обычно инкапсулируются в объекты., если в них необходимо получить доступ к специфическим средствам этих объектов. Поскольку процедура FileOpen вызывается из обработчика событий объекта TNotebook, нам следует включить ее в виде нового метода этого объекта: type TNotebook = object(TApplication) ....... Procedure FileOpen; Procedure FileSave; Procedure ChangeDir; Procedure DOSCall; Procedure Work; end; В этом фрагменте мы инкапсулировали в объект все методы, используемые обработчиком событий. Разумеется, необходимо соответствующим образом изменить заголовок процедуры FileOpen, поскольку она теперь стала методом объекта TNotebook: Procedure TNotebook.FileOpen; Аналогичным образом следует изменить и заголовки других инкапсулированных процедур. Теперь трансляция пройдет успешно, а после открытия файла станет недоступна команда F3. Тексты двух других новых методов объекта TNotebook не нуждаются в особых комментариях: Procedure TNotebook.FileSave; {Закрывает файл данных} begin Close(DataFile); OpFileF := False; EnableCommands(WinCom2); {Разрешаем открыть файл} DisableCommands(WinComl) {Запрещаем работу и сохранение} end; {TNotebook.FileSave} {-----------} Procedure TNotebook.ChangeDir; {Изменяет текущий каталог} var PD: PChDirDialog; {Диалоговое окно смены каталога/диска} Control: Word; begin New(PD, Init(cdNormal,0));{Создаем диалоговое окно} Control := DeskTop.ExecView(PD){Используем окно} ChDir(PD.Dirlnput.Data);{Устанавливаем новый каталог} Dispose(PD, Done){Удаляем окно из кучи} end; {TNotebook.ChangeDir} Несколько слов по поводу реализации процедуры TNotebook. ChangeDir. В ней используется объект TChDirDialog, входящий в модуль StdDlg. С помощью этого объекта создается диалоговое окно, позволяющее выбрать новый диск или каталог. После создания и использования экземпляра объекта TChDirDialog в его поле Dirlnput.Data устанавливается строка типа PathStr, задающая новый каталог (и, возможно, новый диск). Чуть сложнее обстоит дело с процедурой DOSCall, которая должна реализовать временный выход в ДОС. Дело в том, что перед выходом необходимо сохранить в куче текущее состояние программы, а после возврата нужно восстановить состояние программы, в том числе и вид экрана. Чтобы реализовать имеющиеся в Turbo Vision средства сохранения и восстановления программы, в предложение Uses необходимо добавить ссылку на модуль Memory. Вот текст метода TNotebooLDOSCall: Procedure TNotebook.DOSCall; {Временный выход в ДОС} const txt ='Для возврата введите EXIT в ответ'+' на приглашение ДОС...'; begin DoneEvents;{Закрыть обработчик событий} DoneVideo;{Закрыть монитор экрана} DoneMemory;{Закрыть монитор памяти} SetMemTop(HeapPtr) ;{Освободить кучу} WriteLn(txt);{Сообщить о выходе} SwapVectors;{Установить стандартные векторы} {Передать управление командному процессору ДОС:} Exec(GetEnv('COMSPEC'),''); {Вернуться из ДОС:} SwapVectors; {Восстановить векторы) SetMemTop(HeapEnd); {Восстановить кучу} InitMemory; {Открыть монитор памяти} InitVideo;{Открыть монитор экрана} InitEvents;{Открыть обработчик событий} InitSysError;{Открыть обработчик ошибок} Redraw {Восстановить вид экрана} end; {DOSCall} Процедуры DoneXXXX завершают работу отдельных частей Turbo Vision, а процедуры InitXXXXосуществляют обратные действия. С помощью процедуры SetMemTop в ДОС передается информация о фактически используемой динамической памяти (по умолчанию программе предоставляется вся доступная память). Этот вызов освобождает неиспользуемую в данный момент часть кучи для размещения в ней командного процессора COMMAND.COM. После возврата из ДОС вызов SetMemTop используется еще раз - для того, чтобы зарезервировать за программой всю ранее выделенную ей память. Процедура Redraw восстанавливает все видимые элементы экрана.
|
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |