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

         

Переменная Application App


================================================================= Объявление Application: PApplicaton = nil;

Функция Переменная Application устанавливается в @Self в начале TProgram.Init (вызывается в TApplication.Init) и очищается в nil в конце TProgram.Done (вызывается в TApplication.Done). Поэтому, во время выполнения программы на Turbo Vision, Application указывает на объект-программу.

См. также TProgram.Init



Переменная AppPalette App


================================================================= Объявление AppPalette: Integer = apColor;

Функция Выбирает одну из 3 доступных в программе палитр (apColor, apBlackWhite, apMonochrome). AppPalette инициализируется TProgram.InitScreen в зависимости от текущего режима экрана и используется TProgram.GetPalette для возврата палитры. Вы можете перекрыть TProgram.InitScreen, чтобы изменить выбор палитры по умолчанию.

См. также TProgram.InitScreen, константы apXXXX



Переменная ButtonCount Drivers


================================================================= Объявление ButtonCount: Byte = 0;

Функция ButtonCount хранит число кнопок мышки или 0, если мышка не инсталлирована. Вы можете использовать эту переменную для определения доступна ли поддержка мышки. Значение устанавливается в иницилизационном коде Drivers и не может быть изменено.



Переменная CheckSnow Drivers


================================================================= Объявление CheckSnow: Boolean;

Функция CheckSnow выполняет функцию одноименного флага стандартного модуля Turbo Pascal - Crt. Проверка снега, замедляющая вывод на экран, требуется только для некоторых старых адаптеров CGA.

См. также InitVideo





Переменная CtrlBreakHit Drivers


================================================================= Объявление CtrlBreakHit: Boolean = False;

Функция Драйвер обработки прерываний от клавиатуры Turbo Vision всегда устанавливает ее в True, когда нажата Ctrl-Break. Это позволяет программам на Turbo Vision перехватывать и реагировать на Ctrl-Break. Флаг может быть очищен в любое время установкой его в False.

См. также SaveCtrlBreak



Переменная CursorLines Drivers


================================================================= Объявление CursorLines: Word;

Функция Уставливает начальную и конечную строки курсора с помощью InitVideo. Формат предполагает функцию 1 прерывания BIOS $10 для установки типа курсора.

См. также InitVideo, TView.ShowCursor, TView.HideCursor, TView.BlockCursor, Tview.NormalCursor



Переменная DeskTop App


================================================================= Объявление DeskTop: PDeskTop = nil;

Функция Сохраняет указатель на TDeskTop программы. Переменная DeskTop инициализируется TProgram.InitDeskTop, которая вызывается TProgram.Init. Окна и диалоговые окна обычно вставляются (TGroup.Insert) или выполняются (TGroup.ExecView) на DeskTop.



Переменная DoubleDelay Drivers


================================================================= Объявление DoubleDelay: Word = 8;

Функция Определяет временной интевал (в 1/18.2 секундах) между нажатиями кнопки мышки для порядка различия двойного нажатия и двух отдельных нажатий. Используется GetMouseEvent для генерации события Double, если нажатия произошли в этом временном интервале.

См. также TEvent.Double, GetMouseEvent



Переменная EmsCurHandle Objects


================================================================= Объявление EmsCurhandle: Word = $FFFF;

Функция Содержит текущий обработчик EMS, отображенный TEmsStream в нулевую физическую страницу EMS. TEmsStream избегает дорогих вызовов переотображения EMS подкачкой состояния EMS. Если Ваша программа использует EMS для других целей, установите EmsCurHandle и EmsCurPage в $FFFF перед использованием TEmsStream - это будет вынуждать TEmsStream восстанавливать свое отображение.

См. также TEmsStream.Handle



Переменная EmsCurPage Objects


================================================================= Объявление EmsCurpage: Word = $FFFF;

Функция Содержит текущий номер логической страницы EMS, отображенной TEmsStream в нулевую физическую страницу EMS. TEmsStream избегает дорогих вызовов переотображения EMS подкачкой состояния EMS. Если Ваша программа использует EMS для других целей, установите EmsCurHandle и EmsCurPage в $FFFF перед использованием TEmsStream - это будет вынуждать TEmsStream восстанавливать свое отображение.

См. также TEmsStream.Page



Переменная FocusedEvents Views


