Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delfi, лекции / Зан Св компонентов.doc
Скачиваний:
17
Добавлен:
28.03.2016
Размер:
1.1 Mб
Скачать

События клавиатуры

События мыши возникают в любом потомке класса TControl.

В отличие от этого события клавиатуры возникают только в некоторых оконных компонентах (в потомках класса TWinControl).

Обработка событий связана со следующими свойствами этих компонентов:

Параметр Shift, как и в обработчиках событий от мыши, содержит уточняющие признаки.

Параметр Key в обработчиках TKeyEvent содержит виртуальный код клавиши, а в обработчике TKeyPressEvent - ASCII-символ.

Обработчики OnKeyDown и OnKeyUp перехватывают нажатие большинства клавиш клавиатуры, в то время как обработчик OnKeyPress - только нажатие алфавитно-цифровых клавиш. Получаемый им символ Key учитывает выбранный язык и нажатую клавишу Shift.

Виртуальные коды клавиш определены константами vk_XXX в файле SOURCE\RTL\WIN\WINDOWS. PAS каталога размещения Delphi.

Виртуальный код - это просто уникальный числовой идентификатор клавиши.

Для буквенно-цифровых клавиш 0-9 и A-Z виртуальный код совпадает с кодом, возвращаемым функцией ord('X'), где X - соответствующий прописной символ: ord('0'), ord('W') и т.д.

Поскольку параметр Key в каждом обработчике определен как параметр-переменная, программист может изменить фактический код клавиши. Такая возможность может оказаться полезной для фильтрации нажатия каких-либо клавиш. При этом изменение кода происходит в обработчике формы, а в оконный элемент с фокусом ввода будет поступать уже измененный код.

Чтобы форма получила сообщение от клавиатуры до передачи его в элемент с фокусом ввода, следует поместить в следующее свойство формы значение True:

Фокус ввода

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

Это выделение достигается передачей элементу фокуса ввода с помощью его метода:

Компонент с фокусом ввода имеет значение True в своем свойстве

Если элемент недоступен или невидим, его показанное ниже свойство имеет значение False:

Фокус ввода передается элементу после щелчка на нем мышью или в порядке выбора его клавишей Tab.

Чтобы элемент можно было выбирать с помощью этой клавиши, следует установить в следующее его свойство значение True:

Порядок выбора элемента определяется другим свойством:

Delphi следит за уникальностью и непрерывностью значений этого свойства всех помещенных на форму доступных и видимых в данный момент компонентов. С помощью следующего метода можно получить список всех дочерних элементов, выбираемых клавишей Tab:

Механизм действий

В Delphi имеется специальный механизм действий, дающий удобное средство централизованной реакции программы на те или иные действия пользователя.

Для реализации действий на вкладке Standard палитры компонентов помещен специальный компонент TActionList, а в классе TComponent введено свойство Action:

Централизация необходима потому, что подавляющее большинство промышленных программ для Windows содержат два или более интерфейсных элемента, реализующих одно и то же действие. Например, в среде Delphi некоторые команды главного меню дублируются соответствующими кнопками панели инструментов (в принципе, любая команда меню Delphi может иметь кнопочный эквивалент).

Компонент TActionList содержит список имен действий и связанных с ними имен подпрограмм, которые эти действия реализуют.

Чтобы связать компонент с нужным действием, достаточно раскрыть список Action (этот список содержит имена всех действий во всех компонентах TActionList) и выбрать нужное название. При этом обычно меняется графическое изображение и/или надпись на компоненте, а также связанная с ним оперативная подсказка (Hint).

Свойство Action используется только после создания и заполнения списка (списков) TActionList.

Если для действия не определен обработчик OnExecute, все связанные с этим действием элементы управления на этапе прогона программы будут недоступными.

Механизм перетаскивания

Операционная система Windows широко использует специальный прием связывания программ с данными, который называется Drag&Drop (перетащи и отпусти). Такой прием в Проводнике Windows применяется для копирования или перемещения файлов, а также для запуска обрабатывающей программы. В Delphi реализован собственный механизм Drag&Drop, позволяющий компонентам обмениваться данными путем перетаскивания их мышью.

Этот механизм определяется двумя свойствами и тремя событиями, доступными каждому видимому компоненту.

Первое свойство:

Это свойство определяет, как будет выполняться весь комплекс действий, связанных с перетаскиванием:

dmManual - вручную (то есть все необходимые для обслуживания механизма события генерируются программой);

dmAutomatic - автоматически (события инициируются свойствами и методами компонентов).

Второе свойство:

Это свойство определяет вид указателя мыши в момент, когда на компоненте оказываются перетаскиваемые данные. Если компонент готов принять данные, он устанавливает в это свойство значение crDrag, в противном случае - crNoDrag ©.

Установка этих свойств осуществляется автоматически, если выполняется условие:

Следующее событие возникает, когда указатель мыши «с грузом» оказывается на компоненте.

