Лабораторная работа №6

"Буксировка экранных объектов"

Буксировка экранных объектов позволяет эффективно переносить информацию между отдельными компонентами с помощью мыши. Разберем механизм буксировки на примере переноса строк из одного списка в другой.

Создайте новый проект, содержащий два компонента ListBox1 и ListBox2 с надписями сверху. Заполните первый список названиями дней недели (см рис.1.). Следующие шаги содержат примеры обработки событий четырех этапов буксировки.

Этап 1. Начало буксировки. Возникает при перемещении мыши с нажатой левой кнопкой. Установите свойство DragMode компонента ListBox1 в dmAutomatic, т. е. компонент берет на себя обработку этого этапа. Если установить значение этого свойства в dmManual, то программисту придется вручную обнаруживать начало буксировки (например, по событию MouseDown) и запускать ее механизм (метод BeginDrag). В момент начала буксировки компонент генерирует событие OnStartDrag. Запишите в обработчик этого события строку Color:=clRed;

Этап 2. Буксировка объекта над компонентами. Во время буксировки при перемещении курсора мыши над компонентами они генерируют событие OnDragOver. Выделим следующие параметры обработчика этого события: Source - объект — источник буксировки, X, Y - координаты курсора, Accept - булевская переменная, определяющая, принимает или нет данный компонент буксируемую информацию. Запишите в этот обработчик для компонента ListBox2 строки, разрешающую буксировку только из ListBox1:

Accept := Source=ListBox1;

НЕ нашли? Не то? Что вы ищете?

Этап 3. Сброс информации на целевом компоненте. Во время буксировки при отпускании кнопки мыши над целевым компонентом он генерируют событие OnDragDrop. В обработчике именно этого события должно быть произведено то действие, которому соответствует буксировка. В нашем случае это перенос строки из левого списка в правый. Запишите в обработчик события ListBox2.OnDragDrop оператор, добавляющий в список строк ListBox2 выделенную строку из ListBox1:

with ListBox1 do ListBox2.Items. Add(Items[ItemIndex]);

Этап 4. Завершение буксировки. Компонент - источник буксировки в момент отпускания генерирует событие OnEndDrag, параметр Target которого соответствует другому, целевому компоненту (в нашем случае это ListBox2). В обработчике этого события запишите оператор, удаляющий из первого списка выбранную строку и оператор, изменяющий цвет формы:

if Target = ListBox2 then with ListBox1 do Items. Delete(ItemIndex);

Color := clYellow;

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

Задание на самостоятельную работу.

Создайте проект, содержащий 2 списка ListBox, компонент Edit, компонент Panel, две кнопки и четыре надписи (см рис.2). Данный проект должен обеспечивать работу следующих функций:

·  перенос строк из Edit в оба списка;

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

При множественном выборе переносить все выбранные строки.

Перенос из Edit с нажатой клавишей <Ctrl> осуществляет копирование (вид курсора – crCross).

Рекомендация:

Обработку начала буксировки из Edit1 выполнить вручную, т. е. установить Edit1.DragMode=dmManual и в обработчик Edit1.OnMouseDown записать нечто вроде (это не всё):

if (Button=mbLeft) and (Edit1.Text<>'') then Edit1.BeginDrag(False);

Слайд 1