Преобразование активных событий в команды

Как указать на необходимость выполнения команды? Для этого в Turbo Vision Вы просто создаете событие-команду (evCommand), в поле Command которой помещаете код нужной команды. Например:

const

cmMyCommand =100;

.....

{Ниже показан фрагмент обработчика событий:}

Event.What := evCommand; {Определяем событие-команду} 

Event.Command := cmMyCommand; {Указываем код команды} 

Event.InfoPtr := NIL; {Признак активного события} 

PutEvent(Event); {Создаем событие}

В этом фрагменте событие-команда создается обращением к методу PutEvent. Заметим, что поле Event.InfoPtr должно содержать NIL, если событие активно; если событие уже обработано, для его очистки используется стандартный метод ClearEvent, который помещает в поле What признак evNothing, а в поле InfoPtr - указатель @Self (указатель на таблицу виртуальных методов объекта). Подробнее об использовании поля Event.InfoPtr см.п.18.7.

Вновь созданное событие вернется модальному элементу, который должен знать, как его обрабатывать. Например, часто событие-команда создается обработчиком событий строки статуса как реакция на нажатие предусмотренной в этой строке командной клавиши или отметку мышью соответствующего поля. В этом случае обработчик событий программы может иметь такой вид:

Procedure MyProgram.HandleEvent(var Event);

.....

begin

Inherited HandleEvent(Event); 

case Event.What of 

evCommand:

begin {Обработать команды:} 

case Event.Command of

cmMyCommand: MyProcedure; {Выполнить действия, связанные с командой cmMyCommand}

.....

else

exit {He обрабатывать непредусмотренные команды} 

end; {case}

ClearEvent(Event) {Очистить событие} 

end;

.....

end;

Часто модальным элементом является диалоговое окно с несколькими кнопками. Если Вам необходимо связать с кнопками свои команды и получить выбранную в диалоге команду, Вы можете закрыть окно с помощью вызова EndModal, передав этому методу в качестве параметра код команды.

В следующем примере создается диалоговое окно с двумя кнопками. При нажатии кнопки «Команда cmPrint» окно закроется и на экран будет выведена строка

Действие команды cmPrint

Если нажать кнопку «Выход» или закрыть окно клавишей Esc, эта строка не появится.

Uses CRT,App,Dialogs,Objects,Drivers,Views; 

type

PProg = TProg;

TProg = object (TApplication)

Constructor Init; 

end;

PDial = TDial;

TDial = object (TDialog)

Procedure HandleEvent(var Event: TEvent); Virtual;

end; 

const

cmPrint = 100; Constructor TProg.Init; 

var

R: TRect;

Dia: PDial; 

begin

Inherited Init;

R.Assign(20,9,60,17);

Dia := New(PDial, Init(R,''));

R.Assign(3,4,22,6) ;

DiaA.Insert(New(PButton,

Init(R,'Команда cm~P~rint',cmPrint,bfDefault)));

R.Assign(23,4,35,6);

DiaA.Insert(New(PButton,Init(R,'Выход',cmCancel,bfNormal)));

if ExecView(Dia) = cmPrint then

begin

{Вывод сообщения "в лоб", с помощью стандартных средств Турбо Паскаля. В.- TurboVision есть более удобные способы вывода сообщений}

GotoXY(30,12);

TextColor(Black);

TextBackground(White);

Write (' Действие команды cmPrint ')

end

end; {TProg.Init}

Procedure TDial.HandleEvent(var Event: TEvent); 

begin

Inherited HandleEvent(Event);

if (Event.What = evCommand) and

(Event.Command = cmPrint) then EndModal(cmPrint) 

end; {TDial.HandleEvent) 

var

Prog: TProg; 

begin

Prog.Init;

Prog.Run;

Prog.Done 

end.

В обработчике событий диалогового окна TDial.HandleEvent вначале вызывается стандартный обработчик TDialog.HandleEvent. Это дает возможность кнопке «Команда cmPrint» преобразовать событие, связанное с ее выбором, в команду cmPrint. Вновь созданное событие возвращается обработчику TDialHandleEvent, т.к. именно он является обработчиком событий модального элемента. Возвращаемая модальным элементом команда служит значением стандартной функции ExecView. Для упрощения программы вывод сообщения реализуется стандартными средствами Турбо Паскаля. В Turbo Vision имеется процедура MessageBox, обеспечивающая более удобный вывод сообщений.