Технология Drag&Dock

События от мыши.

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

OnMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) - Реакция на нажатие кнопки мыши.

OnMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) - Реакция на отпускание кнопки мыши.

OnMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer) - Движение кнопки мыши над объектом.

OnClick (Sender: TObject) – нажатие левой кнопки мыши над объектом.

OnDblClick (Sender: TObject) – двойное нажатие кнопки мыши.

Для этих событий от объекта передаются следующие параметры:

Sender – в каком компоненте произошло событие;

TMouseButton – определяет одну из кнопок мыши и имеет следующие значения: левая (mbLeft), правая (mbRight), средняя (mbMiddle);

TShiftState – признаки уточняющие возникновение события со следующими значениями: нажата клавиша Shift (ssShift), клавиша Alt(ssAlt), клавиша Ctrl (ssCtrl), левая кнопка мыши(ssLeft), правая кнопка мыши(ssRight), средняя(ssMiddle), одновременно левая и правая кнопки(ssDouble);

X и Y определяют координаты мыши над объектом.

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

If Button=mbLeft…

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

If ssRight in Shift …

События от клавиатуры.

События от клавиатуры определены для компонентов – потомков типа TControl, в частности для формы.

OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState) и OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState)– перехватывают нажатие большинства клавиш на клавиатуре.

OnKeyPress (Sender: TObject; var Key: Char) – только нажатие алфавитно-цифровых клавиш.

Параметры, которые передаются при этом:

Key – виртуальный код клавиши или ASCII-символ для KeyPress (т.е. учитывая алфавитную раскладку и нажатие клавиши Shift).

Shift – учитывается нажатие клавиши Shift.

Виртуальный код совпадает с кодом, возвращаемым функцией Ord(x:char). Посмотреть все коды можно в файле SORCE\RTL\WIN\WINDOWS.PAS в каталоге размещения Delphi.

Буксировка компонентов в окне приложения.

В ряде случаев необходимо переместить компонент по форме. Первое условие – у перетаскиваемого компонента свойство AutoSize = True. Есть несколько методов воплотить перемещение объекта.

Технология Drag&Dock.

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

Для формы, с которой вы будете брать компонент, установите свойство DockSite=true, это позволит брать компоненты из формы.

Для компонентов, которые будут перемещать, устанавливаем DragKind=dkDock и DragMode=dmAutomatic. (Это нужно сделать, по крайней мере, для двух компонентов, иначе метод не сработает). Затем в начале работы приложения для каждого компонента, которые будут перемещаться, нужно выполнить методы ManualFloat и ManualDock. Например:

Paz[i,j].ManualFloat(Rect(Left + Paz[i,j].Left , Top + Paz[i,j].Top, Left + Paz[i,j].Left + w, Top +Paz[i,j].Top+h)); // Переводит кусок в плавающий режим

Paz[i,j].ManualDock(Form1,nil,alleft); // Разрешить извлечь кусок с формы

Теперь вы можете перетаскивать контур объекта мышью, а сам объект переместиться только по окончанию буксировки. Если хотите, чтобы объект в конце буксировки размещался над остальными компонентами, то в обработчик события OnEndDock внесите строчку (Sender as TControl).BringToFront;