Контекстная помощь
В Turbo Vision предусмотрены средства, облегчающие создание контекстно-зависимой справочной службы. С этой целью каждый видимый элемент имеет специальное шестнадцатиразрядное поле TView.HelpCtx, содержимым которого Вы можете распоряжаться по своему усмотрению. Обычно каждому видимому элементу присваивается свой код (целое число в диапазоне от 0 до 65535), устанавливаемый в поле HelpCtx. В этом случае при нажатии на заранее обусловленную командную клавишу, открывающую доступ к справочной службе (обычно это клавиша F1), программа может получить текущий контекст (прямым чтением поля HelpCtx или с помощью метода GetHelpCtx) и передать его в качестве параметра вызова справочной службе.
Где обрабатывать событие, связанное с нажатием клавиши вызова справочной службы? Идеальным местом для этого является источник всех событий – метод GetEvent. Этот метод связан с любым видимым элементом, в том числе и с терминальным видимым объектом, и поэтому без труда может получить текущий контекст.
В следующем примере на экране создается диалоговое окно с двумя кнопками. Клавиша F1 используется для доступа к справочной службе. Если активна (выбрана) левая кнопка, нажатие на F1 даст сообщение "Левая кнопка", если правая – "Правая кнопка". Если на экране нет диалогового окна (оно вызывается клавишей F2), появится сообщение "Нет окна".
Uses CRT,App,Dialogs,Obj ects,Drivers,Views,Menus; type PProg = TProg; TProg = object (TApplication) Procedure HandleEvent(var Event: Tevent); Virtual; Procedure GetEvent(var Event: Tevent); Virtual; Procedure InitStatusLine; Virtual; end; Procedure TProg.HandleEvent(var Event: TEvent); Procedure Dialoglnit; var R: TRect; Dia: PDialog; B1,B2: PButton; с: Word; begin ClearEvent(Event); R.Assign(20.9.60.17); Dia: = New(PDialog, Init(R,'')); R.Assign(3.4.19.6); Bl: = New(PButton,Init(R,'Левая',0.0)); El*.HelpCtx: = 1; DiaA.insert (B1); R.Assign(20.4.35.6); B2: = New(PButton,Init(R,'Правая',0.0)); В2. HelpCtx: = 2; Dia.Insert (B2); с: = ExecView(Dia) end; {Dialоg Init} begin {TProg.HandleEvent } TApplication.HandleEvent (Event); if (Event. What = evCommand) (Event. Command = cmMenu) then Dialoglnit end; {TProg. Handl eEvent} Procedure TProg. InitStatusLine; var R: TRect; begin GetExtent (R); R.A.Y: = pred(R.B.Y); StatusLine: = New(PStatusLine, Init(R, NewStatusDef (О, О, {Начальная строка статуса} NewStatusKey (' ~ALT + X~ Выход', kbALTX, cmQuit, NewStatusKey ('~F1~ Справка', kbFl,cmHelp, NewStatusKey ('~F2~ Окно диалога', kbF2, cmMenu, NIL))), NewStatusDef (1, 2, {Строка статуса с диалоговым окном} NewStatusKey (' ~Esc~ Выход', kbEsc, cmCancel, NewStatusKey ('~F1~ Справка', kbFl, cmHelp, NIL)),.NIL)))); end; {TProg. InitStatusLine} Procedure TProg. GetEvent (var Event: TEvent); const txt: array [0..2] of String = ('Нет окна', 'Левая кнопка', 'Правая кнопка'); begin TApplication. GetEvent (Event); if Event. Command = cmHelp then begin GotoXY(60,l); TextColor (Black+Blink); TextBackGround (White); Write (Txt [GetHelpCtx]); Delay (2000); GotoXY(60,l); Write (' ') end end; {TProg. GetEvent} var Prog: TProg; begin Prog.Init; Prog. Run; Prog. Done end.