|
Инкапсуляция новых полей и методов
При попытке откомпилировать
полученный вариант программы Турбо Паскаль сообщит о
неизвестном идентификаторе 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 восстанавливает
все видимые элементы экрана.
|