Технология 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;