Добро пожаловать
в справочную службу системы Turbo Vision!
В текстовом файле для справочной службы Вы должны подготовить {заголовки тем: topic} и {перекрестные ссылки: CrossRef}. Весь текст от одного заголовка до другого представляет собой текст справки и выводится в окне справочной службы. При подготовке текста учитываются следующие соглашения:
если очередная строка начинается символом пробел, эта строка не будет форматироваться с учетом границ окна;
во всех остальных случаях выводимый в окне текст форматируется с учетом границ окна: слово, не умещающееся на строке, переносится на следующую строку экрана. Для преобразования текстового файла в файл справочной службы вызывается программа TVHC.EXE:
TVHC NAMETXT [NAMEHELP [NAMEPAS]]
Здесь NAMETXT - имя исходного текстового файла; NAMEHLP -имя выходного файла справочной службы; NAMEPAS - имя выходного файла, содержащего текст PAS-модуля с определением всех контекстов в виде констант chXXXX. Имя файла NAMEHELP можно не указывать - в этом случае выходной файл будет иметь имя входного файла и расширение HLP. Если не указан файл HELPPAS, будет создан файл с именем исходного и расширением PAS.
По умолчанию программа использует расширение ТХТ для входного файла, HLP для выходного файла справочной службы и PAS - для файла констант. .topic Topic=l Заголовок темы имеет следующий формат:
.topic Name[=N] [, Namel[=N2] [...]]
Здесь Name - имя темы (может состоять только-из латинских букв и цифр; разница в высоте букв игнорируется); N -контекст справочной службы, при котором выдается данная справка.
В квадратных скобках показаны необязательные параметры. Если опущен контекст N, программа присваивает соответствующей перекрестной ссылке контекст NPrev + 1, где NPrev - предыдущий определенный в программе контекст. .topic CrossRef=2
В произвольное место текста справки можно вставить так называемую перекрестную ссылку:
(text[:title])
Здесь () - фигурные скобки; text - произвольный текст или заголовок темы; title - заголовок темы; этот параметр вместе с двоеточием опускается, если text - заголовок темы.
Если Вы подготовите такой файл, то после вызова
tvhc helptest
будут созданы два файла: файл справочной службы helptest.hlp и файл модуля с определениями констант helptest.pas. Содержимое этого последнего файла будет таким:
unit helptest;
interface
const
hcCrossRef = 2;
hcNoContext= 0;
hctopic = 1;
implementation
end.
Следующая программа будет выдавать контекстно-зависимые справочные сообщения
из файла helptest.hlp при каждом нажатии на F1.
Uses App, Menus, Drivers, Views, Objects, HelpFile, Dialogs;
const
cmChangeCtx =1000;
type
PCtxView = ^TCtxView;
TCtxView = object (TView)
Constructor Init;
Procedure Draw; Virtual;
end;
MyApp = object (TApplication)
Ctx: PCtxView;
Constructor Init;
Procedure InitStatusLine; Virtual;
Procedure HandleEvent(var Event: TEvent); Virtual;
end ;
PMyHelpWindow = AMyHelpWindow;
MyHelpWindow = object (THelpWindow)
Function GetPalette: PPalette; Virtual;
end;
Procedure MyApp.InitStatusLine;
var
R: TRect;
begin
GetExtent(R);
R.A.Y := pred(R.B.Y);
StatusLine := New(PStatusLine,Init(R,
NewStatusDef(0, $FFFF,
NewStatusKey('~Alt-X~ Выход', kbAltX, cmQuit,
NewStatusKey('~F1~ Помощь',kbF1, cmHelp,
NewStatusKey('~F2~ Изменить контекст',kbF2,
cmChangeCtx,
NewStatusKey('~F5~ Распахнуть окно1, kbF5,
cmZoom, NIL)))},
NIL)))
end;
Constructor MyApp.Init;
begin
TApplication.Init;
Ctx := NewtPCtxView, Init);
Insert(Ctx);
RegisterHelpFile
end;
Procedure MyApp.HandleEvent;
var
HF: PHelpFile;
HS: PDosStream;
HW: PMyHelpWindow;
const
HelpOpen: Boolean = False;
Procedure DoHelp;
{Обеспечивает доступ к контекстно-зависимой справочной службе}
var
С: Word;.
begin
ClearEvent(Event);
{ Открываем DOS-поток: }
HS := New(PDosStream, Init('HELPTEST.HLP', stOpenRead));
{ Создаем и инициируем экземпляр объекта THelpFile: }
HF := New(PHelpFile, Init(HS));
HelpOpen := HSA.status = stOk;
if HelpOpen then
begin
{Создаем окно справочной службы и связываем его с потоком HS и текущим контекстом:}
HW := New(PMyHelpWindow, Init(HF, GetHelpCtx));
if ValidView(HW) <> NIL then
begin
С := ExecView(HW); {Выдаем справку}
Dispose(HW) {Ликвидируем окно}
end;
HelpOpen := False
end
else
Dispose (HF, Done)
end;
begin
TApplication.HandleEvent (Event) ;
case Event . Command of
cmHelp: if not HelpOpen then
DoHelp; {Выдаем справку}
cmChangeCtx: {Изменяем контекст по клавише F2}
begin
if HelpCtx = 3 then
HelpCtx := 0
else
inc (HelpCtx) ;
Ctx^.Draw;
ClearEvent (Event)
end
end
end;
Function MyHelpWindow.GetPalette;
const
P = #16#17#18#19#20#47#21#13;
C: String [8] = P;
begin
GetPalette := @C
end ;
Constructor TCtxView. Init;
var
R: TRect;
begin
R. Assign (67 , 0, 80, 1) ;
TView.Init(R) ;
end;
Procedure TCtxView. Draw;
var
S: String;
B: TDrawBuffer;
C: Byte;
begin
Str (Application^. HelpCtx, S) ;
S := 'Контекст = '+S;
С := GetColor(2) ;
MoveChar(B, ' ', C, Size.X) ;
MoveStr(B, S, C) ;
WriteLine(0, 0,Size.X,1,B)
end;
var
Р: МуАрр;
begin
P.Init;
P.Run;
P.Done
end.
В программе предусмотрена смена текущего контекста с помощью клавиши F2. Разумеется, в реальной программе смена контекста будет, судя по всему, происходить иначе: обычно в текст конструктора Init видимого элемента вставляется оператор
HelpCtx := NNN;
где NNN - нужный контекст.
Для визуализации текущего контекста в программе используется простой объект TCtxView, с помощью которого в верхнем правом углу экрана выводится строка
Контекст = N
N - текущий контекст.