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

TGroup Views


+---------+ | TObject | +----+----+ +----+----+ | TView | +----+----+ +====+====+ | TGroup | +=+==+==+=+ +----------+ | +------------+ +----+----+ +----+-----+ +------+-------+ | TWindow | | TDeskTop | | TProgram | +----+----+ +----------+ +------+-------+ +----+----+ +------+-------+ | TDialog | | TApplication | +---------+ +--------------+

Объекты TGroup и их порождения (которые мы для краткости называем группами) - основная управляющая сила Turbo Vision. Группы - это специальные порождения видимых элементов. В дополнение ко всем полям и методам, порожденным от TView, группа имеет дополнительные поля и методы (включая перекрывающие), позволяющие управлять динамически связанными списками видимых элементов (включая другие группы) как одним объектом. Мы часто говорили о подэлементах группы даже если эти подэлементы сами являются группами. Хотя группа имеет прямоугольную границу от своего предка TView, группа видима только через отображение своих подэлементов. Концептуально группа рисует себя через методы Draw своих подэлементов. Группа владеет своими подэлементами и они должны обеспечивать зарисовку (заполнение) всего прямоугольника группы Bounds. Во время работы программы подэлементы и подгруппы создаются, вставляются в группы и отображаются в результате деятельности пользователя и событий, генерируемых программой. Подэлементы могут быть легко скрыты, удалены из группы действиями пользователя (такими как закрытие окна или выход из диалогового окна). 3 порожденных от TGroup типа: TWindow, TDeskTop и TApplication (через TProgram) иллюстрируют концепцию групп и подгрупп. TApplication обычно владеет объектами TDeskTop, TStatusLine и TMenuView. TDeskTop порожден от TGroup и таким образом может владеть объектами TWindow, которые в свою очередь владеют объектами TFrame, TScrollBar и т.д. Объекты TGroup передают рисование и обработку событий своим подэлементам, как объясняется в главах 4 и 5. Многие из основных методов TView перекрываются в TGroup. Например, сохранение и чтение группы из потока может быть достигнуто одним вызовом TGroup.Store и TGroup.Load. Объекты TGroup обычно не имеют экземпляров; Вы будете создавать экземпляры от типов объектов, порожденных от TGroup: TApplication, TDeskTop и TWindow.


Поля

Last Last : PView; Только чтение Указывает на последний подэлемент группы (самый дальний от вершины в Z-порядке). Поле Next последнего подэлемента указывает на первый подэлемент, чье поле Next указывает на следующий подэлемент и т.д. формируя циклический список.

Current Current: PView; Только чтение Указывает на выбранный подэлемент или равен nil, если нет выбранного подэлемента.

См. так же: sfSelected, TView.Select

Buffer Buffer: PVideoBuf; Только чтение Указывает на буфер, используемый для кэширования операций перерисовки или равен nil, если группа не имеет кэш-буфера. Кэш-буфера создаются и уничтожаются автоматически, если флаг ofBuffered в поле Options не очищен.

См. так же: TGroup.Draw, TGroup.Lock, TGroup.Unlock

Phase Phase: (phFocused, phPreProcess, phPostProcess); Только чтение Текущая фаза обработки для активного события. Подэлементы, в которых установлены флаги ofPreProcess и/или ofPostProcess могут проверять Owner^.Phase, чтобы определить, в какой из фаз phPreProcess, phFocused или phPostProcess был вызван их HandleEvent.

См. так же: ofPreProcess, ofPostProcess, TGroup.HandleEvent

Методы

Init constructor Init(var Bounds: TRect); Вызывает TView.Init, устанавливает в Options ofSelectable и ofBuffered и устанавливает EventMask в $FFFF.



См. так же: TView.Init, TGroup.Load

Load constructor Load(var S: TStream); Загружает всю группу из потока, вызывая вначале наследуемый TView.Load, а затем используя TStream.Get для чтения каждого подэлемента. После загрузки всех подэлементов выполняет проход по подэлементам для установки всех считанных указателей с использованием GetPeerViewPtr. Если тип объекта, порожденного от TGroup содержит поля, которые указывают на подэлементы, он должен использовать GetSubViewPtr внутри Load, чтобы читать эти поля.

См. так же: TView.Load, TGroup.Store, TGroup.GetSubViewPtr

Done destructor Done; virtual; Перекрывается: Часто Перекрывает TView.Done. Скрывает группу, используя Hide, освобождает каждый элемент группы, используя Dispose(P, Done) и наконец вызывает наследуемый TView.Done.



