Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_Delphi_10.doc
Скачиваний:
10
Добавлен:
23.12.2018
Размер:
1.5 Mб
Скачать

17. Буксировка экранных объектов. Использование технологии drag & drop

Цель работы: изучение техники буксировки.

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

Дополнительная информация:

С программной точки зрения операция буксировки - это цепочка событий, инициируемых пользователем, а обрабатываемых формой и ее компонентами:

- начало буксировки (BeginDrag);

- буксировка объекта над компонентами (DragOver);

- оставление объекта на целевом компоненте (DragDrop);

- завершение буксировки (EndDrag).

Начало буксировки

Пользователь нажимает левую кнопку мыши на визуальном компоненте и, удерживая се нажатой, начинает перемешать мышь. Визуальные компоненты умеют автоматически обнаруживать эту ситуацию и запускать операции буксировки. Для этого надо устано­вить в компоненте свойство Drag Mode в значение dmAutomatic. Обработчик события OnMouseDown должен проверить, какая кнопка нажата (должна быть нажата левая кнопка мыши) и что курсор не попадает на пустую область списка.

Если в метод BeginDrag установить значение False, то это указывает на то, что букси­ровка не должна начинаться, пока пользователь не сдвинет мышь на некоторое расстояние (по умолчанию на 5 пикселей).

Буксировка объекта над компонентами

Выбирая подходящее место назначения для объекта, пользова­тель перемещает мышь с нажатой кнопкой. Во время этого процесса программа генерирует в каждом компоненте, над которым оказыва­ется курсор мыши, событие OnDragOver. Обработчик этого собы­тия решает, примет ли компонент отбуксированный объект, если пользователь его оставит. Если компонент готов принять объект, обработчик должен возвратить True в булевском параметре Accept, который имеет событие OnDnigOver.

В метод обработки события OnDnigOver передаются информация о том, какой компонент начал буксировку (параметр Source),

текущие координаты курсора мыши (параметры х, у); параметр Slate позволяет узнать, движется курсор мыши внутрь компонента или наружу.

Оставление объекта на целевом компоненте

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

Завершение буксировки

Сигнал о завершении буксировки получает не только тот компо­нент, в котором был оставлен объект, но и тот, из которого объект был взят. Для этого компоненту-источнику посылается событие OnEndDrag. Причем в параметр Target, обработчику этого собы­тия, передается информация о целевом компоненте.

18. Создание и хранение шаблонов компонентов

Цель работы: знакомство с возможностями соз­дания и сохранения шаблонов компонентов; использование пара­метра Sender, операций is и as.

Задание: Создать шаблон на основе компонента Edit. Это долж­но быть окно редактирования, позволяющее вводить в него только целые числа (на ввод остальных символов не реагировать). При на­жатии после ввода числа на клавишу Enter передать фокус ввода следующему компоненту в последовательности табуляции (Z).

Дополнительная информация:

В процессе разработки различных приложений нередко исполь­зуются одинаковые формы, компоненты с одинаковыми настройка­ми свойств, обработчиками событий. Delphi предоставляет широкие возможности повторного использования разработанных кодов. Это:

- создание собственных шаблонов форм проектов и регистра­ция их в Repository (хранилище объектов, содержащее шаблоны форм, программных модулей и проектов, позволяет использовать копии хранящихся в нем форм и проектов (Сору), наследовать их (Inherit) и использовать сами формы и проекты (Use));

- создание шаблонов компонентов и размещение их в палитре компонентов;

- создание компонентов;

- занесение в Edit Code Templates фрагментов часто используе­мых кодовых блоков.

Параметр Sender указывает на источник события. Он не требу­ется, если пишется обработчик события для одного конкретного компонента, но если один обработчик применяется для нескольких компонентов, то Sender служит для распознавания источника собы­тия. Sender выступает как объект одного из производных от TObject типов.Если требуется распознать только тип объекта, то можно исполь­зовать операцию fa. If (Sender is TListBox) then ... проверяет, не яв­ляется ли источник события компонентом типа TListBox.

