Иллюстрированный самоучитель по Turbo Pascal

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

В 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.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.