Коллекции и управление памятью.
TCollection может динамически расти от первоначального размера, установленного в Init до максимального размера 16,380 элементов. Максимальный размер коллекции хранится в переменной MaxCollectionSize Turbo Vision. Каждый элемент, который Вы добавляете в коллекцию, требует только 4 байта памяти, поскольку элемент хранится как указатель. Библиотека динамических структур данных не будет полной, если ее не обеспечить средством обнаружения ошибок. Если для инициализиции коллекции недостаточно памяти, возвращается указатель nil. Если при добавлении элемента в TCollection недостаточно памяти, вызывается метод TCollection.Error и генерируется ошибка времени выполнения в куче. Вы можете перекрыть TCollection.Error, чтобы самому выдавать сообщение об ошибке или реализовать механизм восстановления. Вы должны обратить особое внимание на обработку ошибок кучи, поскольку пользователь имеет в программе Turbo Vision гораздо больше возможностей, чем в традиционной программе на Паскале. Если пользователь управляет добавлением объектов в коллекцию (например открывая новые окна на панели экрана), не всегда будет просто предупредить ошибку кучи. Вам может понадобиться предпринять ряд шагов для защиты пользователя от фатальной ошибки времени выполнения либо используя собственные проверки памяти при работе с коллекцией, либо обработчик ошибок времени выполнения.
Коллекции не объектов.
Вы можете так же добавить в коллекцию данные, не являющиеся объектами, но это приведет к другой серьезной проблеме. Коллекции ожидают получить нетипированные указатели на что-либо. Но некоторые методы TCollection предназначены для обработки коллекций экземпляров, порожденных от TObject. Они включают в себя методы доступа к потоку PutItem и GetItem, а так же стандартную процедуру FreeItem. Это означает, что Вы можете сохранить PString в коллекции, но если Вы попытаетесь передать эту коллекцию в поток, Вы получите неудовлетворительные результаты, если не перекроете стандартные методы GetItem и PutItem. Аналогично, когда Вы пытаетесь освободить коллекцию, она освобождает каждый элемент, используя FreeItem. Если Вы хотите использовать в коллекции элементы не типа TObject, Вам необходимо переопределить смысл "элемента" в GetItem, PutItem и FreeItem. В TStringCollection, например, делается именно это. Если Вы работаете с осторожностью, Вы найдете коллекции (и объекты, порожденные от коллекций) быстрыми, гибкими и настраиваемыми структурами данных.
Коллекции ресурсов.
TResourceCollection реализует коллекцию отсортированных индексов ресурсов, используя файлы ресурсов. Методы FreeItem, GetItem, KeyOf, PutItem типа TStringCollection перекрываются для обработки ресурсов.
Коллекции строк.
Многим программам необходимо хранить отсортированные строки. Для этого Turbo Vision предоставляет специальную коллекцию TStringCollection. Заметим, что элементы TStringCollection - не объекты, это указатели на строки Turbo Pascal. Поскольку коллекция строк наследуется от TSortedCollection, дублированные строки не сохраняются. Использовать коллекции строк просто. Просто объявите переменную указателя на коллекцию строк. Распределение коллекции, задание начального размера и приращение при расширении коллекции определены:
{ TVGUIDE19.PAS } var WordList: PCollection; WordRead: String; . begin WordList := New(PStringCollection, Init(10, 5)); .
WordList первоначально хранит 10 строк, а затем увеличивается с приращением 5. Все, что Вы делаете - это вставляете строки в коллекцию. В этом примере слова читаются из текстового файла и вставляются в коллекцию:
repeat . if WordRead <> '' then WordList^.Insert(NewStr(WordRead)); . until WordRead = ''; . Dispose(WordList, Done);
Заметим, что функция NewStr используется для создания копии слова, которое было прочитано, и адрес копии строки передается в коллекцию. Когда используется коллекция, Вы всегда передаете ей управление над собираемыми данными. Она будет тщательно освобождать данные, когда Вы закончите работу. Это будет соответствовать вызову Dispose; он освобождает каждый элемент коллекции, а затем освобождает саму коллекцию WordList.
Коллекции в потоках: полный пример.
В главе 7 "Коллекции" Вы видели как можно сохранять в коллекциях различные, но связанные объекты. К потокам так же применимы полиморфные свойства и они могут использоваться для сохранения целой коллекции на диске для восстановления в другое время или даже другой программы. Посмотрим еще раз TVGUID20.PAS. Что нужно сделать, чтобы эта программа вывела коллекцию в поток? Ответ удивительно прост. Во-первых, начнем с базового объекта TGraphObject и "научим" его как сохранять его данные (X и Y) в потоке. Это делает метод Store. Затем определим новый метод Store для каждого наследника TGraphObject, который добавляет новые поля (TGraphCircle добавляет Radius; TGraphRect добавляет Width и Height). Затем создадим регистрационную запись для каждого типа объекта, который будет сохраняться и зарегистрируем каждый из этих типов. Это все. Все остальное как при обычном вводе/выводе: объявите переменную потока; создайте новый поток; поместите всю коллекцию в поток одним оператором; закройте поток.
Коллекция строк.
TStringCollection - это простое расширение TSortedCollection для обработки отсортированной коллекции строк Turbo Pascal. Метод FreeItem удаляет данную строку из коллекции. Для записи и чтения коллекции строк из потока предоставлены виртуальные методы PutItem и GetItem.
Команды.
Большинство позиционированных и активных событий транслируются обрабатывающими их объектами в команды. Т.е. объект часто откликается на отметку мышкой или клавишу генерацией события команды. Например, отметив в строке статуса программы на Turbo Vision Вы генерируете позиционное (от мышки) событие. Программа определяет что отметка была позиционирована в области управляемой строкой статуса и передает событие в объект строки статуса StatusLine. StatusLine определяет какой из элементов управления статуса отмечен и читает запись элемента статуса для этого элемента. Этот элемент обычно имеет связанную с ним команду и StatusLine создает запись статуса с полем What, установленным в evCommand и с полем Command, установленным в команду, которая была связана с этим элементом статуса. Затем она очищает событие от мышки, что означает что следующее событие обнаруженное GetEvent будет только что сгенерированное событие команды.
Константа MaxViewWidth Views
================================================================= Объявление MaxViewWidth = 132;
Функция Устанавливает максимальную длину видимого элемента.
См. также поле TView.Size.
Константа mbXXXX Drivers
================================================================= Функция Эти константы могут быть использованы при проверке поля TEvent.Buttons записи события evMouse.
if (Event.What = evMouseDown) and (Event.Button = mbLeftButton) then LeftButtonDown;
Значения Определены следующие константы:
Таблица 14.22. Константы кнопки мышки.
--------------------------------------------------------------- Костанта Значение Назначение --------------------------------------------------------------- mbLeftButton $01 Установлено, если была нажата левая кнопка mbRightButton $02 Установлено, если была нажата правая кнопка ---------------------------------------------------------------
См. также GetMouseEvent.
Константa wnNoNumber Views
================================================================= Объявление wnNoNumber = 0;
Функция Если поле TWindow.Number содержит эту константу, это указывает, что окно не может иметь номера и не может быть выбрано через Alt-номер. Если поле Number между 1 и 9, номер окна отображается и выбор по Alt-номер доступен.
См. также TWindow.Number
Константы.
Режимы доступа к потоку.
------------------------------------------------------------- Константа Значение Назначение ------------------------------------------------------------- stCreate $3C00 Создает новый файл stOpenRead $3D00 Доступ только для чтения stOpenWrite $3D01 Доступ только для записи StOpen $3D02 Доступ для чтения и записи -------------------------------------------------------------
Коды ошибок потока.
------------------------------------------------------------- Код ошибки Значение Назначение ------------------------------------------------------------- stOk 0 Нет ошибки stError -1 Ошибка доступа stInitError -2 Не может инициализировать поток stReadError -3 Чтение за концом потока stWriteError -4 Не может расширить поток stGetError -5 Чтение незарегистрированного типа объекта stPutError -6 Запись незарегистрированного типа объекта -------------------------------------------------------------
Максимальный размер коллекции.
------------------------------------------------------------- Константа Значение Назначение ------------------------------------------------------------- MaxCollectionSize 16380 Максимальный размер TCollection -------------------------------------------------------------
Коды ошибок коллекции.
------------------------------------------------------------- Код ошибки Значение Назначение ------------------------------------------------------------- coIndexError -1 Индекс вне диапазона coOverflow -2 Переполнение -------------------------------------------------------------
Маски State для TView.
------------------------------------------------------------- Константа Значение Назначение ------------------------------------------------------------- sfVisible $0001 Видимый элемент виден sfCursorVis $0002 Видимый элемент имеет видимый курсор sfCursorIns $0004 Курсор видимого элемента - блок для режима вставки sfShadow $0008 Видимый элемент имеет тень sfActive $0010 Видимый элемент или его владелец - активное окно sfSelected $0020 Видимый элемент - владелец выбранного видимого элемента sfFocused $0040 Видимый элемент активен sfDragging $0080 Видимый элемент - перемещаемый sfDisabled $0100 Видимый элемент запрещен sfModal $0200 Видимый элемент в модальном состоянии sfExposed $0800 Видимый элемент присоединен к программе -------------------------------------------------------------
Константы модуля Views.
------------------------------------------------------------- Константа Значение Назначение ------------------------------------------------------------- heNoContext 0 Неопределенный код контекста подсказки heDragging 1 Контекстная подсказка пока объект перемещается MaxViewWidth 132 Максимальная длина видимого элемента в символах wnNoNumber 0 Номер TWindow -------------------------------------------------------------
Маски Option для TView.
------------------------------------------------------------- Константа Значение Назначение ------------------------------------------------------------- ofSelectable $0001 Видимый элемент может быть выбран ofTopSelect $0002 Выбираемый видимый элемент перемещается на вершину владельца ofFirstClick $0004 Отметка мышкой выбирает и производит действие ofFramed $0008 Видимый элемент имеет видимую рамку ofPreProcess $0010 Видимый элемент встретил активные события раньше активного видимого элемента ofPostProcess $0020 Видимый элемент встретил активные события позже активного видимого элемента ofBuffered $0040 Группа может иметь кэш буфер ofTileable $0080 Видимый элемент может располагаться черепицей на панели экрана ofCenterX $0100 Центр видимого элемента расположен горизонтально внутри владельца ofCenterY $0200 Центр видимого элемента расположен вертикально внутри владельца ofCentered $0300 Центр видимого элемента расположен горизонтально и вертикально внутри владельца -------------------------------------------------------------
Маски GrowMode для TView.
------------------------------------------------------------- Константа Значение Назначение ------------------------------------------------------------- gfGrowLoX $ 01 Левая сторона сответствует правой стороне владельца gfGrowLoY $02 Верх сответствует низу владельца gfGrowHiX $04 Правая сторона сответствует правой стороне владельца gfGrowHiY $08 Низ сответствует низу владельца gfGrowAll $0F Видимый элемент следует нижнему правому углу владельца gfGrowRel $10 Сохраняет относительный размер, когда изменяется размер экрана -------------------------------------------------------------
Маски DragMode для TView.
------------------------------------------------------------- Константа Значение Назначение ------------------------------------------------------------- dmDragMove $01 Видимый элемент может перемещаться dmDragGrow $02 Видимый элемент может изменять размер dmLimitLoX $10 Левая сторона видимого элемента не может выходить за Limits dmLimitLoY $20 Верх видимого элемента не может выходить за Limits dmLimitHiX $40 Правая сторона видимого элемента не может выходить за Limits dmLimitHiY $80 Низ видимого элемента не может выходить за Limits dmLimitAll $F0 Ни одна часть видимого элемента не может выходить за Limits -------------------------------------------------------------
Коды полосы скроллинга.
------------------------------------------------------------- Константа Значение Назначение ------------------------------------------------------------- sbLeftArrow 0 Левая горизонтальная стрелка полосы sbRightArrow 1 Правая горизонтальная стрелка полосы sbPageLeft 2 Левая горизонтальная страничная область полосы sbPageRight 3 Правая горизонтальная страничная область полосы sbUpArrow 4 Вертикальная стрелка вверх полосы sbDownArrow 5 Вертикальная стрелка вниз полосы sbPageUp 6 Вертикальное направление вверх страничной области полосы sbPageDown 7 Вертикальное направление вверх страничной области полосы sbIndicator 8 Индикатор полосы скроллинга -------------------------------------------------------------
Маски флага окна.
------------------------------------------------------------- Константа Значение Назначение ------------------------------------------------------------- wfMove $ 01 Верхняя строка рамки может перемещать окно wfGrow $02 Рамка окна имеет угол изменения размера wfClose $04 Рамка окна имеет закрывающую кнопку wfZoom $08 Рамка окна имеет кнопку масштабирования -------------------------------------------------------------
Элементы палитры TWindow.
------------------------------------------------------------- Константа Значение Назначение ------------------------------------------------------------- wpBlueWindow 0 Текст в окне желтый на синем wpCyanWindow 1 Текст в окне синий на бирюзовом wpGrayWindow 2 Текст в окне черный на сером -------------------------------------------------------------
Стандартные команды видимого элемента.
------------------------------------------------------------- Константа Значение Назначение ------------------------------------------------------------- cmReceivedFocus 50 Видимый элемент получает активность cmReleasedFocus 51 Видимый элемент освобождает активность cmCommandSetChanged 52 Множество команд изменилось cmScrollBarChanged 53 Полоса скроллинга изменила значение cmScrollBarClicked 54 Полоса скроллинга была отмечена cmSelectWindowNum 55 Пользователь хочет выбирает окно по номеру cmRecordHistory 56 Список истории может сохранять содержимое строки ввода -------------------------------------------------------------
Переменные.
------------------------------------------------------------- Переменная Тип Начальное Назначение значение ------------------------------------------------------------- MinMinSize TPoint (X: 16; Y: 6) Минимальный размер окна ShadowSize TPoint (X: 2; Y: 1) Размер тени окна ShadowAttr Byte $08 Атрибут окна -------------------------------------------------------------
Функции.
------------------------------------------------------------- Функция Операция ------------------------------------------------------------- Message Пересылает сообщения, определенные пользователем между видимыми элементами -------------------------------------------------------------
Константы apXXXX App
================================================================= Значения Определены следующие константы палитры:
Таблица 14.1. Константы палитры.
------------------------------------------------------------ Константа Значение Назначение ------------------------------------------------------------ apColor 0 Палитра для цветного монитора apBlackWhite 1 Палитра для LCD монитора apMonochrome 2 Палитра для монохромного монитора ------------------------------------------------------------
Функция Константы, начинающиеся с ap, используются для указания, с какой из 3 стандартных палитр будет работать программа на Turbo Vision. Три палитры используются для цветного, черно-белого и монохромного дисплеев.
Константы bfXXXX Dialogs
================================================================= Значения Определены слудующие флаги кнопки:
Таблица 14.2.
------------------------------------------------------------ Константа Значение Назначение ------------------------------------------------------------ bfNormal $00 Нормальная кнопка bfDefault $01 Кнопка по умолчанию bfLeftJust @02 Метка кнопки выровнена влево ------------------------------------------------------------
Функция Комбинация этих значений передается в TButton.Init для определения вновь созданного стиля кнопки. bfNormal указывает на нормальную не умалчиваемую кнопку. bfDefault указывает что кнопка будет кнопкой по умолчанию. Обязанность программиста, обеспечить чтобы кнопка была единственной умалчиваемой кнопкой в TGroup. Значение bfLeftJust может быть добавлено к bfDefault или bfNormal и воздействует на позицию отображаемого текста внутри кнопки: если очищено, то метка центрируется; если установлено, то метка выравнивается влево.
См. также TButton.Flags, TButton.MakeDefault, TButton.Draw
Константы cmXXXX Views
================================================================= Функция Эти константы представляют предопределенные команды Turbo Vision. Они передаются в поле TEvent.Command событий evMessage(evCommand и evBroadcast) и заставляют методы HandleEvent стандартных объектов Turbo Vision выполнять различные задачи. Turbo Vision резервирует значения констант от 0 до 99 и от 256 до 999 для своих целей. Обработчики событий стандартных объектов Turbo Vision реагируют на эти предопределенные константы. Прграммисты могут определить свои собственные константы в диапазонах от 100 до 255 и от 1,000 до 65,535 без конфликтов с предопределенными командами.
Значения Следующие стандартные команды определены в Turbo Vision и используются стандартными объектами Turbo Vision:
Таблица 14.3. Коды стандартных команд.
------------------------------------------------------------------ Команда Значение Назначение ------------------------------------------------------------------ cmValid 0 Передается в TView.Valid для проверки вновь созданных образцов видимых элементов cmQuit 1 Заставляет TProgram.HandleEvent вызывать EndModal (cmQuit), завершая программу. Строка статуса или одно из меню обычно содержат элемент, который переводит kbAltX и cmQuit. cmError 2 Не обрабатывается никаким объектом. Может быть использована для представления нереализованных или неподдерживаемых команд. cmMenu 3 Заставляет TMenuView.HandleEvent вызывать ExecView для процесса выбора меню, в результате чего может быть сгенерирована новая команда с помощью PutEvent. cmClose 4 Обрабатывается TWindow.HandleEvent, если поле InfoPtr записи события установлено в nil или указывает на окно. Если окно модальное, то посредством PutEvent генерируется evCommand со значением из cmCancel. Если окно немодальное, то то вызывается метод Close при условии что окно поддерживает закрытие (смотри флаг wfClose). Отметка на закрывающей кнопке окна генерирует событие evCommand с Command из cmClose и InfoPtr, который указывает на окно. Строка статуса или одно из меню обычно содержит элемент, который переводит kbAltF3 в cmClose. cmZoom 5 Заставляет TWindow.HandleEvent вызывать TWindow.Zoom, если окно поддерживает масштабирование (смотри флаг wfZoom) и если поле InfoPtr записи события установлено в nil или указывает на окно. Отметка на кнопке масштабирования окна или двойная отметка на полосе заголовка окна генерирует событие evCommand с Command из cmZoom и InfoPtr, который указывает на окно. Строка статуса или одно из меню обычно содержит элемент, который переводит kbF5 в cmZoom. cmResize 6 Заставляет TWindow.HandleEvent вызывать TView.DragView, если окно поддерживает изменение размеров (смотри флаги wfMove и wfGrow). Строка статуса или одно из меню обычно содержит элемент, который переводит kbCtrlF5 в cmResize. cmNext 7 Заставляет TDeskTop.HandleEvent сдвигать последнее окно на панели экрана на передний план. Строка статуса или одно из меню обычно содержит элемент, который переводит kbF6 в cmNext.
cmPrev 8 Заставляет TDeskTop. HandleEvent сдвигать первое окно на панели экрана на самый задний план. Строка статуса или одно из меню обычно содержит элемент, который переводит kbShiftF6 в cmPrev. ------------------------------------------------------------------
Следующие стандартные команды используются для определения поведения по умолчанию объектов диалогового окна:
Таблица 14.4. Стандартные команды диалогового окна.
------------------------------------------------------------------ Команда Значение Назначение ------------------------------------------------------------------ cmOK 10 Была нажата кнопка OK cmCancel 11 Диалоговое окно было отменено кнопкой Cancel, закрывающей кнопкой или клавишей Enter cmYes 12 Была нажата кнопка Yes cmNo 13 Была нажата кнопка No cmDefault 14 Была нажата кнопка по умолчанию ------------------------------------------------------------------
События с командами cmOK, cmCancel, cmYes или cmNo завершают модальный диалог TDialog.HandleEvent и возвращают значение команды (вызывая EndModal). Модальный диалог обычно содержит по крайней мере один TButton с одним из этих значений команд. TDialog.HandleEvent будет генерировать команду-событие cmCancel в ответ на событие от клавиатуры kbEsc. Команда cmDefault заставляет TButton.HandleEvent для умалчиваемой кнопки (см. флаг bfDefault) симулировать нажатие кнопки. TDialog.HandleEvent будет генерировать событие команды cmDefault в ответ на событие клавиатуры kbEnter. Определены следующие стандартные команды для использования стандартными видимыми элементами:
Таблица 14.5. Стандартные команды видимых элементов.
------------------------------------------------------------------ Команда Значение Назначение ------------------------------------------------------------------ cmReceivedFocus 50 TView.SetState использует функцию Message cmReleasedFocus 51 для передачи события evBroadcast с одним из этих значений в свой TView.Owner, как только sfFocused изменяется. InfoPtr события указывает на сам видимый элемент. Это информирует любой равный видимый элемент, что видимый элемент получил или освободил активность и что они должны корректировать себя соответственно. Объект Tlabel, например, реагирует на эти команды, включая или выключая свою подсветку. cmCommandSetChanged 52 Метод TProgram.Idle генерирует событие evBroadcast как только он обнаружит изменение в текущем наборе команд (вызывая методы EnableCommands, DesableCommands или SetCommands для TView). Общее сообщение cmCommandSetChanged посылается в HandleEvent каждого видимого элемента иерархии (если только их TView.EventMask специфически не маскируют события evBroadcast). Если изменения в наборе команд затрагивают появление видимого элемента, он должен реагировать на cmCommandSetChanged своей перерисовкой. Объекты TBut ton, TMenuView и TStatusLine, например, реагируют на эту команду, перерисовывая себя. cmScrollBarChanged 53 TScrollBar использует функцию Message для cmScrollBarClicked 54 передачи события evBroadcast с одним из этих значений в свой TView.Owner, как только мышка отмечает на полосе скроллинга. InfoPtr события указывает на полосу скроллинга. Общие сообщения создаются любыми равными видимыми элементами, управляемыми полосой скроллинга, такими как объекты TScroller и TListViewer. cmSelectWindowNum 55 Заставляет TWiondow.HandleEvent вызывать TView.Select, если InfoInt записи события соответствует TWindow.Number. TProgram.HandleEvent реагирует на события от клавиатуры от Alt-1 до Alt-9 общим сообщением cmSelectWindowNum с InfoInt от 1 до 9. cmRecordHistory 60 Заставляет объект THistory "записывать" текущее содержимое объекта TInputLine. TButton посылает общее сообщение cmRecordHistory своему владельцу, когда он выбран, в результате, заставляя "записывать" все объекты THistory в диалоговом окне. ------------------------------------------------------------------
См. также TView.HandleEvent, TCommandSet
Константы coXXXX Objects
================================================================= Функция Константы coXXXX передаются как параметр Code в метод TColection.Error, когда TCollection обнаруживает ошибку во время операции.
Значения Следующие стандартные коды ошибок определены для всех коллекций Turbo Vision:
Таблица 14.6. Коды ошибок коллекции.
------------------------------------------------------------------ Код ошибки Значение Назначение ------------------------------------------------------------------ coIndexError -1 Индекс вышел за диапазон. Параметр Info передает в метод Error содержимое неверного индекса.
coOverflow -2 Переполнение коллекции. TCollection.SetLimit недостаточно для расширения коллекции. Параметр Info передает в метод Error запрашиваемый размер коллекции. ------------------------------------------------------------------
См. также TCollection
Константы dmXXXX Views
================================================================= Значения Биты DragMode определены так:
Рис. 14.1. Флаги режима Drag.
+--- DragMode --+ msb lsb +-+-+-+----------- dmLimitAll = $F0 +++++++++=+=+=+=+ +++++++++=+=+++++ | | | | | +--- dmDragMove = $01 | | | | +----- dmDragGrow = $02 | | | +----------- dmLimitLoX = $10 | | +------------- dmLimitLoY = $20 | +--------------- dmLimitHiX = $40 +----------------- dmLimitHiY = $80
Функция Эти константы используются для компоновки параметра Mode метода TView.DragView. Они указывают разрешены ли движение и/или изменение размера и как интерпретировать параметр Limits. Константы определены так:
Таблица 14.8. Константы режима Drag.
------------------------------------------------------------ Константа Назначение ------------------------------------------------------------ dmDragMove Позволяет видимому элементу перемещаться. dmDragGrow Позволяет видимому элементу изменять размер. dmLimitLoX Левая сторона видимого элемента не может выходить за Limits. dmLimitLoY Верхняя сторона видимого элемента не может выходить за Limits. dmLimitHiX Правая сторона видимого элемента не может выходить за Limits. dmLimitHiY Нижняя сторона видимого элемента не может выходить за Limits. dmLimitAll Никакая часть видимого элемента не может выходить за Limits. ------------------------------------------------------------
Константы evXXXX Drivers
================================================================= Функция Эти мнемоники обозначают типы событий для обработчиков событий Turbo Vision. Константы evXXXX используются в нескольких местах: в поле What записи события, в поле EventMask видимого элемента и в переменных PositionalEvents и FocusedEvents.
Значения Следующие значения флагов событий обозначают стандартные типы событий:
Таблица 14.9. Флаги стандартных событий.
------------------------------------------------------------ Константа Значение Назначение ------------------------------------------------------------ evMouseDown $0001 Кнопка мышки нажата evMouseUp $0002 Кнопка мышки отпущена evMouseMove $0004 Мышка изменила положение evMouseAuto $0008 Периодическое событие до тех пор, пока нажата кнопка мышки evKeyDown $0010 Клавиша нажата evCommand $0100 Событие-команда evBroadcast $0200 Событие-общее сообщение ------------------------------------------------------------
Следующие константы могут использоваться для маскирования типов событий:
Таблица 14.10. Маски стандартных событий.
------------------------------------------------------------ Константа Значение Назначение ------------------------------------------------------------ evNothing $0000 Событие уже обработано evMouse $000F Событие от мышки evKeyboard $0010 Событие от клавиатуры evMessage $FF00 Событие-сообщение (команда, общее сообщение или определено пользователем). ------------------------------------------------------------
Биты маски события определены так:
Рис. 14.2. Отображение битов маски события.
+------ Флаги события ---------+ msb lsb +-+-+-+-+-+-+-+------------------- evMessage = $FF00 | | | | | | | | +----------- evKeyboard = $0010 | | | | | | | | | +-+-+-+--- evMouse = $000F +++++++++++++++++=+=+=+++++++++++ +=+=+=+=+=+=+++++=+=+=+++++++++++ | | | | | | +--- evMouseDown = $0001 | | | | | +----- evMouseUp = $0002 | | | | +------- evMouseMove = $0004 | | | +--------- evMouseAuto = $0008 | | +----------- evKeyDown = $0010 | +------------------- evCommand = $0100 +--------------------- evBroadcast = $0200
Маски стандартных событий могут быть использованы для быстрого определения, принадлежит ли событие конкретному семейству событий. Например,
if Event.What and evMouse <> 0 then DoMouseEvent;
См. также TEvent, TView.EventMask, GetKeyEvent, GetMouseEvent, методы HandleEvent, PositionalEvents, FocusedEvents.
Константы gfXXXX Views
================================================================= Функция Эти мнемоники используются для установки полей GrowMode во всех объектах TView и порожденных. Биты, установленные в GrowMode, определяют, как видимый элемент будет изменяться в зависимости от изменений размера его владельца.
Значения Биты GrowMode определены как:
Рис. 14.3. Биты режима Grow.
+--- GrowMode --+ msb lsb +-+-+-+--- gfGrowAll = $0F +=+=+=+=+++++++++ +++=+++++++++++++ +-+-+ | | | | +--- gfGrowLoX = $01 | | | | +----- gfGrowLoY = $02 Неопределены | | +------- gfGrowHiX = $04 | +--------- gfGrowHiY = $08 +----------- gfGrowRel = $10
Таблица 14.12. Определения флага режима Grow.
------------------------------------------------------------------ Константа Назначение ------------------------------------------------------------------ gfGrowLoX Если установлен, то левая сторона видимого элемента будет находиться на одном расстоянии от правой стороны владельца. gfGrowLoY Если установлен, то верхняя сторона видимого элемента будет находиться на одном расстоянии от нижней стороны владельца. gfGrowHiX Если установлен, то правая сторона видимого элемента будет находиться на одном расстоянии от правой стороны владельца. gfGrowHiY Если установлен, то нижняя сторона видимого элемента будет находиться на одном расстоянии от нижней стороны владельца. gfGrowAll Если установлен, то видимый элемент будет сдвигаться вместе с правым нижним углом его владельца. gfGrowRel Для использования с объектами TWindow, которые находятся в панели экрана: видимый элемент будет изменять размер относительно размера владельца. Окно будет обрабатываться соответственно размеру владельца, даже когда происходит переключение между режимами 25 и 43/50 строк. ------------------------------------------------------------------ Заметим, что LowX= левая сторона; LowY = верхняя сторона; HiX = правая сторона; HiY = нижняя сторона.
См. также TView.GrowMode
Константы hcXXXX Views
================================================================= Значения Определены следующие константы контекста подсказки:
Таблица 14.13. Константы контекста подсказки.
----------------------------------------- Константа Значение Назначение ----------------------------------------- hcNoContext 0 Контекст не задан hcDragging 1 Объект - перемещаем -----------------------------------------
Функция Значение TView.HelpCtx по умолчанию - hcNoContext, которое указывает, что для видимого элемента нет контекста подсказки. TView.GetHelpCtx возвращает hcDragging, как только видимый элемент становится перемещаемым (это указывается состоянием флага sfDragging). Turbo Vision резервирует для контекста подсказки значения от 0 до 999. Программисты могут определять свои константы в диапазоне от 1,000 до 65,535.
См. также TView.HelpCtx, TStatusLine.Update.
Константы kbXXXX Drivers
================================================================= Функция Два множества констант, начинающихся с "kb" связаны с клавиатурой.
Значения Следующие значения определяют состояние клавиатуры и могут быть использованы при проверке регистров Shift клавиатуры, которое запоминается в байте с абсолютным адресом $40:$17. Например,
var ShiftState: Byte absolute $40:$17; . if ShiftState and kbAltShift <> 0 then AltKeyDown;
Таблица 14.14. Состояние клавиатуры и маски Shift.
------------------------------------------------------------------ Константа Значение Назначение ------------------------------------------------------------------ kbRightShift $0001 Установлено, если правый Shift нажат kbLeftShift $0002 Установлено, если левый Shift нажат kbCtrlShift $0004 Установлено, если Ctrl нажат kbAltShift $0008 Установлено, если Alt нажат kbScrollState $0010 Установлено, если клавиатура в состоянии ScrollLock kbNumState $0020 Установлено, если клавиатура в состоянии NumLock kbCapsState $0040 Установлено, если клавиатура в состоянии CapsLock kbInsState $0080 Установлено, если клавиатура в состоянии InsLock ------------------------------------------------------------------
Таблица 14.15. Коды Alt-буква.
----------------------------------------------------------- Константа Значение Константа Значение ----------------------------------------------------------- kbAltA $1E00 kbAltN $3100 kbAltB $3000 kbAltO $1800 kbAltC $2E00 kbAltP $1900 kbAltD $2000 kbAltQ $1000 kbAltE $1200 kbAltR $1300 kbAltF $2100 kbAltS $1F00 kbAltG $2200 kbAltT $1400 kbAltH $2300 kbAltU $1600 kbAltI $1700 kbAltV $2F00 kbAltJ $2400 kbAltW $1100 kbAltK $2500 kbAltX $2D00 kbAltL $2600 kbAltY $1500 kbAltM $3200 kbAltZ $2C00 -----------------------------------------------------------
Таблица 14.16. Коды специальных клавиш.
----------------------------------------------------------- Константа Значение Константа Значение ----------------------------------------------------------- kbAltEqual $8300 kbEnd $4F00 kbAltMinus $8200 kbEnter $1C0D kbAltSpace $0200 kbEsc $011B kbBack $0E08 kbGrayMinus $4A2D kbCtrlBack $0E7F kbHome $4700 kbCtrlDel $0600 kbIns $5200 kbCtrlEnd $7500 kbLeft $4B00 kbCtrlEnter $1C0A kbNoKey $0000 kbCtrlHome $7700 kbPgDn $5100 kbCtrlIns $0400 kbPgUp $4900 kbCtrlLeft $7300 kbrayPlus $4E2B kbCtrlPgDn $7600 kbRight $4D00 kbCtrlPgUp $8400 kbShiftDel $0700 kbCtrlPrtSc $7200 kbShiftIns $0500 kbCtrlRight $7400 kbShiftTab $0F00 kbDel $5300 kbTab $0F09 kbDown $5000 kbUp $4800 -----------------------------------------------------------
Таблица 14.17. Коды Alt-число.
----------------------------------------------------------- Константа Значение Константа Значение ----------------------------------------------------------- kbAlt1 $7800 kbAlt6 $7D00 kbAlt2 $7900 kbAlt7 $7E00 kbAlt3 $7A00 kbAlt8 $7F00 kbAlt4 $7B00 kbAlt9 $8000 kbAlt5 $7C00 kbAlt0 $8100 -----------------------------------------------------------
Таблица 14.18. Коды функциональных клавиш.
----------------------------------------------------------- Константа Значение Константа Значение ----------------------------------------------------------- kbF1 $3B00 kbF6 $4000 kbF2 $3C00 kbF7 $4100 kbF3 $3D00 kbF8 $4200 kbF4 $3E00 kbF9 $4300 kbF5 $3F00 kbF0 $4400 ----------------------------------------------------------
Таблица 14.19. Коды Shift-функциональная клавиша.
----------------------------------------------------------- Константа Значение Константа Значение ----------------------------------------------------------- kbShiftF1 $5400 kbShiftF6 $5900 kbShiftF2 $5500 kbShiftF7 $5A00 kbShiftF3 $5600 kbShiftF8 $5B00 kbShiftF4 $5700 kbShiftF9 $5C00 kbShiftF5 $5800 kbShiftF0 $5D00 -----------------------------------------------------------
Таблица 14.20. Коды Ctrl-функциональная клавиша.
----------------------------------------------------------- Константа Значение Константа Значение ----------------------------------------------------------- kbCtrlF1 $5E00 kbCtrlF6 $6300 kbCtrlF2 $5F00 kbCtrlF7 $6400 kbCtrlF3 $6000 kbCtrlF8 $6500 kbCtrlF4 $6100 kbCtrlF9 $6600 kbCtrlF5 $6200 kbCtrlF0 $6700 -----------------------------------------------------------
Таблица 14.21. Коды Alt-функциональная клавиша.
----------------------------------------------------------- Константа Значение Константа Значение ----------------------------------------------------------- kbAltF1 $6800 kbAltF6 $6D00 kbAltF2 $6900 kbAltF7 $6E00 kbAltF3 $6A00 kbAltF8 $6F00 kbAltF4 $6B00 kbAltF9 $7000 kbAltF5 $6C00 kbAltF0 $7100 -----------------------------------------------------------
См. также evKeyDown, GetKeyEvent.
Константы ofXXXX Views
================================================================= Функция Эти мнемоники используются для ссылок на битовые позиции поля TView.Options. Установка позиции бита в 1 указывает, что видимый элемент имеет отдельный атрибут; очистка битовой позиции означает, что атрибут отключен или запрещен. Например,
MyWindow.Options := ofTileable + ofSelectable;
Значения Определены следующие опции флагов:
Таблица 14.23. Опции флагов.
------------------------------------------------------------------- Константа Назначение ------------------------------------------------------------------- ofSelectable Установлен, если видимый элемент выбирает себя автоматически (см. sfSelectable), например, отметкой мышкой в видимом элементе или клавишей Tab в диалоговом окне. ofTopSelect Установлен, если видимый элемент помещается перед всеми другими равными видимыми элементами, когда он выбран. Когда бит ofTopSelect установлен, вызов TView.Select соответствует вызову TView.MakeFirst. Окна (TWindow и его потомки) по умолчанию имеют этот бит установленным, что заставляет их располагаться перед всеми другими окнами на панели экрана, когда они выбираются. См. также TView.Select, TGroup.MakeFirst. ofFirstClick Если очищен, отметка мышкой, которая выбирает видимый элемент, не имеет эффекта. Если установлен, такая отметка мышкой будет работать как обычный отметка мышкой после выбора видимого элемента. Не имеет эффекта, если ofSelectable не установлен. См. также TView.HandleEvent, sfSelect, ofSelectable. ofFramed Установлен, если видимый элемент имеет рамку. TWindow и его потомки имеют TFrame, как свой последний подэлемент. Когда видимый элемент рисует себя, TFrame рисует рамку вокруг любого другого подэлемента, у которого установлен бит ofFrame. См. также TFrame, TWindow. ofPreProcess Установлен, если видимый элемент получает активные события до того, как они были посланы активному элементу. В противном случае очищен. См. также sfFocused, ofPostProcess, TGroup.Phase. ofPostProcess Установлен, если видимый элемент получает активное событие в случае, когда активный элемент не может их обработать. В противном случае очищается. См. также sfFocused, ofPreProcess, TGroup.Phase. ofBuffered Используется только для объектов TGroup. Установлен, если кэш-буфер распределяет доступную память. Буфер группы содержит образ экрана для всей группы, таким образом увеличивая скорость перерисовки. При отсутствии буфера, TGroup.Grow вызывает методы каждого подэлемента DrawView. Если впоследствии New и GetMem не могут получить достаточно памяти, буфера группы будут освобождать память. См. также GetBufMem. ofTileable Установлен, если панель экрана может расположить этот видимый элемент черепицей (или каскадом). Обычно используется только с объектами TWindow. ofCenterX Установлен, если видимый элемент центрируется по оси Х своего владельца при вставке в группу с использованием TGroup.Insert. ofCenterY Установлен, если видимый элемент центрируется по оси Y своего владельца при вставке в группу с использованием TGroup.Insert. ofCentered Установлен, если видимый элемент центрируется по обоим осям своего владельца при вставке в группу с использованием TGroup.Insert. -------------------------------------------------------------------
Биты Options определены:
Рис. 14.4. Флаги битов Options.
+-------- TView.Options --------+ msb lsb +-+------------------- ofCentered = $0300 +=+=+=+=+=+=+++++=+=+=+=+=+=+=+=+ +++=+=+=+=+++++++++++++++++++++++ +----+----+ | | | | | | | | | +--- ofSelectable = $0001 | | | | | | | | | +----- ofTopSelect = $0002 Неопределены | | | | | | | +------- ofFirstClick = $0004 | | | | | | +--------- ofFramed = $0008 | | | | | +----------- ofPreProcess = $0010 | | | | +------------- ofPostProcess = $0020 | | | +--------------- ofBuffered = $0040 | | +----------------- ofTileable = $0080 | +------------------- ofCenterX = $0100 +--------------------- ofCenterY = $0200
См. также TView.Options.
Константы sbXXXX Views
================================================================= Функция Эти константы определяют различные области TScrollBar, в которых воспринимется отметка мышкой.
Функция TScrollBar.ScrollStep осуществляет преобразование этих констант в действительные значения шага скроллинга. Хотя она определена, константа sbIndicator никогда не передается в TScrollBar.ScrollStep.
Таблица 14.24. Константы полосы скроллинга.
----------------------------------------------------------- Константа Значение Назначение ----------------------------------------------------------- sbLeftArrow 0 Левая стрелка горизонтальной полосы скроллинга. sbRightArrow 1 Правая стрелка горизонтальной полосы скроллинга. sbPageLeft 2 Левая страничная область горизонтальной полосы скроллинга. sbPageRight 3 Правая страничная область горизонтальной полосы скроллинга. sbUpArrow 4 Стрелка вверх вертикальной полосы скроллинга. sbDownArrow 5 Стрелка вниз вертикальной полосы скроллинга. sbPageUp 6 Верхняя страничная область вертикальной полосы скроллинга. sbPageDown 7 Нижняя страничная область вертикальной полосы скроллинга. sbIndicator 8 Индикатор на полосе скроллинга. -----------------------------------------------------------
Рис. 14.5. Полоса скроллинга.
ч-- sbUpArrow # # ч-- sbPageUp # sbIndicator --------ц ю | # | # | # | # ч-- sbPageDown | # | # щ ч-- sbDownArrow ###############ю###################-+ ш ш ш ш | | | | | sbPageLeft sbPageRight | sbLeftArrow sbRightArrow
Следующие значения могут быть переданы в функцию TWindow.StandardScrollBar:
Таблица 14.25. Константы StandardScrollBar.
----------------------------------------------------------- Константа Значение Назначение ----------------------------------------------------------- sbHorizontal $0000 Полоса скроллинга горизонтальна. sbVertical $0001 Полоса скроллинга вертикальна. sbHandleKeyboard $0002 Полоса скроллинга реагирует на команды клавиатуры. -----------------------------------------------------------
См. также TScrollBar, TScrollBar.TScrollStep.
Константы sfXXXX Views
================================================================= Функция Эти константы используются для доступа к соответствующим битам полей TView.State. Поля TView.State никогда не должны изменяться напрямую; вместо этого Вы должны использовать метод TView.SetState.
Значения Определены следующие флаги состояния:
Таблица 14.26. Константы флагов состояния.
------------------------------------------------------------------- Константа Назначение ------------------------------------------------------------------- sfVisible Установлен, если видимый элемент виден в своем владельце. Видимые элементы по умолчанию sfVisible. Методы TView.Show и TView.Hide могут использоваться для модификации sfVisible. При sfVisible видимый элемент не обязательно видим на экране, поскольку его владелец может быть невидим. Для проверки видимости на экране, проверьте бит sfExposed или вызовите функцию TView.Exposed. sfCursorVis Установлен, если курсор видимого элемента видим, в противном случае очищен. По умолчанию очищен. Методы TView.ShowCursor и TView.HideCursor могут использоваться для модификации sfCursorVis. sfCursorIns Установлен, если курсор видимого элемента - сплошной блок, очищен, если курсор видимого элемента - линия. По умолчанию очищен. Методы TView.BlockCursor и TView.NormalCursor могут использоваться для модификации sfCursorIns. sfShadow Установлен, если видимый элемент имеет тень, в противном случае, очищен. sfActive Установлен, если видимый элемент это активное окно или подэлемент активного окна. sfSelected Установлен, если видимый элемент это текущий выбранный подэлемент внутри своего владельца. Каждый объект TGroup имеет поле Current, которое указывает на текущий выбранный подэлемент (или nil, если подэлементов не выбрано). Может быть только один выбранный подэлемент в TGroup. sfFocused Установлен, если видимый элемент сфокусированный. Видимый элемент - сфокусированный, если он выбран и все владельцы выше его также выбраны, т.е. если видимый элемент находится в цепи образованной указателями Current всех TGroup, начиная с TApplication (самый верхний видимый элемент в иерархии видимых элементов). Последний видимый элемент цепи это конечное назначение для всех сфокусированных событий. sfDragging Установлен, если видимый элемент можно растягивать, в противном случае, очищен. sfDisabled Установлен, если видимый элемент запрещен; очищен, если разрешен. sfModal Установлен, если видимый элемент - модальный. Всегда существует точно один элемент в выполняемой на Turbo Vision программе, обычно, объекты TAppplication или TDialog. Когда видимый элемент начинает выполняться (через вызов ExecView), этот видимый элемент становится модальным. Модальный видимый элемент представляет вершину (корень) активного дерева событий, получая события и управляя ими до тех пор пока не вызван его метод EndModal. Во время этого "локального" цикла событий события передаются нижним подэлементам в дереве видимых подэлементов. События от этих нижних видимых элементов передаются по дереву, но не далее модального видимого элемента. См. также sfSelected, sfFocused, TView.SetState, TView.HandleEvent, TGroup.ExecView. sfExposed Установлен, если у видимого элемента прямой или косвенный владелец - объект TApplication и следовательно он может быть виден на экране. Метод TView.Exposed использует этот флаг при отсечении (клиппинге), определяя какая часть видимого элемента действительно видна на экране. См. также TView.Exposed. -------------------------------------------------------------------
Значения Биты флага состояния определены так:
Рис. 14.6. Биты флага состояния.
+------ TView.State Flags ------+ msb lsb +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ +=+=+=+=+++=+++++++++++++++++++++ | | | | | | | | | | +--- sfVisible = $0001 | | | | | | | | | +----- sfCursorVis = $0002 | | | | | | | | +------- sfCursorIns = $0004 | | | | | | | +--------- sfShadow = $0008 | | | | | | +----------- sfActive = $0010 | | | | | +------------- sfSelected = $0020 | | | | +--------------- sfFocused = $0040 | | | +----------------- sfDragging = $0080 | | +------------------- sfDisabled = $0100 | +--------------------- sfModal = $0200 +------------------------- sfExposed = $0800
См. также TView.State.
Константы smXXXX Drivers
================================================================= Функция Эти мнемонические константы используются с SetVideoMode для установки соответствующего значения видеорежима в ScreenMode.
Значения В Turbo Vision определены следующие режимы экрана:
Таблица 14.27. Константы режимов экрана.
----------------------------------------------------------- Константа Значение Назначение ----------------------------------------------------------- smBW80 $0002 Черно-белый режим на цветном smCO80 $0003 Цветной режим smMono $0007 Монохромный режим smFont8x8 $0100 43- или 50-строчный режим -----------------------------------------------------------
См. также SetVideoMode, ScreenMode.
Константы stXXXX Objects
================================================================= Функция Существует два набора констант начинающихся с "st", которые используются потоками Turbo Vision.
Значения Следующие костанты режима используются в TDosStream и TBufStream для определения режима доступа к файлу при открытии файла в потоках Turbo Vision:
Таблица 14.28. Режимы доступа к потоку.
----------------------------------------------------------- Константа Значение Назначение ----------------------------------------------------------- stCreate $3C00 Создать новый файл stOpenRead $3D00 Открыть файл только на чтение stOpenWrite $3D01 Открыть файл только на запись stOpen $3D02 Открыть файл на чтение/запись -----------------------------------------------------------
Следующие значения возвращаются TStream.Error в поле TStream.ErrorInfo, когда возникает ошибка потока:
Таблица 14.29. Коды ошибок потока.
----------------------------------------------------------- Константа Значение Назначение ----------------------------------------------------------- stOk 0 Нет ошибки stError -1 Ошибка доступа stInitError -2 Нельзя инициализировать поток stReadError -3 Чтение за концом потока stWriteError -4 Нельзя расширить поток stGetError -5 Get для незарегистрированного типа объекта stPutError -6 Put для незарегистрированного типа объекта -----------------------------------------------------------
См. также TStream.
Константы wfXXXX Views
================================================================= Функция Эти мнемоники определяют биты в поле Flags объектов TWindow. Если биты установлены, окно будет иметь соответствующие атрибуты: окно может перемещаться, изменять размер, закрываться или масштабироваться.
Значения Флаги окна определены так:
+ TWindow.Flags + | | msb lsb +=+=+=+=+=+=+=+=+ +++=+=+++++++++++ +--+--+ | | | +- wfMove = $01 | | | +--- wfGrow = $02 Неопределены| +----- wfClose = $04 +------- wfZoom = $08
Таблица 14.34. Константы флагов окна.
------------------------------------------------------------------ Константа Значение Назначение ------------------------------------------------------------------ wfMove $01 Окно можно перемещать wfGrow $02 Можно изменять размеры окна соответствующей кнопкой в левом правом углу wfClose $04 Рамка окна имеет закрывающую кнопку wfZoom $08 Рамка окна имеет кнопку масштабирования ------------------------------------------------------------------
Если отдельный бит установлен, соответствующая возможность подключается, в противном случае, эта возможность запрещена.
См. также TWindows.Flags
Константы wpXXXX Views
================================================================= Функция Эти константы определяют три стандартных цвета, отражая их назначение. По умолчанию, объект TWindow имеет палитру wpBlueWindow. По умолчанию, объект TDialog имеет палитру wpGrayWindow.
Значения Три стандартных палитры окна определены:
Таблица 14.35. Стандартные палитры окна.
-------------------------------------------------------------- Константа Значение Назначение -------------------------------------------------------------- wpBlueWindow 0 Желтый на голубом wpCuanWindow 1 Синий на бирюзовом wpGrayWindow 2 Черный на сером --------------------------------------------------------------
См. также TWindow.Palette, TWindow.GetPalette
Контекстная помощь.
Turbo Vision имеет встроенный инструмент, который помогает Вам реализовать контекстно-ориентированную помощь в Вашей программе. Вы можете назначить номер контекстной подсказки видимому элементу и когда видимый элемент станет активным, номер его подсказки станет текущим номером контекстной подсказки в программе. Чтобы создать глобальную контекстно-ориентированную подсказку, Вы можете реализовать HelpView, который знает номера контекстных подсказок, определенных Вами. Когда вызывается HelpView (обычно нажатием F1 или другой горячей клавиши), он должен спросить своего владельца о текущем контексте подсказки, вызвав метод GetHelpCtx. Затем HelpView может читать и отображать соответствующий текст подсказки. Пример HelpView включен в дистрибутивные диски Turbo Pascal. Контекстно-ориентированная помощь - это, вероятно, одна из последних возможностей, которую Вы будете реализовывать в Вашей программе, поэтому объекты Turbo Vision инициализируются с контекстом hcNoContext по умолчанию, что означает предопределенный контекст, который не изменяет текущего контекста. При необходимости Вы можете разработать номера подсказок, затем вставить правильный номер в соответствующий видимый элемент, вызвав SetHelpCtx сразу после создания видимого элемента. Контекстная подсказка так же используется строкой статуса для определения, какие видимые элементы отображаются. Вспомним, что когда Вы создаете строку статуса, Вы вызываете NewStatusDef, который определяет набор элементов статуса для данного диапазона значений контекстной помощи. Когда новый видимый элемент становится активным, контекст помощи этого элемента определяет, какая строка статуса будет отображаться.
Координаты Turbo Vision.
Метод Turbo Vision, назначающий коодинаты, может отличаться от используемого Вами. Отличие заключается в том, что если большинство координатных систем устанавливает размер в символах на экране, координатная система Turbo Vision указывает расстояние между символами. Например, если R - объект типа TRect, R.Assign(0, 0, 0, 0) назначает прямоугольник без размера - только точка. Наименьший прямоугольник, который может содержать что-либо, создается R.Assign (0, 0, 1, 1). Рис. 4.1 показывает TRect, созданный R.Assign(2, 2, 5, 4).
Рис. 4.1. Координатная система Turbo Vision.
0 1 2 3 4 5 6 7 0+---+---+---+---+---+---+---+ | | | | | | | | 1+---+---+---+---+---+---+---| | | | | | | | | 2+---+---+---+---+---+---+---| | | | R | R | R | | | 3+---+---+---+---+---+---+---| | | | R | R | R | | | 4+---+---+---+---+---+---+---| | | | | | | | | 5+---+---+---+---+---+---+---+
Хотя эта координатная система несколько непривычна, она позволяет вычислять размер прямоугольника намного проще.
Копирование потоков.
TStream имеет метод CopyFrom(S, Count), который копирует Count байт из потока S. CopyFrom может использоваться для копирования всего содержимого потока в другой поток. Если Вы постоянно обращаетесь к дисковым потокам, Вы можете скопировать их в EMS поток для более быстрого доступа:
NewStream := New(TEmsStream, Init(OldStream^.GetSize)); OldStream^.Seek(0); NewStream^.CopyFrom(OldStream, OldStream^.GetSize);
Краткие клавиши и конфликты.
По умолчанию метки, зависимые и независимые кнопки, могут реагировать на короткие клавиши даже когда активен какой-либо другой элемент диалогового окна. Например, когда Ваше диалоговое окно открывается, активны независимые кнопки и курсор находится на первой независимой кнопке. Нажав M для "Melted" Вы немедленно делаете активной зависимую кнопку Melted и включаете ее. Желательно делать короткие клавиши как можно более мнемоническими, хотя доступны только 26 букв и 10 цифр. Это может привести к конфликтам. Например, в Вашем маленьком диалоговом окне имеет смысл установить С как короткий набор для "Cheeses", "Consistenсy" и может существовать "Cheddаr". Во-первых, хотя удобно устанавливать первую букву слова для короткого набора, это не всегда возможно. Вы можете разрешить этот конфликт между "Cheeses" и "Consistency" например сделав О как короткий набор для "Consistency", но это трудно запомнить. Другой способ - изменить метку. Вместо метки "Cheeses" Вы можете пометить это кластер "Kind of Cheese" с К для короткого набора. Это только один из способов избежания конфликтов между короткими клавишами на одном уровне. Однако существует другой подход, который Вы можете использовать для избежания конфликтов, скажем, между меткой и элементом кластера. Короткие клавиши можно сделать локальными внутри элемента диалогового окна. Например, в предыдущем примере, если Вы локализуете короткие клавиши внутри каждого кластера, нажатие М во время активизации независимых кнопок не будет активизировать кнопки "Consistency" или кнопку "Melted". М будет функционировать как короткая клавиша только если Вы с помощью мышки или клавиши Tab перейдете в кластер "Consistency". По умолчанию все короткие клавиши активны во всем диалоговом окне. Если Вы хотите локализовать короткие клавиши, измените поле Options объекта при вставке в диалоговое окно. (Поле Options и бит ofPostProcess объяснены в главе 4.) Например, если Вы хотите сделать короткие клавиши для независимых кнопок локальными, Вы можете добавить дополнительную строку до вставки в диалоговое окно:
R.Assign(3, 3, 18, 6); B := New(PCheckBoxes, Init(R, NewSItem('~H~varti', NewSItem('~T~ilset', NewSItem('~J~arlsberg', nil))) )); B^.Options := B^.Options and not ofPostProcess; Insert(B);
Сейчас короткие клавиши H, T и J действуют только если Вы перейдете в кластер "Cheeses". Однако Alt-H, Alt-T и Alt-J продолжают функционировать как и ранее. Запомните, что метка никогда не активируется. Однако метка должна иметь установленный бит ofPostProcess для того, чтобы работать по короткой клавише (см. главу 5). Установка ofPostProcess означает, что пользователь может быстро вводить информацию в диалоговое окно. Однако пользователь может нажать короткую клавишу, ожидая перейти в одно место, но из-за конфликта перейдет в другое. Аналогично, если пользователь ожидает, что короткие клавиши активны, а они активны только локально, это может привести к тому, что короткая клавиша ничего не делает, когда она нажата вне пределов активной области. Лучший совет, который мы можем дать Вам - активно тестируйте диалоговые окна на наличие конфликтов. Избегайте дублированных коротких клавиш где это возможно и всегда обеспечьте для пользователя ясность, какие опции доступны.
Кто обрабатывает общие сообщения?
Предположим, Вам требуется определить, находится ли на панели экрана открытое окно прежде, чем выполнить некоторые действия. Как это сделать? Ваш код должен послать общее событие, на которое окна знают как ответить. "Подпись", оставленная объектом, который обработал это событие, будет говорить Вам кто (если есть) обработал его.
Кто сохраняет?
Важное предупреждение о потоках: пользователь объекта - это тот объект, который должен записывать этот объект в поток. Это предупреждение подобно тому с которым Вы вероятно сталкивались при использовании традиционного Паскаля: владелец указателя - это тот, кто должен освободить этот указатель. В сложной реальной программе многочисленные объекты часто будут содержать указатель на какую-то структуру. Когда придет время для В/В в поток, Вы должны решить кто владелец структуры; только этот владелец должен посылать эту структуру в поток. Иначе Вы получите в потоке несколько копий одной структуры. Затем когда Вы будете читать поток будет создано несколько экземпляров структуры и каждый отдельный объект теперь будет указывать на собственную копию структуры вместо единственной первоначальной структуры.
Кто сверху?
Используя технику, описанную ранее, Вы так же можете например определить, какое окно является верхним из видимых элементов его типа на панели экрана. Поскольку общее сообщение посылается каждому подэлементу модального видимого элемента в Z-порядке (порядок обратный вставке), самый последний вставленный видимый элемент - это "верхний" видимый элемент на панели экрана. Рассмотрим ситуацию, возникающую в IDE, когда пользователь имеет окно просмотра, открытое на вершине панели экрана во время пошагового выполнения кода в окне редактора. Окно просмотра может быть активным окном (двойная рамка), но курсор выполнения в окне кода требует сохранения трассы выполнимого кода. Если на панели экрана открыто несколько окон редактора, они могут не перекрываться вообще, но IDE должен знать какое из окон редактора предназначено для трассировки. Ответ: конечно самое верхнее окно редактора, которое определено как последнее вставленное. Для того, чтобы определить, какое из окон "верхнее", IDE посылает общее сообщение, отклик на которое знают только окна редактора. Первое окно редактора, которое получает общее сообщение и будет последним вставленным; оно обработает событие, очищая его, и IDE узнает какое окно использовать для трассировки кода, читая результат, возвращенный Message.
Куда идут события.
События всегда начинают свой путь с текущего модального видимого элемента. Для нормальных операций это обычно означает объект "Ваша программа". Когда Вы выполняете модальное диалоговое окно, это диалоговое окно - модальный видимый элемент. В любом случае, модальный видимый элемент начинает обработку события. Куда событие пойдет дальше зависит от природы события. События передаются одним из трех способов, в зависимости от вида события. Возможны три вида передач: позиционировнные, активные и общие. Важно понимать как передается каждый вид события.
Куда поместить функциональность.
Сейчас Вы создали окно с рядом видимых элементов: рамкой и двумя скользящими интерьерами, каждый с двумя полосами скроллинга. Вы находитесь на пути создания окна, которое выполняет определенные функции в Вашей программе. Как Вам действовать? Допустим, Вы хотите настроить Ваше окно на текстовый редактор. Поскольку окно имеет 2 видимых элемента, Вам может понадобиться поместить функции редактора в группу, а затем установить взаимодействие группы с двумя видимыми элементами. Работа группы заключается в управлении видимыми элементами. Это не очень-то естественно, не так ли? Хотя Вы можете расширять группу любым видимым элементом и Вы можете вкладывать в нее любую нужную Вам функцию, Ваша программа на Turbo Vision будет более надежна и более гибка, если Вы будете следовать двум правилам: сохраняйте объекты как можно более автономными и сохраняйте группы (такие как окна) как можно более свободными от функциональной нагрузки. Так, когда Вы создаете текстовый редактор, помещая все функции в интерьер видимого элемента: создайте видимый элемент типа текстовый редактор. Видимые элементы могут заново использоваться, если Вы их правильно спроектировали и наоборот, перенос текстового редактора в другую среду будет затруднен, если его функции были распределены между группой и видимым элементом.
Лучший способ для Write.
Хотя Вы можете выполнить процедуру Write в Turbo Vision, это неверный путь. Во-первых, если Вы просто пишете что-нибудь, нет способа предотвратить случайное затирание окна или другого видимого элемента. Во-вторых, Вам требуется писать в локальных координатах текущего видимого элемента и отсекать по его границам. В-третьих, встает вопрос об использовании цвета при выводе. Процедура WriteStr Turbo Vision не только знает как писать в локальных координатах и как отсекать по границам видимого элемента, но так же как использовать палитру цветов видимого элемента. Процедура WriteStr берет координаты X и Y, строку для записи и индекс цвета в качестве параметров. Аналогично WriteStr, процедура WriteChar определена:
WriteChar(X, Y, Ch, Color, Count);
Подобно WriteStr, WriteChar позиционирует свой вывод в координаты (X, Y) внутри видимого элемента и пишет Count копий символа Ch цветом, указываемым элементом Color из палитры видимого элемента. Каждый из этих методов должен вызываться только изнутри метода Draw видимого элемента. Это единственное место, где Вам требуется писать что-либо внутри Turbo Vision.
Маскирование событий.
Каждый видимый элемент имеет битовое поле EventMask, которое используется для определения, какие события будет обрабатывать видимый элемент. Биты EventMask соответствуют битам поля TEvent.What. Если бит для данного вида события установлен, видимый элемент будет принимать этот вид события для обработки. Если бит для данного вида события очищен, видимый элемент будет игнорировать этот вид событий.
Механизм потоков.
Сейчас, когда мы просмотрели использование потоков, давайте посмотрим что делает Turbo Vision с Вашими объектами, когда Вы вводите или выводите их.
Меню.
TMenuView и 2 его потомка TMenuBar и TMenuBox предоставляют базовые объекты для создания выпадающих меню и подменю, вложенных на любой уровень. Вы задаете текстовые строки для выбора меню (возможно подсвечивать буквы для короткого набора) вместе с командами, связанными с каждым выбором. Методы HandleEvent реализуют механизм выбора меню с помощью мышки и клавиатуры (включая короткий набор и горячие клавиши). Выбор меню отображается с помощью объекта TMenuBar, который обычно принадлежит объекту TApplication. Выборы меню отображаются в объектах типа TMenuBox. В большинстве программ Вы не вызываете напрямую объекты меню. Перекрывая TApplication.InitMenuBar соответствующим набором вложенных вызовов New, NewSubMenu, NewItem и NewLine, Turbo Vision строит, отображает и взаимодействует с требуемыми меню.
Метки управляющих элементов.
Конечно, установки управляющих элементов может быть недостаточно. Простое предоставление набора выборов может ничего не говорить пользователю о том, что он выбирает! Turbo Vision предоставляет удобный метод для установки меток управляющих элементов в виде другого управляющего элемента TLabel. TLabel делает больше, чем кажется на первый взгляд. TLabel не только отображает текст, но и связывается с другим видимым элементом. Отметка мышкой метки приводит к активизации связанного видимого элемента. Вы так же можете определить букву сокращенного набора для метки, окружив букву "~". Чтобы пометить независимые кнопки, добавьте следующий код сразу после вставки независимых кнопок в диалоговое окно:
R.Assign(2, 2, 10, 3); Insert(New(PLabel, Init(R, 'Cheeses', B)));
Вы можете сейчас активировать набор независимых кнопок, отметив слово "Cheeses". Это так же предоставляет информацию об элементах в этом окне. Аналогично Вы можете добавить метку к зависимым кнопкам с помощью кода:
{ TVGUID14.PAS } R.Assign(21, 2, 33, 3); Insert(New(PLabel, Init(R, 'Consistency', B)));
Рис. 2.9. Диалоговое окно с метками кластеров.
+=[ю]======= Demo Dialog Box =============+ | | | Cheeses Consistency | | +----------------+ +--------------+ | | | [ ] HVarti | | [*] Solid | | | | [ ] Tilset | | [ ] Runny | | | | [ ] Jarlsberg | | [ ] Melted | | | +----------------+ +--------------+ | | | | | | | | | | OK m Cancel m | | ^^^^^^^^ ^^^^^^^^ | +==========================================+
Метод Done.
Дестрактор Done в действительности очень прост: он уничтожает все объекты программы - полосу меню, строку статуса и панель экрана - и удаляет обработчик ошибок и драйверы Turbo Vision. Метод Done должен отменять все действия, выполненные констрактором Init, а затем вызывать TApplication.Done, который обрабатывает все стандартные элементы. Если Вы перекрыли TApplication.Init, Вы, вероятно, будете перекрывать TApplication.Done.
Метод GetColor.
Отображение цвета палитры выполняется виртуальной функцией GetColor из TView. GetColor поднимается по дереву видимых элементов от рисуемогоо элемента к его владельцу, затем к владельцу владельца и т.д. пока не дойдет до объекта программа. Для каждого объекта в этой цепочке GetColor вызывает GetPalette этого объекта. Результат - цвет атрибута. Палитра видимого элемента содержит смещения в палитре владельца за исключением прикладной программы, чья палитра содержит атрибуты цветов.
Метод Init.
Первый из трех операторов HelloWorld.Init - это необходимый вызов констрактора. Все объекты, содержащие виртуальные методы, должны быть созданы (через вызов их констрактора) до вызовов любых других методов этого объекта. Все констракторы Turbo Vision имеют имя Init. Это удобное соглашение, которым мы рекомендуем пользоваться. HelloWorld.Init устанавливает объекты главной программы для использования. Он очищает экран, устанавливает некоторые значения для важных переменных, заполняет панель экрана и выводит строку статуса и полосу меню. Он вызывает констракторы многих других объектов, некоторые из которых никогда не видны, поскольку они вызываются внутри. Интересно использование встроенного отладчика для трассировки HelloWorld.Init через F8 с последующим просмотром дисплея через Alt -F5. Панель экрана, полоса меню и строка статуса будут появляться, готовя главную программу для использования.
Метод Insert.
Вставка окна в DeskTop автоматически приводит к появлению окна. Метод Insert используется, чтобы дать визуальный контроль над видимым элементом. Когда Вы выполняете
DeskTop^.Insert(Window);
Вы вставляете Window в панель экрана. Вы можете вставить любое число видимых элементов в групповой объект, такой как панель экрана. Группа, в которую Вы вставляете видимый элемент называется видимым элементом - владельцем, а видимый элемент, который Вы вставляете, называется видимым подэлементом. Заметим, что видимый подэлемент сам может быть группой и может иметь свои видимые подэлементы. Например, когда Вы вставляете окно в панель экрана, окно является подэлементом, но окно может владеть рамкой, полосами скроллинга и другими видимыми подэлементами. Этот процесс установления связей между видимыми объектами создает дерево видимых элементов. (Взаимосвязи между видимыми элементами объяснены в главе 4.)
Метод Run.
Почти вся работа программы в Turbo Vision выполняется внутри метода главной программы Run. Мистика начинается, когда Вы смотрите на определение THelloApp для нахождения определения метода Run. Его здесь нет - поскольку Run наследуется от родительского объекта TApplication. Run - это та части, в которой Ваша программа будет, вероятно, тратить большую часть своего времени. Она состоит главным образом из цикла repeat.until, показанном здесь в псевдокоде:
repeat Получить событие; Обработать событие; until Quit;
Это не точный код, а общая схема реализации Run. В сущности программа Turbo Vision циклически выполняет 2 задачи: получение события (где событие - это, в сущности, "сделать что-нибудь") и обработка этого события. Одно из событий вычисляется в некоторый вид команды выхода и цикл завершается.
Примечание: Более детальное описание обработки событий приведено в главе 5.
Метод ValidView.
Поскольку LowMemory проверяется достаточно часто, TApplication имеет метод ValidView, который может вызываться для выполнения необходимой проверки. Используя ValidView, проверка if в последних 8 строках может быть заменена на 2 строки:
DoIt := (ValidView(D) <> nil) and (DeskTop^.ExecView(D) = cmYes;
ValidView возвращает либо указатель на переданный видимый элемент, либо nil, если видимый элемент неверен. Если LowMemory возвращает True, ValidView освобождает видимый элемент и вызывает OutOfMemory.
Методы Load и Store.
Действительное чтение и запись объектов в поток обрабатывается методами Load и Store. Хотя каждый объект должен содержать эти методы для того, чтобы его можно было использовать с потоками, Вы никогда не вызываете их прямо. (Они вызываются из Get и Put). Все, что Вам требуется сделать - это убедиться, что Ваш объект знает как послать себя в поток, когда ему говорят сделать это. Благодаря ООП эта работа очень проста, поскольку большая часть механизма наследуется из объекта предка. Все, что Ваш объект должен сделать - это загрузить или сохранить ту часть, которую Вы добавили; за остальное отвечает вызов метода предка. Например Вы породили новый тип видимого элемента от TWindow, назвав его именем известного сюрреалиста Рене Магритте, который нарисовал много известных картин с окнами:
type TМagritte = object(TWindow) Painted: Boolean; constructor Load(var S: TStream); procedure Draw; procedure Store(var S: TStream); end;
В часть данных было добавлено только одно поле Boolean. Для того, чтобы загрузить объект, Вы просто читаете стандартный TWindow, а затем читаете дополнительный байт, соответствующий полю Boolean. То же самое применимо к сохранению объекта: Вы просто записываете TWindow, а потом записываете еще один байт. Типичные методы Load и Store для порожденных объектов имеют вид:
constructor TМargitte.Load(var S: Stream); begin TWindow.Load(S); S.Read(Painted, SizeOf(Boolean)) end;
procedure TМargitte.Store(var S: Stream); begin TWindow.Store(S); S.Write(Painted, SizeOf(Boolean)) end;
Предупреждение: Вы полностью ответственны за то, что сохраняется столько же данных, сколько и загружается и что данные загружаются в том же порядке, в каком они сохранялись. Компилятор не выдает ошибок. Это может приводить к огромным проблемам, если Вы неаккуратны. Если Вы изменяете поля объектов, убедитесь, что скорректированы и Load и Store.
Методы Turbo Vision.
Методы Turbo Vision могут характеризоваться 4 (возможно перекрывающимися) способами, каждый из которых описан здесь.
Модальные видимые элементы.
Режим (модальность) это способ действия или функционирования. Программа может иметь несколько режимов действия, особенно различающимися для различных функций управления или областей управления. Например, интегрированная среда Turbo Pascal имеет режимы редактирования, отладки, компиляции и выполнения. В зависимости от того какой из этих режимов активен, клавиши клавиатуры могут приводить к различным действиям ( или не иметь действия вообще). Видимый элемент Turbo Vision может определять режим действия и называется в этом случае модальным видимым элементом. Классический пример модального видимого элемента - диалоговое окно. Обычно когда диалоговое окно активно, за его пределами ничего не функционирует. Вы не можете использовать меню и другие элементы управления не принадлежащие диалоговому окну, кроме того отметка мышкой за пределами диалогового окна не имеет действия. Управление находится внутри диалогового окна до тех пор пока оно не закроется. (Некоторые диалоговые окна не модальные, но это редкое исключение). Когда Вы создаете экземпляр видимого элемента и делаете его модальным, только этот видимый элемент и его подэлементы могут взаимодействовать с пользователем. Вы можете представить модальный видимый элемент как определение (сферы действия) в Вашей программе. Когда Вы создаете блок в программе Turbo Pascal (такой как процедуру или функцию), идентификаторы, объявленные внутри этого блока, действительны только внутри этого блока. Аналогично, модальный видимый элемент определяет что функционирование доступно внутри него - события обрабатываются только модальным видимым элементом и его подэлементами. Любая часть дерева видимых элементов, не являющаяся модальным элементом или не принадлежащая модальному элементу, не активна. Существует одно исключение из этого правила - это строка статуса. (Строка статуса всегда "горячая", вне зависимости, является ли видимый элемент модальным). Turbo Vision сохраняет строку статуса все время активной. Таким образом, Вы можете иметь активные элементы строки статуса даже когда в Вашей программе выполняется модальное диалоговое окно, которое не владеет строкой статуса. Однако события и команды, генерируемые строкой статуса, обрабатываются как если бы они генерировались внутри модального видимого элемента. Всегда существует модальный видимый элемент при выполнении программы на Turbo Vision. Когда Вы запускаете программу и часто для работы программы сама прикладная программа является модальным видимым элементом - объект TApplication, находящийся на вершине дерева видимых элементов.
Модификация механизма событий.
Сердцем текущего модального видимого элемента является цикл типа:
var E: TEvent; begin E.What := evNothing; repeat if E.What <> evNothing then EventError(E); GetEvent(E); HandleEvent(E); until EndState <> Continue; end;