См. так же: TView.Done

ChangeBounds procedure ChangeBounds(var Bounds: Trect); virtual; Перекрывается: Никогда Перекрывает TView.ChangeBounds. Изменяет границы группы в Bounds, затем вызывает CalcBounds и ChangeBounds для каждого элемента группы.

См. так же: TView.CalcBounds, TView.ChangeBounds

DataSize function DataSize: Word; virtual; Перекрывается: Редко Перекрывает TView.DataSize. Возвращает общий размер группы, вызывая и накапливая DataSize для каждого подэлемента.

См. так же: TView.DataSize

Delete procedure Delete(P: PView); Удаляет подэлемент P из группы и перерисовывает другие подэлементы, если необходимо. Поля Owner и Next в Р устанавливаются в nil.

См. так же: TGroup.Insert

Draw procedure Draw; virtual; Перекрывается: Никогда Перекрывает TView.Draw. Если кэш-буфер существует (см. поле TGroup.Buffer), то буфер пишется на экран с использованием TView.WriteBuf. Иначе каждый подэлемент рисует себя с помощью TGroup.Redraw.

См. так же: TGroup.Buffer, TGroup.Redraw

EndModal procedure EndModal(Command: Word); virtual; Перекрывается: Никогда Если группа - это текущий модальный видимый элемент, модальное состояние завершается. Command передается в ExecView, который возвращает Command как результат. Если эта группа не текущий модальный видимый элемент, она вызывает TView.EndModal.

См. так же: TGroup.ExecView, TGroup.Execute

EventError procedure EventError(var Event: TEvent); virtual; Перекрывается: Иногда EventError вызывается когда в цикле обработчика события модального TGroup.Execute встречается событие, которое не может быть обработано. Действие по умолчанию: Если Owner группы не nil, EventError вызывает EventError своего владельца. Обычно эта цепочка распространяется до EventError из TApplication. Вы можете перекрыть EventErrоr для выполнения требуемого действия.

См. так же: TGroup.Execute, TGroup.ExecView, sfModal

ExecView function ExecView(P: PView): Word; ExecView - это модальный вариант немодальных методов Insert и Delete. В отличие от Insert после вставки видимого элемента в группу ExecView ожидает видимый элемент для выполнения, затем удаляет видимый элемент и возвращает результат выполнения. ExecView используется в ряде мест в Turbo Vision, например для реализации TApplication.Run и для выполнения модальных диалоговых окон. ExecView сохраняет текущий контекст (выбранный видимый элемент, модальный видимый элемент и набор команд) делает Р модальным, вызывая Р^.SetState(sfModal, True), вставляет Р в группу (если он еще не вставлен) и вызывает P^.Execute. Когда P^.Execute возвращает управление, группа восстанавливается в предыдущее состояние и результат P^.Execute возвращается как результат вызова ExecView. Если P - nil в вызове ExecView, возвращается значение cmCancel.



См. так же: TGroup.Execute, sfModal

Execute function Execute: Word; virtual; Перекрывается: Редко Перекрывает TView.Execute. Execute - это главный цикл событий группы: она постоянно получает события, используя GetEvent и обрабатывает их, используя HandleEvent. Цикл событий завершается группой или подэлементом с помощью вызова EndModal. Однако до возврата Exec вызывает Valid для проверки, что модальное состояние в самом деле было завершено. Реализация TGroup.Execute показана ниже. Заметим, что EndState - это private поле в TGroup, которое устанавливается вызовом EndModel.

function TGroup.Execute: Word; var E: TEvent; begin repeat EndState := 0; repeat GetEvent(E); HandleEvent(E); if E.What <> evNothing then EventError(E); until EndState <> 0; until Valid(EndState); Execute := EndState; end;

См. так же: TGroup.GetEvent, TGroup.HandleEvent, TGroup.EndModal, TGroup.Valid

First function First: PView; Возвращает указатель на первый подэлемент (ближайший к вершине в Z-порядке), или nil, если в группе нет подэлементов.

См. так же: TGroup.Last

FirstThat function FirstThat(Test: Pointer): PView; FirstThat применяет булевскую функцию, заданную указателем на функцию Test к каждому подэлементу в Z-порядке до тех пор, пока Test не вернет True. Результат - указатель на подэлемент, для которог Test возвращает True, или nil, если функция Test возвращает False для всех подэлементов. Test должна указывать дальнюю локальную функцию, использующую параметр типа Pointer и возвращающую значение типа Boolean. Например:

