Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lection.doc
Скачиваний:
13
Добавлен:
16.11.2019
Размер:
343.55 Кб
Скачать
  1. Выбор и активизация видимых элементов.

Как правило, пользователь взаимодействует с одним, выбранным им, объектом (например, TMenuBar), или группой объектов (TWindow). При этом ввод пользователя должен попадать именно в выбранный объект. Для требуемой передачи событий в дереве программы создается цепочка выбранных элементов.

Внутри каждой группы может быть только один выбранный элемент. Объект-владелец группы сохраняет указатель на выбранный подэлемент в поле Current типа PView, наследуемом от TGroup. Если ни один из подэлементов группы не выбран, поле Current не содержит указателя (Current=nil). Выбранный подэлемент имеет установленный флаг sfSelected. Атрибут ofSelectable поля Options определяет, может ли данный элемент быть выбранным внутри своего владельца. Так, например, у рамки и полос скроллинга окна атрибут ofSelectable не установлен и они не могут выбираться.

Выбранные элементы, образующие непрерывную цепочку, начиная от TApplication, называются сфокусированными и имеют установленный флаг sfFocused (рис.8). По этой цепочке и будет передаваться ввод пользователя.

Флаг sfActive устанавливается в поле State окна и всех его подэлементов, если окно выбрано и сфокусировано, т.е. когда оно становится активным. Установка флага активности позволяет подэлементам окна изменять свой вид при активизации окна; например, объект рамки TFrame перекрывает метод TView.SetState следующим образом:

procedure TFrame.SetState(AState: Word; Enable: Boolean);

begin

TView.SetState(AState, Enable);

{ сначала вызывает наследуемый метод }

if AState and (sfActive + sfDragging) <> 0 then DrawView;

{ перерисовывает рамку, если она изменяет активность или перемещается }

end; ,

при установленном флаге sfActive рамка рисуется двойной, иначе – одинарной.

Флаг sfModal устанавливается, когда видимый элемент становится модальным. Модальность – особый режим взаимодействия видимых элементов. Модальный видимый элемент является корнем локального дерева событий: события обрабатываются только внутри дерева, образованного модальным элементом и его прямыми и косвенными подэлементами; другим видимым элементам события недоступны.

Сделать элемент модальным можно, вставив его в группу с помощью функции TGroup.ExecView(P: PView), где P – указатель на вставляемый объект. Метод ExecView сначала фиксирует текущее состояние (модальный элемент, выбранный подэлемент группы), затем делает P модальным, вызывая P^.SetState(sfModal, True), вставляет P в группу (если он еще не вставлен) и вызывает функцию P^.Execute, которая должна осуществлять получение и обработку событий, пока P остается модальным. По завершении модального состояния объекта P группа возвращается в исходное состояние. Если до вызова ExecView объект P не был подэлементом группы, то группа удаляет его из списка, не освобождая. Результат, возвращаемый P^.Execute (код завершения модального состояния), выдается как результат вызова функции ExecView.

Пример модального элемента – диалоговое окно. Когда диалоговое окно вставляется в панель экрана с помощью TDeskTop.ExecView, только оно и его подэлементы активны (исключение – строка статуса всегда остается активной). Диалоговое окно получает события и управляет ими до тех пор, пока пользователь не закроет его, нажав кнопку «OK», «Cancel» или отметит закрывающую кнопку на рамке окна.

Видимых элементов, имеющих установленный флаг sfModal, в программе может быть несколько, но действительно модальным, т.е. получающим и обрабатывающим события, является только один – тот, который был вызван для модального выполнения последним (например, при вложенных вызовах диалоговых окон).

Функция TView.TopView возвращает указатель на текущий модальный видимый элемент.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]