Команды. Преобразование активных событий в команды. Запрещение и разрешение команд.
В следующем примере создается диалоговое окно с двумя кнопками. При нажатии кнопки "Команда 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, обеспечивающая более удобный вывод сообщений.
Запрещение и разрешение команд
В качестве значения константы-команды можно использовать любое число в диапазоне от 0 до 65535, однако следует учесть, что диапазоны 0…99 и 256…999 Turbo Vision резервирует для стандартных команд и их не следует использовать для определения команд пользователя. Два диапазона зарезервированных команд выбраны потому, что команды с кодами 0…255 можно временно запретить, в то время как остальные команды запретить невозможно.
Для запрещения или разрешения команд используется глобальный тип TCommandSet, представляющий собой множество чисел в диапазоне 0…256 (мощность множеств в Турбо Паскале не может превышать 256, вот почему запретить можно только первые 256 команд). Команды запрещаются обращением к методу DisableCommands, а разрешаются обращением к EnableCommands. Диалоговые элементы, связанные с запрещенными командами, выделяются оттенком и их нельзя выбрать мышью или командными клавишами. Например, если в конструкторе TProgJnit (см. предыдущий пример) перед оператором:
if ExecView(Dia) = cmPrint then
Вставить оператор:
DisableCommand([cmPrint]);
Кнопка "Команда cmPrint" будет выведена цветом фона окна и станет недоступна для диалога.