TURBO PASCAL |
Новости
|
Преобразование активных событий в команды
Как указать на необходимость выполнения команды? Для этого в 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, обеспечивающая более удобный вывод сообщений.
|
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |