TDeskTop App
+---------+
| TObject |
+----+----+
+----+----+
| TView |
+----+----+
+----+----+
| TGroup |
+-+--+--+-+
+----------+ | +------------+
+----+----+ +====+=====+ +------+-------+
| TWindow | | TDeskTop | | TProgram |
+----+----+ +==========+ +------+-------+
+----+----+ +------+-------+
| TDialog | | TApplication |
+---------+ +--------------+
TDescTop - это простая группа, которая владеет видимым
элементом TBackground, на котором появляются окна и другие
видимые элементы программы. TDeskTop представляет область
панели экрана, располагаемой между верхней полосой меню и
нижней строкой статуса.
Методы
Init constructor Init(var Bounds: TRect);
Создает группу TDeskTop с размером Bounds. По умолчанию
GrowMode установлена в gfGrowHiX + gfGrowHiY. Init так же
вызывает NewBackground для вставки видимого элемента
TBackgroud в группу.
См. так же: TDeskTop.NewBackGround, TGroup.Init,
TGroup.Insert
Cascade procedure Cascade(var R: TRect);
Заново отображает все окна, принадлежащие панели экрана, в
каскадном формате. Первое окно в Z порядке (самое нижнее)
расширяется на всю панель экрана, а каждое последующее
окно заполняет область, начинающуюся на одну строку ниже и
на одну колонку правее, чем предыдущее. Активное окно
появляется на вершине как самое наименьшее.
См. так же: ofTileable, TDeskTop.Tile
NewBackGround function NewBackGround: PView; virtual;
Перекрывается: Иногда
Возвращает указатель на фон, используемый в панели экрана.
Этот метод вызывается в методе TDeskTop.Init. Наследуемые
объекты могут изменить тип фона, перекрывая этот метод.
См. так же: TDeskTop.Init
HandleEvent procedure HandleEvent(var Event: TEvent); virtual;
Перекрывается: Редко
Вызывает TGroup.HandleEvent и отрабатывает команды cmNext
(обычно горячая клавиша F6) и cmPrevious циклическим
проходом по окнам (начиная с текущего выбранного видимого
элемента) принадлежащим панели экрана.
См. так же: TGroup.HandleEvent, константы команд cmXXXX
Tile procedure Tile(var R: TRect);
Заново отображает все видимые элементы с ofTileable,
принадлежащие панели экрана в черепичном формате.
См. так же: TDeskTop.Cascade, ofTileable
TileError procedure TileError; virtual; Перекрывается: Иногда
TileError вызывается, если возникла ошибка во время работы
TDeskTop.Tile или TDeskTop.Cascade. По умолчанию ничего не
делает. Вы можете перекрыть ее, чтобы указать
пользователю, что программа не может реорганизовать окна.
См. так же: TDeskTop.File, TDeskTop.Cascade
TDialog Dialogs
+---------+
| TObject |
+----+----+
+----+----+
| TView |
+----+----+
+----+----+
| TGroup |
+-+--+--+-+
+----------+ | +------------+
+----+----+ +----+-----+ +------+-------+
| TWindow | | TDeskTop | | TProgram |
+----+----+ +----------+ +------+-------+
+====+====+ +------+-------+
| TDialog | | TApplication |
+=========+ +--------------+
TDialog - это потомок TWindow со следующими свойствами:
- GrowMode - 0, т.е. диалоговые окна не увеличиваются.
- Флаги wfMove и wfClose установлены, т.е. диалоговые окна
можно перемещать и закрывать (предоставлена закрывающая
кнопка).
- Обработчик событий TDialog вызывает TWindow.HandleEvent
и дополнительно обрабатывает отклики на клавиши Esc и
Enter. Клавиша Esc генерирует команду cmCancel, а Enter
генерирует команду cmDefault.
- TDialog.Valid возвращает True на команду cmCancel, иначе
вызывает TGroup.Valid.
Методы
Init constructor Init(var Bounds: TRect; ATitle: TTitleStr);
Создает диалоговое окно с заданным размером и заголовком,
вызывая TWindow.Init(Bounds, ATitle, wnNoNumber). GrowMode
устанавливается в 0 и Flags устанавливается в wfMove +
wfClose. Это означает, что по умолчанию диалоговые окна
можно перемещать и закрывать, но нельзя изменять их
размеры.
Заметим, что TDialog не определяет собственного
дестрактора, а использует Close и Done, наследуемые через
TWindow, TGroup и TView.
См. так же: TWindow.Init
HandleEvent procedure HandleEvent(var Event: TEvent); virtual;
Перекрывается: Иногда
Вызывает TWindow.HandleEvent(Event), затем обрабатывает
клавиши Enter и Esc. В частности Esc генерирует команду
cmCancel, а Enter посылает общие сообщения cmDeafult. Этот
метод так же обрабатывает cmOK, cmCancel, cmYes и cmNo,
заканчивая модальное состояние диалогового окна. Для
каждого из успешно обработанных событий он вызывает метод
ClearEvent.
См. так же: TWindow.HandleEvent
GetPalette function GetPalette: PPalette; virtual;
Перекрывается: Редко
Этот метод возвращает указатель на палитру по умолчанию
CPalette.
Valid function Valid(Command: Word): Boolean; virtual;
Перекрывается: Редко
Возвращает True, если заданная команда - cmCancel, или
если все элементы управления группы возвращают True.
См. так же: TGroup.Valid
Палитра
Объекты диалогового окна используют палитру по умолчанию
CDialog для отображения с 32 по 63 элемент в палитру
программы.
1 2 3 4 5 6 7 8 9
+===+===+===+===+===+===+===+===+===+
CDialog | 32| 33| 34| 35| 36| 37| 38| 39| 40|
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
Пассивная --+ | | | | | | | +- Короткая метка
рамка | | | | | | |
Активная ------+ | | | | | +----- Подсвеченная
рамка | | | | | метка
Кнопка ------------+ | | | +--------- Нормальная метка
рамки | | |
Страница ------------+ | +------------- Статический текст
скроллинга |
Элементы управления -----------+
скроллинга
10 11 12 13 14 15 16 17 18
+===+===+===+===+===+===+===+===+===+
CDialog | 41| 42| 43| 44| 45| 46| 47| 48| 49|
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
Нормальная -+ | | | | | | | +- Короткий кластер
кнопка | | | | | | |
Кнопка по ----+ | | | | | +----- Выбранный кластер
умолчанию | | | | |
Выбранная -------+ | | | +--------- Нормальный
кнопка | | | кластер
Запрещенная -----------+ | +------------- Тень кнопки
кнопка |
Короткая кнопка ---------------+
19 20 21 22 23 24 25
+===+===+===+===+===+===+===+
CDialog | 50| 51| 52| 53| 54| 55| 56|
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
Нормальная --+ | | | | | +-- Элементы управления
строка ввода | | | | | окна истории
Выбранная -------+ | | | |
строка ввода | | | |
Стрелки -------------+ | | +------ Страница окна истории
строки ввода | |
Стрелка истории ------------+ |
+---------- Стороны истории
26 27 28 29 30 31 32
+===+===+===+===+===+===+===+
CDialog | 57| 58| 58| 59| 60| 61| 62|
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
Нормальный просмотр+ | | | | | +-- Зарезервировано
списка | | | | |
Активный просмотр ----+ | | | +------ Зарезервировано
списка | | |
Выбранный просмотр -------+ | +--------- Информационная панель
|
Разделитель просмотра ---------+
См. так же: Метод GetPalette для каждого типа объекта.
DosStream Objects
+------------+
| TObject |
+-----+------+
+-----+------+
| TStream |
+-----+------+
+=====+======+
| TDosStream |
+=====+======+
+-----+------+
| TBufStream |
+------------+
TDosStream - это специализированный TStream, реализующий
небуферизованный поток файла DOS. Констрактор позволяет
Вам создать или открыть файл DOS, задав его имя и режим
доступа: stCreate, stOpenRead, stOpenWrite или stOpen.
Добавляется поле Handle - обработчик традиционного файла
DOS, используемый для доступа к открытому файлу.
Большинство программ будут использовать буферизованный
поток TBufStream, порожденный от TDosStream. TDosStream
перекрывает все абстрактные методы TStream, за исключением
TStream.Flush.
Поля
Handle: Word; Только чтение
Handle - это обработчик файла DOS используемый только для
доступа к открытому файлу потока.
Методы
Init constructor Init(FileName: FNameStr; Mode: Word);
Создает поток файла DOS с именем FileName и заданным
режимом доступа. Если успешно, поле Handle устанавливается
в обработчик файла DOS. Ошибка указывается вызовом Error с
аргументом stInitError.
Аргумент Mode должен принимать одно из значений: stCreate,
stOpenRead, stOpenWrite или stOpen. Эти константы
объяснены в "Константы потока stXXXX" главы 14.
Done destructor Done; virtual; Перекрывается: Никогда
Закрывает и освобождает поток файла DOS
См. так же: TDosStream.Init
GetPos function GetPos: Longint; virtual; Перекрывается: Никогда
Возвращает значение текущей позиции в потоке.
См. так же: TDosStream.Seek
GetSize function GetSize: Longint; virtual; Перекрывается: Никогда
Возвращает размер потока в байтах.
Read procedure Read(var Buf; Count: Word); virtual;
Перекрывается: Никогда
Читает Count байт в буфер Buf, начиная с текущей позиции
потока.
См. так же: TDosStream.Write, stReadError
Seek procedure Seek(Pos: Longint); virtual;
Перекрывается: Никогда
Устанавливает текущую позицию в Pos байт от начала потока.
См. так же: TDosStream.GetPos, TDosStream.GetSize
Truncate procedure Truncate; virtual; Перекрывается: Никогда
Удаляет все данные текущего потока от текущей позиции до
конца потока.
См. так же: TDosStream.GetPos, TDosStream.Seek
Write procedure Write(var Buf; Count: Word); virtual;
Пишет Count байт из буфера Buf в поток, начиная с текущей
позиции.
См. так же: TDosStream.Read, stWriteError
TEmsStream Objects
+------------+
| TObject |
+-----+------+
+-----+------+
| TStream |
+-----+------+
+=====+======+
| TEmsStream |
+============+
TEmsStream - это специализированный поток, реализующий
поток в Ems памяти, порожденный от TStream. Дополнительные
поля представляют обработчик EMS, число страниц, размер
потока и текущую позицию. TStreamEms перекрывает 6
абстрактных методов TStream, а так же предоставляет
специальный констрактор и дестрактор.
Примечание: При отладке программы, использующей EMS
потоки, IDE не может восстановить EMS память,
распределенную Вашей программой, если Ваша программа
преждевременно завершилась, или Вы забыли вызвать
дестрактор Done для EMS потока. Только метод Done (или
перезагрузка) могут освободить EMS страницы,
принадлежавшие потоку.
Поля
Handle Handle: Word; Только чтение
Обработчик EMS для потока.
PageCount PageCount: Word; Только чтение
Число распределенных для потока страниц, по 16К на
страницу.
Size Size: Longint; Только чтение
Размер потока в байтах.
Position Position: Longint; Только чтение
Текущая позиция внутри потока. Первая позиция - 0.
Методы
Init constructor Init(MinSize: Longint);
Создает EMS поток с заданным минимальным размером в
байтах. Вызывает TStream.Init, затем устанавливает Handle,
Size и PageCount. Вызывает Error с аргументом stInitError,
если инициализиция неудачна.
См. так же: TEmsStream.Done
Done destructor Done; virtual; Перекрывается: Никогда
Освобождает EMS поток и используемые EMS страницы.
См. так же: TEmsStream.Init
GetPos function GetPos: Longint; virtual; Перекрывается: Никогда
Возвращает значение текущей позиции в потоке.
См. так же: TEmsStream.Seek
GetSize function GetSize: Longint; virtual; Перекрывается: Никогда
Возвращает общий размер потока.
Read procedure Read(var Buf; Count: Word); virtual;
Перекрывается: Никогда
Читает Count байт из буфера Buf, начиная с текущей позиции
в потоке.
См. так же: TEmsStream.Write, stReadError
Seek procedure Seek(Pos: Longint); virtual;
Перекрывается: Никогда
Устанавливает текущую позицию в Pos байт от начала потока.
См. так же: TEmsStream.GetPos, TEmsStream.GetSize
Truncate procedure Truncate; virtual; Перекрывается: Никогда
Удаляет все данные в потоке, начиная с текущей позиции до
конца потока. Текущая позиция устанавливается в новый
конец потока.
См. так же: TDosStream.GetPos, TDosStream.Seek
Write procedure Write(var Buf; Count: Word); virtual;
Перекрывается: Никогда
Записывает Count байт из буфера Buf в поток, начиная с
текущей позиции.
См. так же: TDosStream.Read, TEmsStream.GetPos,
TEmsStream.Seek
TFrame Views
+---------+
| TObject |
+----+----+
+----+----+
| TView |
+----+----+
+====+====+
| TFrame |
+=========+
TFrame предоставляет различные рамки вокруг окон и
диалоговых окон. Вероятно пользователи никогда не будут
использовать объекты рамок напрямую, т.к. они добавляются
к окнам по умолчанию.
Методы
Init constructor Init(var Bounds: TRect);
Вызывает TView.Init, затем устанавливает GrowMode в
gfGrowHiX + gfGrowHiY и устанавливает EventMask в
EventMask or evBroadcast, так, чтобы объекты TFrame
обрабатывали по умолчанию общие события.
См. так же: TView.Init
Draw procedure Draw; virtual; Перекрывается: Редко
Рисует рамку с цветом атрибутов и кнопками,
соответствующими текущим флагам State: активный,
неактивный и перемещаемый. Добавляет кнопки изменения
размера, закрытия и масштабирования в зависимости от Flags
окна - владельца. Добавляет заголовок, если есть, из поля
Title окна-владельца. Активные окна рисуются с двойной
рамкой и кнопками, а неактивные окна с одинарной рамкой и
без кнопок.
См. так же: константы флагов состояния sfXXXX,
константы флагов окна wfXХXX
GetPalette function GetPalette: Palette; virtual;
Перекрывается: Редко
Возвращает указатель на палитру рамки по умолчанию CFrame.
HandleEvent procedure HandleEvent(var Event: TEvent); virtual;
Перекрывается: Редко
Вызывает TView.HandleEvent, затем обрабатывает события от
мышки. Если закрывающая кнопка отмечена мышкой, TFrame
генерирует события cmClose. Отметка кнопки масштабирования
или двойная отметка верхней линии рамки генерирует событие
cmZoom. При перемещении мышкой за верхнюю строку рамки
окно перемещается, а перемещение за кнопку изменения
размера передвигает нижний правый угол элемента и
соответственно изменяет его размер.
См. так же: TView.HandleEvent
SetState procedure SetState(AState: Word; Enable: Boolean);
virtual; Перекрывается: Редко
Вызывает TView.SetState, затем, если новое состояние -
sfActive или sfDragging, вызывает DrawView для перерисовки
видимого элемента.
См. так же: TView.SetState
Палитра
Объекты рамок используют палитру по умолчанию CFrame для
отображения первых трех элементов в палитру стандартного
окна.
1 2 3 4 5
+===+===+===+===+===+
CFrame | 57| 58| 58| 61| 62|
+=+=+=+=+=+=+=+=+=+=+
Пассивная ------+ | | | +-- Кнопки
рамка | | |
Пассивный ----------+ | +------ Активный заголовок
заголовок |
Активная ---------------+
рамка
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
Назад | Содержание | Вперед