Если требуется распознать объект по имени или другому свойст­ву, используется операция as.

If (Sender as TControl).Name=’Edit1’ then...

Данный оператор проверяет, не является ли этот компонент ком­понентом с именем Editl. Можно было бы и проще If (Sender= Edit1) then...

Если надо применить к источнику события некоторый метод, используют, например, оператор вида If (Sender as TWinCon-trol)).ScaleBy(11,10); -увеличивает на 10% размер любого оконного компонента, в котором произошло обрабатываемое событие.

Параметр Key определяет нажатую в момент события клавишу клавиатуры. Это целое число и оно может быть изменено в обра­ботчике события (т.к. var key:Word).

Наиболее распространенные клавиши и их коды:

Клавиша

Дес. Число

Символическое имя

F1

112

VK_F1

Enter

13

VK_RETURN

Shift

16

VK_SHIFT

Ctrl

17

VK_CONTROL

Alt

18

VK_MENU

Esc

27

VK_ESCAPE

FindNextControl ищет и передает фокус следующему компонен­ту в последовательности табуляции.

Свойство формы ActiveControl, установленное в процессе про­ектирования, определяет, какой из компонентов будет в фокусе в начале выполнения приложения. Затем это свойство изменяется в зависимости от того, какой из компонентов оказывается в фокусе.

Важно правильно определить последовательность табуляции оконных элементов, т.е. это последовательность, в которой пере­ключается фокус с компонента на компонент, когда пользователь нажимает клавишу табуляции. Это важно, т.к. иногда удобнее рабо­тать не с мышкой, а с клавиатурой. Последовательность табуляции задается свойствами TabOrder компонентов (начиная с 0). Каждый управляющий элемент имеет уникальный номер TabOrder. Изменяя его. автоматически можно изменить и номера всех последующих компонентов.

Метод SetFocus позволяет программно переключать фокус. Если хотим передать конкретному компоненту фокус, то просто вызыва­ем для него метод. Например: Edit1.SetFocus.

Метод Find Next Control возвращает компонент, следующий в последовательности табуляции.

FindNextControl(Sender as TWinControl, true, true, false). SetFocus;

где Sender as TWinControl - следующий компонент;

первый булевский параметр True - GoForward - определяет на­правление поиска - вперед (False - предыдущий компонент);

второй булевский параметр True - CheckTabStop - просматрива­ются только те компоненты, в которых свойство TabStop установ­лено в True, иначе не принимается во внимание;

третий булевский параметр False - ChekParent - просматривают­ся все потомки компонента не только прямые, но и косвенные.

Если вставить этот же обработчик событий для кнопок в событие OnClick, то это обеспечит переход от кнопки к кнопке.

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

- выделить компонент;

- выполнить команду главного Menu - Component\Create Com­ponent Template - создать шаблон компонента;

- в открывшемся диалоговом окне задать имя компонента (оно будет появляться на ярлычке всплывающей подсказки - EditNum);

- и выпадающем списке в средней части окна можно выбрать страницу палитры компонентов или задать новую (она автоматически будет создана, например, NVL Template);

- можно изменить, пиктограмму данного компонента - кнопка Change... Пиктограмма должна быть изготовлена заранее. Это кар­тинка, хранящаяся в файле типа .bmp размером 24*24;

После нажатия на кнопку OK шаблон появится в библиотеке на созданной вами странице. Если теперь перенести наш шаблон на форму, то он появится в разработанном нами виде и с прописанны­ми обработчиками событий.

Но если разместить несколько аналогичных компонентов, то для каждого из них будут включены идентичные обработчики событий, что приведет к избыточности кода. Чтобы этого избежать, надо для каждого модуля оставить по одному обработчику событий, а для остальных аналогичных компонентов сделать ссылки на эти обра­ботчики.