- •Основы программирования
- •Введение
- •Основы delphi
- •Общая технология программирования
- •Язык программирования
- •Объектно-ориентированное программирование
- •Визуальное программирование
- •Событийно управляемое программирование
- •Windows-приложение
- •Среда программирования
- •Первоначальные сведения о проекте приложения
- •Встроенный отладчик
- •Использование встроенных классов
- •Иерархия классов
- •Использование палитры компонентов и инспектора объектов
- •Использование графики
- •Основные инструменты
- •Основные характеристики шрифтов
- •Графические данные и палитра
- •Некоторые общие свойства компонентов
- •Сохранение проекта
- •Построение простейшего проекта
- •Понятие исключительной ситуации
- •Введение в object pascal
- •Структура приложения
- •Структура программы-проекта
- •Структура модуля
- •Пример 1
- •Описания программных элементов
- •Программные элементы и адреса памяти
- •Области видимости
- •Правила записи имен
- •Время жизни идентификаторов
- •Использование локальных переменных в примере 1
- •Использование глобальных переменных в примере 1
- •Простые типы
- •Целые типы
- •Целые типы
- •Некоторые операции с целым типом
- •Символьные типы
- •Логические типы
- •Тип перечень
- •Интервальный тип
- •Вещественный тип
- •Вещественные типы
- •Некоторые операции с вещественным типом
- •Тип дата-время
- •Выражения
- •Константы
- •Типизированные константы.
- •Переменные
- •Операции
- •Унарная операция not (отрицание)
- •Логические операции and, or, xor
- •Функции
- •Порядок вычисления выражений
- •Виды операторов
- •Простые операторы
- •Составной оператор
- •Операторы условного перехода
- •Оператор if
- •Пример 2
- •Оператор case
- •Пример 3
- •Использование enter в примере 3
- •Операторы цикла
- •Оператор цикла for
- •Пример 4
- •Оператор цикла while
- •Пример 5
- •Оператор цикла repeat
- •Пример 6
- •Использование процедур break и continue
- •Пример 7
- •Массивы
- •Статические массивы
- •Динамические массивы
- •Пример 8
- •Пример 9
- •Записи (объединения)
- •Оператор with
- •Пример 10
- •Совместимость и преобразование типов данных
- •Идентичность типов
- •Совместимость типов
- •Совместимость по присваиванию
- •Преобразование типов
- •Операторы обработки исключительных ситуаций
- •Пример 11
- •Множества
- •Операции над множествами
- •Пример 12
- •Вариантный тип данных
- •Процедуры и функции
- •Процедура
- •Функция
- •Рекурсия
- •Формальные и фактические параметры
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Параметры без типа
- •Массивы открытого типа
- •Парамеры по умолчанию
- •Процедура exit
- •Директивы подпрограммы
- •Соглашения по передаче данных
- •Директива forward
- •Директива external
- •Директива assembler
- •Перегруженные подпрограммы
- •Пример 13
- •Инкапсуляция
- •Класс как объектный тип
- •Наследование
- •Области видимости
- •Операции is и as
- •Виды методов
- •Методы virtual и полиморфизм
- •Методы dynamic
- •Методы message
- •Методы abstract
- •Методы override
- •Методы class
- •Пример 14
- •Динамическое создание компонентов
- •Использование класса со счетчиком объектов
- •Отслеживание разрушения объектов
- •События
- •Указатели на методы
- •Пример 15
- •Типы ссылки на класс
- •Свойства
- •Свойства simple
- •Свойства enumerated
- •Свойства set
- •Свойства object
- •Свойства array
- •Задание начальных значений свойствам
- •Пример 16
- •Файловые типы
- •Текстовые файлы
- •Типизированные файлы
- •Файлы без типа
- •Дополнительные процедуры и функции
- •Пример 17
- •Компонент tmainmenu
- •Указатели
- •Пример 18
- •Динамические структуры данных
- •Однонаправленные списки
- •Двунаправленные списки
- •Стеки, очереди
- •Бинарные деревья
- •Пример 19
- •Процедурный тип
- •Программные единицы dll
- •Пример 20
- •Технологии программирования
- •Потоки данных
- •Пример 21
- •Пример 22
- •Интерфейс drag and drop
- •Пример 23
- •Технология drag and dock
- •Пример 24
- •Использование функций windows api при работе с файлами
- •Пример 25
- •Использование отображаемых файлов
- •Пример 26
- •Программные потоки
- •Приоритеты потоков
- •Класс tthread
- •Пример 27
- •Использование блокировки в примере 27
- •Многопоточное приложение в примере 28
- •Проблемы синхронизации потоков
- •Список используемых в примерах компонентов
- •Список используемых компонентов и других классов
- •Библиографический список
- •Оглавление
Интерфейс drag and drop
Интерфейс Drag and Drop обеспечивает один из механизмов взаимодействия двух элементов управления во время выполнения приложения. При этом могут выполняться различные операции переноса и приема данных или перемещения элемента, например, на форме. Для того, чтобы этот механизм заработал, требуется настроить соответствующим образом с помощью обработчиков событий и инспектора объектов некоторые заданные элементы управления. В заданной паре один должен быть источником (Source), другой - приемником (Target).
Пользователь помещает указатель мыши на нужный элемент, нажимает левую кнопку мыши и, не отпуская ее, начинает перемещение курсора ко вторуму элементу. При достижении этого элемента пользователь отпускает кнопку мыши. В этот момент выполняются предусмотренные разработчиком действия. Среди этих действий могут быть передача текста, значений свойств, шрифта, простое перемещение с места на место и т.д. Таким образом, Drag and Drop – средство связывания двух компонентов при помощи указаталя мыши.
Любой элемент управления является изначально источником в механизме Drag and Drop. Его поведение на начальном этапе настраивается с помощью свойства
Property DragMode: TDragMode, где
Type TDragMode = (dmManual, dmAutomatic);
Значение dmAutomatic обеспечивает автоматическую реакцию компонента на нажатие левой кнопки мыши – механизм перетаскивания включается самостоятельно. Значение dmManual (установлено по умолчанию) требует от разработчика обеспечить включение специфических действий при перетаскивании.
Для инициализации переноса в источнике используется метод BeginDrag (если не включено dmAutomatic), который можно включить, например, в обработчике OnMouseDown. Приемником может стать любой компонент, для которого создан обработчик события OnDragOver. Этот обработчик вызывается при достижении курсором мыши компонента-приемника. Окончание переноса фиксируется работой обработчика OnDragDrop, в котором можно выполнить некоторые действия в приемнике. Определенные действия предусмотрены и в источнике с помощью обработчика OnEndDrag, после того как он получит сообщение об окончании операции переноса. Следует отметить, что не любые действия возможны к реализации.
Пример 23
Рассмотрим пример по использованию Drag and Drop. В программе ниже представлены почти все выше указанные виды обработчиков событий по реализации данного интерфейса.
unit Prim23;
interface
uses Windows, Messages, SysUtils, Variants,
Classes,Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Panel1: TPanel;
Panel2: TPanel;
Button1: TButton;
BitBtn1: TBitBtn;
procedure Edit1MouseDown(Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure Edit2DragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState;
var Accept: Boolean);
procedure Edit2DragDrop(Sender, Source: TObject;
X, Y: Integer);
procedure Edit1EndDrag(Sender, Target: TObject;
X, Y: Integer);
procedure FormDragOver(Sender, Source: TObject;
X, Y: Integer;State: TDragState;
var Accept: Boolean);
procedure FormDragDrop(Sender, Source: TObject;
X, Y: Integer);
procedure Panel1DragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState;
var Accept: Boolean);
procedure Panel1DragDrop(Sender, Source: TObject;
X, Y: Integer);
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Edit1MouseDown(Sender: TObject;
Button: TMouseButton;Shift: TShiftState;
X, Y: Integer);
begin
if Button=mbLeft then TEdit(Sender).BeginDrag(true);
end;
procedure TForm1.Edit2DragOver(Sender,Source: TObject;
X, Y: Integer; State: TDragState;
var Accept: Boolean);
begin
if Source is TEdit then Accept:=true
else Accept:=false;
end;
procedure TForm1.Edit2DragDrop(Sender,Source: TObject;
X, Y: Integer);
begin
TEdit(Sender).Text:=TEdit(Source).Text;
TEdit(Sender).SetFocus;
TEdit(Sender).SelectAll;
end;
procedure TForm1.Edit1EndDrag(Sender, Target: TObject;
X, Y: Integer);
begin
if Assigned(Target) then TEdit(Sender).Text:=
'Текст перенесен в '+TEdit(Target).Name;
end;
procedure TForm1.FormDragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState;
var Accept: Boolean);
begin
if (Source.ClassName='TPanel') or
(Source.ClassName='TButton') then Accept:=true
else Accept:=false;
end;
procedure TForm1.FormDragDrop(Sender, Source: TObject;
X, Y: Integer);
begin
TControl(Source).Left:=x;
TControl(Source).Top:=y;
end;
procedure TForm1.Panel1DragOver(Sender,Source:
TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if Source is TButton then Accept:=true
else Accept:=false;
end;
procedure TForm1.Panel1DragDrop(Sender, Source:
TObject; X, Y: Integer);
begin
if Source is TButton then begin
TButton(Source).Left:=(Sender as TPanel).Left+x;
TButton(Source).Top:=(Sender as TPanel).Top+y;
if Source is TBitBtn then begin
TBitBtn(Source).Width:=147;
TBitBtn(Source).Caption:='На форму нельзя';
if Application.MessageBox(PChar('Выход'),
PChar('Выбор варианта'),MB_DEFBUTTON1 +
MB_ICONEXCLAMATION + MB_OKCANCEL) = IDOK
then close;
end;
end;
end;
end.
В обработчике Panel1DragDrop как и в Panel1DragOver учитывается, что TBitBtn является вариантом TButton. Если рассматривать форму, то все представленные на ней элементы являются наследниками класса TControl, поэтому в обработчике FormDragDrop не конкретизируются разрешенные к перемещению компоненты. При преобразовании типов объектов использовались две конструкции, например, TButton(Source) или Source as TButton что по результату означает одно и то же. На рис. 51 представлена форма данного примера.
Рис. 51 Форма примера 23.
Для элементов Edit1, Edit2 и Panel1 (“приемник”) установлено значение DragMode = dmManual, для остальных элементов DragMode = dmAutomatic. Вариант выполнения переноса Drag and Drop представлен на рис 52. Можно выделить изменение “поведения” кнопки BitBtn1. Она потеряла заданную функцию Close. Для выхода из программы (если не пользоваться стандартным способом закрытия окна) предусмотрен специальный диалог, вызываемый при перемещении данной кнопки.
Рис. 52 Вариант решения примера 23.