================================================================= Оъявление FocusedEvents: Word = evKeyboard + evCommand;

Функция Определяет классы событий как сфокусированные события. Переменные FocusedEvents и PositionalEvents используются TGroup.HandleEvent для определения, как соотносятся события к подэлементам группы. Если класс события не содержится в FocusedEvents или PositionalEvents, то оно интерпретируется как общее событие.

См. также Переменные PositionalEvents, TGroup.HandleEvent, TEvent, константы evXXXX.



Переменная HiResScreen Drivers


================================================================= Объявление HiResScreen: Boolean;

Функция Устанавливается в True с помощью InitVideo, если экран поддерживает режим 43/50 строк (EGA/VGA); в противном случае устанавливается в False.

См. также InitVideo



Переменная HistoryBlock HistList


================================================================= Объявление HistoryBlock: Pointer = nil;

Функция Указывает на буфер, вызывающий блок истории и используемый для хранения строк истории. Размер блока определяется посредством HistorySize. Указатель устанавливается в nil до тех пор пока не будет установлен с помощью InitHistory. Его значение нельзя изменить.

См. также процедуру InitHistory, переменную HistorySize.



Переменная HistorySize HistList


================================================================= Объявление HistorySize: Word = 1024;

Функция Задает размер блока истории, используемый администратором списка истории для хранения значений, введенных в строках ввода. Размер фиксируется посредством InitHistory при запуске программы. По умолчанию размер блока равен 1К, но может быть изменен перед вызовом InitHistory. Значение нельзя изменять после вызова InitHistory.

См. также процедуру InitHistory, переменную HistoryBlock.



Переменная HistoryUsed HistList


================================================================= Объявление HistoryUsed: Word = 0;

Функция Используется внутри администратором списка истории для указания на смещение внутри блока истории. Это значение нельзя изменить.



Переменная MaxBufMem Memory


================================================================= Объявление MaxBufMem: Word = 65536 div 16;

Функция Указывает максимальный объем памяти в 16-байтовых параграфах, которая может быть распределена для кэш-буферов.

См. также GetBufMem, FreeBufMem.



Переменная MaxCollectionSize Objects


================================================================= Объявление MaxCollectionSize = 65520 div SizeOf(Pointer);

Функция Определяет максимальное число элементов, которые может содержать коллекция, по существу это число указателей, которое помещается в сегмент памяти в 64К.



Переменная MenuBar App


================================================================= Объявление MenuBar: PMenuView = nil;

Функция Сохраняет указатель на полосу меню программы (наследник TMenuView). Переменная MenuBar инициализируется с помощью TProgram.InitMenuBar, которая вызывается через TProgram.Init. Значение nil указывает, что программа не имеет полосы меню.



Переменная MinWinSize Views


================================================================= Объявление MInWinSize: TPoint = (X: 16; Y: 6);

Функция Определяет минимальный размер TWindow или его потомков. Значение возвращается в параметре Min при вызове TWindow.SizeLimits. Любые изменения в MinWinSize будут воздействовать на все окна, если только метод SizeLimits окна не перекрыт.

См. также TWindow.SizeLimits



Переменная MouseButtons Drivers


================================================================= Объявление MouseButtons: Byte;

Функция Содержит текущее состояние кнопок мышки. MouseButtons корректируется обработчиком прерываний мышки как только кнопка нажата или отпущена. Константы mbXXXX могут быть использованы для проверки MouseButtons.

См. также константы mbXXX.



Переменная MouseEvents Drivers


================================================================= Объявление MouseEvents: Boolean = False;

Функция Устанавливается в True, если мышка инсталлирована и обнаружена InitEvents; в противном случае, устанавливается в False. Если False, то все процедуры событий от мышки обходятся.

См. также GetMouseEvent.



Переменная MouseIntFlag Drivers


================================================================= Объявление MouseIntFlag: Byte;

Функция Используется внутри драйвера мышки Turbo Vision и видимыми элементами. Устанавливается как только возникает событие от мышки.



Переменная MouseWhere Drivers


================================================================= Объявление MouseWhere: TPoint;

Функция Содержит текущую позицию мышки в глобальных координатах. MouseWhere корректируется обработчиком прерываний мышки как только мышка сдвигается. Используйте процедуру MakeLocal для преобразования к локальным (относительно окна) координатам. MouseWhere передается в обработчики событий вместе с другими данными мышки.

