- •Введение Среда Delphi и ее компоненты
- •Компонентный подход
- •1. Разработка приложения с использованием компонентов edit, label и button
- •2. Разработка консольного приложения
- •3. Разработка приложения с использованием окон ввода-вывода текста
- •4. Использование компонента stringgrid для обработки массивов
- •5. Разработка приложения с использованием компонента memo при обработке текстовых файлов
- •6. Упорядочение массивов. Обработка одномерных динамических массивов
- •7. Обработка многомерных динамических массивов
- •8. Создание и использование типизированных файлов, состоящих из записей
- •9. Создание класса в отдельном модуле
- •10. Создание динамической библиотеки и ее использование в программе
- •11. Создание движущегося обьекта на фоне
- •12. Представление данных при помощи графиков
- •13. Использование в программе меню
- •14. Управление программой с помощью компонентов scrollbar, trackbar, radiobutton, checkbox
- •15. Создание многостраничного приложения
- •Исходные данные
- •16. Управление программой с помощью компонентов закладки dialogs
- •17. Буксировка экранных объектов. Использование технологии drag & drop
- •18. Создание и хранение шаблонов компонентов
- •19. Создание динамических структур данных типа список
- •20. Создание и использование базы данных
- •Исходные данные
- •Литература
- •Содержание
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 Component Template - создать шаблон компонента;
- в открывшемся диалоговом окне задать имя компонента (оно будет появляться на ярлычке всплывающей подсказки - EditNum);
- и выпадающем списке в средней части окна можно выбрать страницу палитры компонентов или задать новую (она автоматически будет создана, например, NVL Template);
- можно изменить, пиктограмму данного компонента - кнопка Change... Пиктограмма должна быть изготовлена заранее. Это картинка, хранящаяся в файле типа .bmp размером 24*24;
После нажатия на кнопку OK шаблон появится в библиотеке на созданной вами странице. Если теперь перенести наш шаблон на форму, то он появится в разработанном нами виде и с прописанными обработчиками событий.
Но если разместить несколько аналогичных компонентов, то для каждого из них будут включены идентичные обработчики событий, что приведет к избыточности кода. Чтобы этого избежать, надо для каждого модуля оставить по одному обработчику событий, а для остальных аналогичных компонентов сделать ссылки на эти обработчики.