Турбо Паскаль 6.0



Поле Phase.


Каждая группа имеет поле Phase, которое принимает три значения: phFocused, phPreProcess и phPostProcess. Проверяя флаг Phase владельца, видимый элемент может сказать, будет ли обрабатываться событие активное событие до, во время или после передачи. Это иногда необходимо, т.к. некоторые видимые элементы ожидают различные события или реагируют на одинаковые события по разному, в зависимости от фазы. Рассмотрим случай простого диалогового окна, которое содержит строку ввода и клавишу с меткой "All right" с коротким набором "A". С управляющими элементами обычного диалогового окна Вы в действительности не имеете дело с фазой. Большинство элементов управления имеют ofPostProcess установленным по умолчанию, поэтому нажатия клавиш (активные события) будут передаваться им, позволяя перехватывать активность, если была нажата короткая клавиша. Нажатие "А" передает активность кнопке "All right". Теперь предположим что активна строка ввода, так что нажатия клавиш обрабатываются и вставляются строкой ввода. Нажатие клавиши "А" вставляет "А" в строку ввода и кнопка никогда не увидит это событие, поскольку активный видимый элемент обработал ее. Если вы зададите предварительную обработку клавиши "А" для кнопки, она сможет перехватывать короткую клавишу до того как ее обработает активный видимый элемент. К сожалению это не даст Вам набрать букву "А" в строке ввода! Решение очень просто: сделайте проверку в кнопке для различных коротких клавиш до и после того как активный элемент обработает событие. По умолчанию кнопка просматривает свою короткую клавишу в форме Alt-буква до процесса и в форме буквы после процесса. Вот почему Вы можете использовать короткий набор Alt-буква в диалоговом окне, но можете обрабатывать обычные буквы только когда активный элемент управления не "ест" клавиши. Это просто сделать. По умолчанию кнопки имеют установленные ofPreProcess и ofPostProcess, так что видят активные события и до и после активного видимого элемента, но внутри метода HandleEvent кнопка проверяет некоторые клавиши только если активный элемент управления уже видел событие:

evKeyDown: { это часть оператора case } begin C := HotKey(Title^); if (Event.KeyCode = GetAltCode(C)) or (Owner^.Phase = phPostProcess) and (C <> #0) and (upcase(Event.CharCode) = C) or (State and sfFocused <> 0) and (Event.CharCode = ' ') then begin PressButton; ClearEvent(Event); end; end;




Содержание  Назад  Вперед