См. также GetMouseEvent, методы GetEvent, MakeLocal



Переменная PositionalEvents Views


================================================================= Объявление PositionalEvents:Word = evMouse;

Функция Определяет классы событий как позиционированные события. Переменные FocusedEvents и PositionalEvents используются TGroup.HandleEvent, чтобы установить соответствие события подэлементам группы. Если класс события не принадлежит FocusedEvents или PositionalEvents, то оно интерпретируется как общее событие.

См. также TGroup.HandleEvent, тип TEvent, константы события evXXXX, переменная Focused Events.



Переменная RepeatDelay Drivers


================================================================= Объявление RepeatDelay = 8;

Функция Определяет число квантов времени (1/18.2 часть секунды), которое должно быть известно перед генерацией событий evMouseAuto. Временной интервал между событиями evMouseAuto всегда составляет один квант.

См. также DoubleDelay, GetMouseEvent, константы evXXXX.



Переменная SaveCtrlBreak Drivers


================================================================= Объявление SaveCtrlBreak: Boolean = False;

Функция Процедура InitSysError сохраняет состояние Ctrl-Break DOS, проверяя эту переменную перед запрещением проверки Ctrl-Break DOS. DoneSysError восстанавливает Ctrl-Break DOS, проверяя значение, сохраненное в этой переменной.

См. также InitSysError, DoneSysError



Переменная ScreenBuffer Drivers


================================================================= Объявление ScreenBuffer: Pointer;

Функция Указатель на буфер экрана.

См. также InitVideo.



Переменная ScreenHeight Drivers


================================================================= Объявление ScreenHeight: Byte;

Функция Устанавливается InitVideo и SetVideoMode в высоту экрана в строках для текущего экрана.

См. также InitVideo, SetVideoMode, ScreenWidth.



Переменная ScreenMode Drivers


================================================================= Объявление ScreenMode: Word;

Функция Хранит текущий видеорежим. Изначально устанавливается инициализационным кодом модуля Drivers, ScreenMode может быть изменена использованием SetVideoMode. Значения ScreenMode обычно устанавливаются использованием мнемоник режима экрана smXXXX.

См. также InitVideo, SetVideoMode, smXXXX.



Переменная ScreenWidth Drivers


================================================================= Объявление ScreenWidth: Byte;

Функция Устанавливается InitVideo в ширину экрана (число символов с строке).

См. также InitVideo.



Переменная ShadowAttr Views


================================================================= Объявление ShadowAttr: Byte = $80;

Функция Эта переменная управляет цветом тени, доступной видимым элементам с установленным битом sfShadow. Тень это обычно разреженная серая область, отображаемая прямо от краев видимого элемента с иллюзией 3-D.

См. также ShadowSize.



Переменная ShadowSize Views


================================================================= Объявление ShadowSize: TPoint = (X: 2; Y: 1);

Функция Это значение управляет размером тени, кторая доступна с установленным битом sfShadow. Тень это обычно разреженная серая область, отображаемая прямо от краев видимого элемента с иллюзией 3-D. По умолчанию, размер тени - 2 по оси X и 1 по Y. TProgram.InitScreen инициализирует ShadowSize: если режим экрана равен smMono, ShadowSize устанавливается в (0, 0). Иначе ShadowSize устанавливается в (2, 1), если только не установлен smFont8x8 (43- или 50-строчный режим), в этом случае устанавливается в (1, 1).

См. также TProgram.InitScreen, ShadowAttr.



Переменная ShowMarkers Drivers


================================================================= Объявление ShowMarkers: Boolean;

Функция Используется для указания будут ли индикаторы размещаться вокруг активных элементов управления. TProgram.InitScreen устанавливает ShowMarkers в True, если монохромный видеорежим, иначе в False. Однако значение может быть установлено, при необходимости, в цветной или черно-белый режим.

См. также TProgram.InitScreen, переменная SpecialChars.



Переменная SpecialChars Views


