Использование оверлея
Модули Turbo Vision разработаны с учетом возможного использования их в оверлейных программах. Все они могут быть оверлейными за исключением модуля Drivers, который содержит процедуры обработки прерываний и другой системный интерфейс низкого уровня.
При разработке оверлейных программ старайтесь спроектировать логические последовательности вызовов тех или иных модулей так, чтобы по возможности уменьшить свопинг (динамический обмен оверлеев). Поскольку программы Turbo Vision рассчитаны на интенсивное использование диалога с пользователем, размещайте (если это возможно) все процедуры, связанные с некоторой точкой диалога, в том же модуле, в котором создается и исполняется соответствующий модальный элемент. Например, используемые в программе диалоговые окна, как правило, порождаются от TDialog, а диалоговые элементы этих окон - от TInputLine и TListViewer. Если Вы поместите все три порожденных типа в один модуль, Ваша программа будет исполняться быстрее, так как взаимосвязанные вызовы объектов не будут приводить к свопингу оверлеев.
Заметим, что размеры всех основных оверлейных модулей - Арр, Objects, Views, Menus приблизительно одинаковы и составляют около 50 Кбайт. С учетом Ваших собственных объектов, обеспечивающих интенсивное взаимодействие с пользователем и порожденных от TWindow или TDialog, типичный размер оверлейного буфера составит не менее 64 КБайт. Если Вы хотите минимизировать потери времени на свопинг и в то же время создать достаточно компактную программу, Вам придется поэкспериментировать с размером оверлейного буфера и/или испытательной зоны. Вы можете также возложить на пользователя Вашей программы ответственность за выбор размера оверлейного буфера, предусмотрев соответствующий параметр в строке вызова программы.
В следующем примере показан возможный способ инициации оверлея.
{$F+,0+,S-}
{$М 8192,65536,655360}
Uses Overlay, Drivers, Memory, Objects, Views, Menus,
Dialogs,istList, StdDlg, App;
{Объявляем оверлейные модули:}
{$0 App }
{$O Dialogs }
{$0 HistList }
{$0 Memory }
{$0 Menus }
{$0 Objects }
{$0 StdDlg }
{$O Views }
const
OvrBufDisk=96*1024;{Размер буфера без EMS-памяти}
OvrBufEMS=72*1024;{Размер буфера при использовании EMS-памяти}
type
ТМуАрр = object (TApplication)
Constructor Init; Destructor Done; Virtual;
.....
end; {TMyApp}
Procedure InitOverlays;
var
FileName: String [79] ;
begin
FileName := ParamStr(0);
Ovrlnit(FileName) ;
if OvrResult <> 0 then
begin
PrintStr('Невозможно открыть оверлейный файл ', FileName);
Halt;
end;
OvrinitEMS;
if OvrResult = 0 then OvrSetBuf(OvrBufEMS)
else
begin
OvrSetBuf(OvrBufDisk) ;
OvrSetRetry(OvrBufDisk div 2);
end
end; {InitOverlays}
Constructor TMyApp.Init;
begin
InitOverlays;
TApplication.Init;
.....
.....
end; {TMyApp.Init}
Destructor TMyApp.Done;
begin
.....
.....
TApplication.Done;
end; {TMyApp.Done}
var
MyApp: TMyApp;
begin
MyApp.Init;
MyApp.Run;
MyApp. Done;
end.
В этой программе используется механизм размещения оверлеев в исполняемом EXE-файле. Для этого после компиляции программы используйте команду ДОС
copy/b MyProg.exe+MyProg.ovr MyProg.exe
Чтобы определить маршрут поиска EXE-файла, в процедуре InitOverlays проверяется параметр вызова с номером 0. Заметим, что в этот параметр автоматически помещается маршрут доступа к загруженной программе только в том случае, когда Ваш ПК работает под управлением MS-DOS версии 3.0 и выше.
Обратите внимание: размер оверлейного буфера можно сделать меньшим, если программа обнаружит доступную EMS-память, ведь в этом случае потери времени на свопинг будут минимальными. Разумеется, инициация оверлея осуществляется до обращения к TApplication.Init, т.к. модуль Арр, в котором находится этот метод, сделан в программе оверлейным.