function MyTestFunc(P: PView): Boolean; far;

Метод SubViewAt, показанный ниже, возвращает указатель на первый подэлемент, содержащий данную точку.

function TMyGroup.SubViewAt(Where: TPoint): PView;

function ContainsPoint(P: PView): Boolean; far; var Bounds: TRect; begin P^.GetBounds(Bounds); ContainsPoint := (P^.State and sfVisible <> 0) and Bounds.Contains(Where); end;

begin SubViewAt := FirstThat(@ContainsPoint); end;

См. так же: TGroup.ForEach



ForEach procedure ForEach(Action: Pointer); ForEach выполняет действие, заданное указателем Action на процедуру к каждому подэлементу группы в Z-порядке. Action должна указывать на дальнюю локальную процедуру, использующую параметр типа Pointer, например:

procedure MyActionProc(P: PView); far;

Метод MoveSubViews перемещает все подэлементы группы на значение, заданное в Delta. Заметим использование Lock и UnLock для ограничения числа выполняемых операций по перерисовке для предотвращения неприятного мерцания.

procedure TMyGroup.MoveSubViews(Delta: TPoint);

procedure DoMoveView(P: PView); far; begin P^.MoveTo(P^.Origin.X + Delta.X, P^.Origin.Y + Delta.Y); end;

begin Lock; ForEach(@DoMoveView); UnLock; end;

См. так же: TGroup.FirstThat

GetData procedure GetData(var Rec); virtual; Перекрывается: Редко Перекрывает TView.GetData. Вызывает GetData для каждого подэлемента в Z-порядке увеличивая положение, заданное в Rec на DataSize для каждого подэлемента.

См. так же: TView.GetData, TGroup.SetData

GetHelpCtx function GetHelpCtx: Word; virtual; Перекрывается: Редко Возвращает контекст подсказки для текущего активного видимого элемента, вызывая метод выбранного подэлемента GetHelpCtx. Если нет контекста подсказки, заданного подэлементом, GetHelpCtx возвращает значение собственного поля HelpCtx.

GetSubViewPtr procedure GetSubViewPtr(var S: TStream; var P); Загружает указатель на подэлемент Р из потока S. GetSubViewPtr должна использоваться только внутри констрактора Load для чтения значений указателей, которые были записаны вызовом PutSubViewPtr из метода Store.

См. так же: TView.PutSubViewPtr, TGroup.Load, TGroup.Store

HandleEvent procedure HandleEvent(var Event: TEvent); virtual; Перекрывается: Часто Перекрывает TView.HandleEvent. Группа обрабатывает события, передавая их в методы HandleEvent одного или более подэлементов. Однако действительный маршрут зависит от класса события. Для активных событий (по умолчанию evKeyDown и evCommand, см. переменную FocusedEvents) обработка событий выполняется в 3 фазы: во-первых, поле Phase устанавливается в phPreProcess и событие передается в HandleEvent всех подэлементов, в которых установлен флаг ofPreProcess. Затем Phase устанавливается в phFocused и событие передается в HandleEvent текущего выбранного видимого элемента. Наконец, Phase устанавливается в phPostProcess и событие передается в HandleEvent всех подэлементов, в которых установлен флаг ofPostProcess. Для позиционированных событий (по умолчанию evMouse, см. переменную PositionalEvents), событие передается в HandleEvent первого подэлемента, чей ограничивающий прямоугольник содержит точку, заданную в Event.Where. Для общих событий (т.е. не активных и не позиционированных), событие передается в HandleEvent каждого подэлемента группы в Z-порядке.



Примечание: Если поле EventMask подэлемента маскирует класс события, TGroup.HandleEvent никогда не будет посылать события этого класса подэлементу. Например, по умолчанию EventMask из TView запрещает evMouseUp, evMouseMove и evMouseAuto, поэтому TGroup.HandleEvent никогда не будет посылать такие события стандартному TView.

См. так же: FocusedEvents, PositionalEvents, константы событий evXXXX, TView.EventMask, методы HandleEvent

Insert procedure Insert(P: PView); Вставляет видимый элемент, заданный Р в список подэлементов группы. Новый подэлемент помещается над всеми другими видимыми подэлементами. Если в подэлементе установлены флаги ofCenterX и/или ofCenterY, он центрируется в группе соответственно. Если видимый элемент имеет установленный флаг sfVisible, он будет показан в группе - иначе остается невидимым до тех пор, пока не будет показан специально. Если видимый элемент имеет установленным флаг ofSelectable, он становится текущим выбранным подэлементом.