================================================================= Объявление SpecialChars: array[05] of Char = (#175, #174, #26, #27, ' ', ' ');

Функция Определяет символы индикатора используемые для подсветки активного видимого элемента в монохромном видеорежиме. Эти символы отображаются, если переменная ShowMarkers - True.

См. также переменную ShowMarkers.



Переменная StartupMode Drivers


================================================================= Объявление StartupMode: Word;

Функция Программа InitVideo сохраняет текущий режим экрана в этой переменной до переключения в режим экрана заданный в ScreenMode. DoneVideo восстанавливает режим экрана в значение запомненное в StartupMode.

См. также InitVideo, DoneVideo, ScreenMode.



Переменная StatusLine App


================================================================= Объявление StatusLine: PStatusLine = nil;

Функция Сохраняет указатель на строку статуса программы. Переменная StatusLine инициализируется в TProgram.InitStatusLine, вызываемой из TProgram.Init. Значение nil указывает, что в программе нет строки статуса.

См. также InitStatusLine.



Переменная StreamError Objects


================================================================= Объявление StreamError: Pointer = nil;

Функция Если не nil, StreamError указывает на процедуру, которая вызывается методом Error потока при возникновении ошибки. Процедура должна быть дальней и использовать var параметр типа TStream, т.е. иметь объявление:

procedure MyStreamErrorProc(var S: TStream); far;

StreamError позволяет Вам глобально перекрыть всю обработку ошибок потока. Чтобы изменит обработку ошибок для определенного типа потока, Вы должны перекрыть метод Error этого потока.



Переменная SysColorAttr Drivers


================================================================= Объявление SysColorAttr: Word = $4E4F;

Функция Цвет по умолчанию используется для вывода сообщений об ошибках обработчиком системных ошибок. На монохромных системах SysMonoAttr используется вместо SysColorAttr. Сообщения об ошибках с опцией отменить/ восстановить отображаются в строке статуса. Предыдущая строка статуса сохраняется и восстанавливается, когда условия разрешены.

См. также SystemError, SysMonoAttr.



Переменная SysErrActive Drivers


================================================================= Объявление SysErrActive: Boolean = False;

Функция Указывает, активен ли обработчик системных ошибок в данный момент. Устанавливается в True через InitSysError.



Переменная SysErrorFunc Drivers


=================================================================

Объявление SysErrorFunc: TSysErrorFunc = SystemError;

Функция SysErrorFunc - это функция системной ошибки типа TSysErrorFunc. Функция системной ошибки вызывается при возникновении критической ошибки DOS или когда требуется смена диска на компьютере с одним гибким диском. ErrorCode - это значение от 0 до 15, как определено в таблице 14.30, а Drive - это номер устройства (0=А, 1=В и т.д.) для дисковых ошибок. По умолчанию функция системной ошибки - это SystemError. Вы можете установить свою функцию системной ошибки, назначая ее в SysErrorFunc. Функции системных ошибок не могут перекрываться.

Таблица 14.30. Коды функции системной ошибки.

----------------------------------------------------------- Код ошибки Значение ----------------------------------------------------------- 012 Коды критических ошибок DOS 13 Плохой образ таблицы распределения файлов 14 Ошибка доступа к устройству 15 Указание смены диска -----------------------------------------------------------

Возвращаемые значения функции:

Таблица 14.31. Значения, возвращаемые функцией системной ошибки.

----------------------------------------------------------- Возвращаемое значение Назначение ----------------------------------------------------------- 0 Пользователь запросил повтор 1 Пользователь запросил отмену -----------------------------------------------------------

См. также функцию SystemError, тип TSysErrorFunc, процедуру InitSysError.



Переменная SysMonoAttr Drivers


================================================================= Объявление SysMonoAttr: Word = $7070;

Функция Атрибут по умолчанию используется для вывода сообщений об ошибках обработчиком системных ошибок. На цветных системах SysColorAttr используется вместо SysMonoAttr. Сообщения об ошибках с опцией отменить/ восстановить отображаются в строке статуса. Предыдущая строка статуса сохраняется и восстанавливается, когда условия разрешены.

См. также SystemError, SysColorAttr.



Переменные.


------------------------------------------------------------- Переменная Тип Начальное Назначение значение ------------------------------------------------------------- EmsCurHandle Word $FFFF Текущий обработчик EMS EmsCurPage Word $FFFF Текущая страница EMS -------------------------------------------------------------



Переосмысление проекта.


В традиционном программировании мы думали о программе с точки зрения кода. Теперь мы можем попытаться организовать программу так же, как интегрированная среда Turbo Pascal окружает объект редактора. Большую часть времени в интегрированной среде Вы тратите на редактирование. Редактор будет редактировать, а в промежутках от вызывает компилятор. Но требуется изменить перспективу, чтобы правильно использовать мощь ООП. Имеет смысл в случае интегрированной среды сделать саму программу объектом. Когда необходимо редактировать, программа вызывает редактор. Когда необходимо компилировать, программа вызывает компилятор, инициализируя его и говоря какие файлы компилировать. Если компилятор встретил ошибку как пользователь вернется на точку ошибки в исходном коде? Программа вызывает компилятор и получает результат от него. Если компилятор возвращает ошибочный результат, он так же возвращает имя файла и номер строки. Программа смотрит, открыт ли редактор для этого файла, и если нет - открывает его. Он передает информацию об ошибке, включая номер строки в редактор и конструирует строку сообщения об ошибке для редактора.



Пересылка текста в буфер.


Turbo Vision предоставляет 4 глобальных процедуры для пересылки текста в TDrawBuffer: MoveStr, которую Вы только что видели, и MoveChar, MoveCStr и MoveBuf, которые пересылают символы, управляющие строки (строки с "~" для элементов меню и статуса) и другие буфера в буфер, соответственно. Эти процедуры объяснены детально в главе 14.



Побитовые операции.


Turbo Pascal предоставляет ряд полезных операций для манипуляции битами. Вместо детального объяснения каждой из операций, этот раздел просто говорит что Вы должны сделать, чтобы выполнить работу.



Подэлементы и дерево видимых элементов.


Как сказано раньше, видимый элемент TApplication владеет и управляет тремя подэлементами, созданными им. Вы можете представить эту взаимосвязь как формирование дерева видимых элементов. Application - это ствол, а MenuBar, DeskTop и StatusLine формируют ветви, как показано на рис. 4.8.

Рис. 4.8. Основное дерево видимых элементов Turbo Vision.

+-------------+ | Application | +--+--+---+---+ +--------+ | +-------+ +---+-----++----+----++-----+------+ | MenuBar DeskTop StatusLine | +---------++---------++------------+

Запомните, что взаимосвязи, показанные на рис. 4.8. - это не иерархия объектов, а модель структуры данных. Связи отражают принадлежность, а не наследование. В типичной программе, когда пользователь отмечает мышкой или использует клавиатуру, он создает новые видимые элементы. Эти видимые элементы будут появляться на панели экрана, формируя новые ветви дерева. Важно понимать взаимосвязи между владельцами и подэлементами и как появление и поведение видимого элемента зависит от того, кто владеет видимым элементом. Рассмотрим пример. Пусть пользователь отмечает элемент меню, который вызывает окно просмотра файла. Окно просмотра файла будет видимым элементом. Turbo Vision создает окно и присоединяет его к панели экрана. Окно будет владеть рядом подэлементов: TFrame - рамка окна, TScroller - содержит массив текста и TScrollBar. Когда окно вызывается, оно создает, владеет и управляет подэлементами. К Вашей растущей программе подключены новые видимые элементы, как показано на рис. 4.9.

Рис. 4.9. Панель экрана с просмотром файлов.

+------------------------------------------------+ | Строка меню | +------------------------------------------------| |************************************************| |**+=[ю]=== File Viewer Window ==1=[]=+ ********| |**| ********| |**| # ********| |**| File text # ********| |**| # ********| |**| ю ********| |**| # ********| |**| ********| |**+==========#ю###############======+ ********| |************************************************| +------------------------------------------------| | Строка статусa | +------------------------------------------------+


Дерево видимых элементов становится более сложным, как показано на рис. 4.10.

Рис. 4.10. Дерево видимых элементов с просмотром файла.

+-------------+ | Application | +--+--+---+---+ +--------+ | +-------+ +---+-----++----+----++-----+------+ | MenuBar DeskTop StatusLine | +---------++----+----++------------+ +----+---+ | Window | ++-+--+-++ +-----+ | | +------+ +----+--+ | | +---+------+ | Frame | | | | Scroller | +-------+ | | +----------+ +--+ +--+ +---------+--+ +--+---------+ | Scroll Bar | | Scroll Bar | +------------+ +------------+

Теперь предположим, что пользователь отметил тот же элемент меню и создал другое окно просмотра файлов. Turbo Vision создает второе окно и присоединяет его к панели экрана, как показано на рис. 4.11.

Рис. 4.11. Панель экрана с просмотром файла.

+----------------------------------------------------+ | Строка меню | +----------------------------------------------------| |****************************************************| |**+======= File Viewer Window ==1=====+*************| |**| *************| |**| +=[ю]=== File Viewer Window ==2=[]=+***| |**| File te| ***| |**| | #***| |**| | File text #***| |**| | #***| |**| | ю***| |**+=========| #***| |************| ***| |************+==========#ю###############======+***| |****************************************************| +----------------------------------------------------| | Строка статусa | +----------------------------------------------------+

Дерево видимых элементов становится еще более сложным, как показано на рис. 4.12.

Рис. 4.12. Дерево видимых элементов с просмотром файла.

+-------------+ | Application | +--+--+---+---+ +--------+ | +-------+ +---+-----++----+----++-----+------+ | MenuBar DeskTop StatusLine | +---------++--+---+--++------------+ +-----------+ +-----------------+ +----+---+ +----+---+ | Window | | Window | ++-+--+-++ ++-+--+-++ +-----+ | | +-----+ +-----+ | | +-----+ +----+--+ | | +---+------+ +----+--+ | | +---+------+ | Frame | | | | Scroller | | Frame | | | | Scroller | +-------+ | | +----------+ +-------+ | | +----------+ +--+ +--+ +--+ +--+ +---------+--+ +--+---------+ +---------+--+ +--+---------+ | Scroll Bar | | Scroll Bar | | Scroll Bar | | Scroll Bar | +------------+ +------------+ +------------+ +------------+



Как Вы увидите в главе 5, управление программы проходит по дереву видимых элементов. В предыдущем примере предположим, что Вы отметили полосу скроллинга в окне просмотра файла. Как сделать, чтобы это действие обрабатывалось в нужном месте? Программа Application видит отметку мышкой, обнаруживает, что она находится в области, управляемой панелью экрана и передает ее в объект "панель экрана". Панель экрана видит, что отметка внутри области, управляемой просмотром файла и передает ее в этот видимый элемент. Просмотр файла видит, что отметка была в полосе скроллинга и позволяет видимому элементу "полоса скроллинга" обработать отметку, генерируя соответствующий отклик. Действительный механизм этой обработки не важен в данный момент. Сейчас важно понять как связаны видимые элементы. Вне зависимости от сложности структуры, все видимые элементы связаны с объектом Вашей программы. (Обработка событий объяснена в главе 5). Если пользователь отметил закрывающую кнопку во втором просмотре файла, или элемент меню Close Window, второй просмотр файла закрывается. Turbo Vision отключает его в дереве видимых элементов и уничтожает. Окно будет освобождать все подэлементы, а затем уничтожает себя. Вероятно пользователь будет удалять видимые элементы, пока не достигнет начальной позиции и укажет, что он закочил работу нажав Alt-X или выбрав Exit из меню. TApplication удаляет свои подэлементы, а затем удаляет себя.


Поиск элемента.


Отсортированные коллекции (и следовательно коллекции строк) имеют метод Search, который возвращает индекс элемента с заданным ключем. Как Вам найти элемент в неотсортированной коллекции? Или как найти элемент, когда критерий поиска не включает ключ? Конечно необходимо использовать FirstThat и LastThat. Вы просто определяете булевскую функцию с нужным критерием поиска и вызываете FirstThat.



Появление видимых элементов.


Появление видимого элемента определяется его методом Draw. Каждый новый тип видимого элемента требует собственного метода Draw. Существует правила, которые применяются ко всем видимым элементам. Видимый элемент должен: - заполнять всю область, за которую он ответственен. - рисовать себя в любое время.

Эти свойства очень важны и обсуждаются далее.



Поле Phase.


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

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



Полиморфизм.


Второе свойство массивов, которое может стать ограничением для Вашей программы в том, что каждый элемент массива должен быть одного типа и этот тип определяется во время компиляции. Коллекции обходят это ограничение, используя нетипированные указатели. Это не только быстро и эффективно, но и позволяет коллекции содержать объекты (и даже не объекты) различных типов и размеров. Так же как поток, коллекция не должна ничего знать об обрабатываемых объектах. Она только хранит их и выдает по запросу.