Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методическое пособие для самостоятельных работ.doc
Скачиваний:
21
Добавлен:
16.11.2019
Размер:
2.89 Mб
Скачать

2.6.4. Фокус ввода

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

procedure SetFocus.

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

property Focused: Boolean;

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

property CanFocus: Boolean;

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

property TabStop: Boolean;

значение True. Порядок выбора элемента определяется свойством

property TabOrder: Integer;

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

procedure GetTabOrderList(List: TList) ;

можно получить список всех дочерних элементов, выбираемых клавишей Tab.

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

В Delphi 6 введен специальный механизм действий, дающий удобное средство централизованной реакции программы на те или иные действия пользователя. Для реализации действий в страницу Standard палитры компонентов включен специальный компонент TActionList, а в объект TComponent - свойство Action:

property Action: TBasicAction;

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

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

2.8. Иинтерфейс Drag&Drop

Операционная система Windows широко использует специальный прием связывания программ с данными, который называется Drag&Drop (перетащи и отпусти). Такой прием в Проводнике Windows используется для копирования или перемещения файлов, а также для запуска обрабатывающей программы. Если, например, файл с расширением doc “перетащить” на пиктограмму WinWord, автоматически запустится текстовый редактор Word for Windows и в его окне появится текст из этого файла.

В Delphi реализован собственный интерфейс Drag&Drop, позволяющий компонентам обмениваться данными путем “перетаскивания” их мышью. Этот интерфейс определяется двумя свойствами и тремя событиями, доступными каждому видимому компоненту. В Delphi б события могут дублировать сложные свойства и наоборот. Сложными в данном случае называются свойства, ссылающиеся на внутренние объекты. Свойство

TDragMode = (dmManual, dmAutomatic);

property DragMode: TDragMode;

определяет, как будет выполняться весь комплекс действий, связанных c Drag&Drop: dmManual - вручную (программой); dmAutomatic -автоматически (свойствами и методами компонентов). Значение dmManual означает, что все необходимые для обслуживания интерфейса события генерируются программой, dmAutomatic - события инициируются свойствами и методами компонентов. Во всех случаях программист должен написать обработчики этих событий. Свойство

property DragCursor: TCursor;

определяет вид указателя мыши в момент, когда над компонентом “протаскиваются данные”. Если компонент готов принять данные, он устанавливает в это свойство значение crDrag l3, в противном случае - crNoDrag 0. Установка этих свойств осуществляется автоматически, если DragMode = dmAutomatic. Событие

TDragState = (dsDragEnter, dsDragLeave, dsDragMove) ;

TDragOverEvent = procedure(Sender, Source: TObject;

X, Y: Integer; State: TDragState; var Accept: Boolean) of object;

property OnDragOver: TDragOverEvent;

возникает в момент перемещения указателя мыши “с грузом” над компонентом. Здесь Sender - компонент, который возбудил событие (обычно это Self - сам компонент-получатель; при ручном управлении механизмом Drag&Drop это может быть не так); Source - компонент-отправитель “груза”; X, Y - текущие координаты указателя мыши в пикселях клиентской области компонента; State - состояние указателя (dsDragEnter - только что появился на компонентом; dsDragLeave -только что покинул компонент или была отпущена кнопка мыши; dsDragMove - перемещается над компонентом). В параметре Accept обработчик сообщает, готов ли компонент принять данные (True - готов). Событие

TDragDropEvent = procedure(Sender, Source: TObject;

X, Y: Integer) of object;

property OnDragDrop: TDragDropEvent;

означает, что пользователь “бросил” данные на компонент. Параметры обработчика совпадают по назначению с одноименными параметрами OnDragOver.

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

TEndDragEveht = procedure(Sender, Target: TObject;

X, Y: Integer) of objects;

property OnEndDrag: TEndDragEvent;

где Sender - отправитель данных; Target - получатель данных или nil, если никто не принял “посылку”; X, Y - координаты мыши в момент отпускания левой кнопки.

Для ручного (программного) управления механизмом Drag&Drop используются следующие методы, доступные любому потомку TControl:

Методы

Описание

procedure BeginDrag (Immediate: Boolean);

Используется источником для инициализации процесса Drag&Drop. Если Immediate=True, процесс начинается немедленно, в противном случае - после смещения указателя мыши на 5 пикселей в любом направлении

procedure DragDrop (Source: TObject; X, Y: Integer);

Вызывает обработчик события OnDragDrop

procedure EndDrag(Drop: Boolean);

Вызывает обработчик события OnEndDrag и в параметре Drop сообщает о том, были ли приняты данные