Среда, 16.07.2025, 15:48 Приветствую Вас Гость

On-line: Книги, учебники, статьи

Главная | Регистрация | Вход | RSS

Контекстная помощь(2)

Добро пожаловать

в справочную службу системы 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 - текущий контекст.

Вход на сайт
Поиск
Календарь
«  Июль 2025  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей
Наш опрос
Как Вам удобнее??
Всего ответов: 341
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0