Параметры здесь следующие:

Sender - компонент, который генерирует событие (обычно имеет значение Self - сам компонент-получатель, хотя при программном управлении механизмом перетаскивания это может быть не так);

Source - компонент-отправитель «груза»;

X, Y - текущие координаты указателя мыши в пикселах клиентской области компонента;

State - состояние указателя:

dsDragEnter - только что появился на компоненте;

dsDragLeave - только что покинул компонент или была отпущена кнопка мыши;

dsDragMove - перемещается на компоненте;

Accept - в этом параметре обработчик сообщает, готов ли компонент принять данные (True - готов).

Следующее событие означает, что пользователь «бросил» данные на компонент:

Параметры обработчика аналогичны одноименным параметрам обработчика DragOver.

При завершении перетаскивания (вне зависимости от того, приняты данные или нет) возникает еще одно событие:

Здесь Sender - отправитель данных; Target - получатель данных или NIL, никто не принял «посылку»; X, Y - координаты мыши в момент отпускания левой кнопки.

Для иллюстрации использования механизма перетаскивания, загрузите программу, установите во всех ее компонентах в свойство DragMode значение dmAutomatic и создайте для метки обработчик события OnDragOver, представленный в листинге 1.2

Рис.1.2

Листинг 1.1

Теперь перетаскивание любого компонента на метку lbOutput заставит ее показать имя этого компонента (рис.1.6).

Для ручного (программного) управления механизмом перетаскивания используются специальные методы, доступные любому потомку класса TControl и перечисленные в табл. 1.4.

Таблица 1.4

Механизм причаливания

В Delphi введена поддержка специального механизма Drag&Dock (перетащи и причаль), посредством которого можно «причалить» мышью компонент в новое место.

В механизме Drag&Dock участвуют два компонента: принимающий компонент (всегда потомок класса TWinControl) и причаливаемый компонент (потомок класса TControl).

Принимающий компонент должен иметь значение True в своем свойстве DockSite. Поскольку причаливание является разновидностью более общего механизма перетаскивания, в класс TControl введено дополнительное свойство:

Значение этого свойства для перетаскивания равно dkDrag, а для причаливания - dkDock (и у причаливаемого, и у принимающего компонентов).

Количество установленных на форме причаливаемых компонентов (то есть компонентов, для которых выполняются условия DragKind=dkDock и DockSite=False) определяется свойством DockClientCount, а их список хранится в индексированном свойстве DockClients.

Для реализации причаливания в класс TControl введены некоторые свойства и события, которые перечислены ниже.

Это свойство разрешает (True) или запрещает (False) оконному компоненту менять свои размеры автоматически в зависимости от количества и размеров содержащихся в нем дочерних компонентов.

Это свойство определяет класс окна, в которое будет погружен дочерний элемент вне границ оконного элемента. Неоконные компоненты могут не только причаливаться к оконным компонентам, но и покидать их. После «отчаливания» от компонента неоконные элементы автоматически оказываются в окне, тип которого содержит свойство FloatingDockSiteClass.

По умолчанию это окно имеет уменьшенный по высоте заголовок и системную кнопку закрытия.

В этом свойстве можно установить (или получить) ориентацию, которую будет иметь «причаливаемый» компонент в окне родителя:

doNoOrient - сохраняется исходная ориентация перемещаемого компонента;

doHorizontal - компонент будет иметь горизонтальную ориентацию;

doVertical - компонент будет иметь вертикальную ориентацию.

С помощью этого свойства можно получить ширину последнего перемещенного компонента, расположившегося горизонтально.

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

Эти свойства определяют соответственно высоту и ширину последнего «отчалившего» компонента.

Это свойство с помощью объекта класса TSizeConstraints накладывает ограничения на возможные размеры причаливаемого компонента (задает максимальные и минимальные величины для высоты и ширины).

Следующие события аналогичны событиям OnDragDrop и OnDragOver

Обработчик этого события должен сообщить объекту TDragDockObject, который автоматически связывается с причаливаемым объектом, некоторую дополнительную информацию (размеры, которые будет иметь этот объект, окажется ли он в «плавающем» окне и т. п.).

Осталось еще одно событие:

Это событие возникает при «отчаливании» неоконного компонента.

Обработчик этого события должен поместить в свойство Allow значение True, если компонент Client может покинуть границы своего владельца Sender.

Все указанные события обрабатываются автоматически, если оба компонента (клиент и сервер) содержат значение dmAutomatic в своем свойстве DragMode.

Чтобы познакомиться с технологией причаливания, поместите на пустую форму панель TPanel и кнопку TButton, установите для панели значение True в свойство DockSite, установите для обоих компонентов значение dkDock в свойстве DragKind и dmAutomatic в свойстве DragMode. После запуска программы перетащите кнопку на панель, а затем стащите ее обратно.

Соседние файлы в папке Delfi, лекции