InsertBefore procedure InsertBefore(P, Target: PView); Вставляет видимый элемент, заданный Р, перед видимым элементом, заданным Target. Если Target nil, видимый элемент размещается после всех видимых элементов группы.

См. так же: TGrouup.Unsert, TGroup.Delete

Lock procedure Lock; Блокирует группу, задерживая все записи, производимые подэлементами на экран до тех пор, пока группа не будет разблокирована. Lock не имеет эффекта, если в группе нет кэш-буфера (см. ofBuffered и TGroup.Buffer). Lock работает, увеличивая счетчик блокировок, который соответственно уменьшается с помощью UnLock. Когда вызов UnLock уменьшает счетчик до 0, вся группа пишется на экран, используя образ, созданный в кэш-буфере. Накапливая интенсивные операции прорисовки между вызовами Lock и UnLock, можно сократить или полностью избавиться от неприятного мерцания экрана. Например, TDeskTop.Tile и TDeskTop.Cascade используют Lock и UnLock для сокращения мерцания.

Примечание: Вызовы Lock и UnLock должны быть сбалансированы, иначе группа может остаться в постоянно заблокированном состоянии, что приведет к тому, что она не сможет вывести себя при необходимости.



См. так же: TGroup.Unlock

PutSubViewPtr procedure PutSubViewPtr(var S: TStream; P: PView); Сохраняет указатель подэлемента Р в потоке S. PutSubViewPtr должна использоваться только внутри метода Store для записи значений указателей, которые позже будут читаться вызовами GetSubViewPtr в констракторе Load.

См. так же: TGroup.GetSubViewPtr, TGroup.Store, TGroup.Load

Redraw procedure Redraw; Перерисовывает подэлементы группы в Z-порядке. TGroup.Redraw отличается от TGroup.Draw тем, что перерисовка никогда не производится выводом из кэш-буфера.

См. так же: TGroup.Draw

SelectNext procedure SelectNext(Forwards: Boolean); Если Forwards - True, SelectNext будет выбирать (делать текущим) следующий выбираемый подэлемент (подэлемент, в котором установлен бит ofSelectable) группы в Z-порядке. Если Forwards - False, метод выбирает предыдущий выбираемый элемент.

См. так же: константы флагов опций ofXXXX

SetData procedure SetData(var Rec); virtual; Перекрывается: Редко Перекрывает TView.SetData. Вызывает SetData для каждого подэлемента в порядке, обратном Z-порядку, увеличивая положение, заданное в Rec, на DataSize для каждого подэлемента.

См. так же: TGroup.GetData, TView.SetData

SetState procedure SetState(AState: Word; Enable: Boolean);virtual; Перекрывается: Редко Перекрывает TView.SetState. Вначале вызывает унаследованный TView.State, затем обновляет подэлементы следующим образом: Если AState - sfActive, sfExposed или sfDragging, SetState вызывается для каждого подэлемента для его обновления. Если AState - sfFocused, то вызывается текущий выбранный подэлемент для своей активизации.

См. так же: TView.SetState

Store procedure Store(var S: TStream); Сохраняет всю группу в потоке вначале вызывая унаследованный TView.Store, затем используя TStream.Put для вывода каждого подэлемента. Если объектный тип, порожденный от TGroup, содержит поля, которые указывают на подэлементы, он должен использовать PutSubViewPtr внутри его Store для записи этих полей.

См. так же: TView.Store, TGroup.PutSubViewPtr, TGroup.Load

Unlock procedure Unlock; Разблокирует группу, уменьшая счетчик блокировки. Если счетчик блокировки становится 0, то вся группа выводится на экран, используя образ, созданный в кэш-буфере.

См. так же: TGroup.Lock

Valid function Valid(Command: Word): Boolean; virtual; Перекрывает TView.Valid. Возвращает True, если вызовы Valid всех подэлементов возвращают True. TGroup.Valid используется в конце цикла обработки событий в TGroup.Execute для подтверждения, что завершение разрешено. Модальное состояние не может быть завершено до тех пор, пока все вызовы Valid не вернут True. Подэлемент может вернуть False, если он хочет, чтобы управление осталось у него.

См. так же: TView.Valid, TGroup.Execute


Содержание раздела