Ниже описано, как включить перетаскивание и изменение размеров элементов управления (в форме Delphi) с помощью мыши во время работы приложения.
Редактор форм во время выполнения
Поместив элемент управления (визуальный компонент) в форму, вы можете настроить его положение, размер и другие свойства времени разработки. Однако существуют ситуации, когда вы должны разрешить пользователю вашего приложения перемещать элементы управления формы и изменять их размер во время выполнения.
Чтобы включить перемещение пользователя во время выполнения и изменение размеров элементов управления на форме с помощью мыши, три события, связанные с мышью нужна специальная обработка: OnMouseDown, OnMouseMove и OnMouseUp.
Теоретически, допустим, вы хотите, чтобы пользователь мог перемещать (и изменять размеры) кнопочный элемент управления с помощью мыши во время выполнения. Во-первых, вы обрабатываете событие OnMouseDown, чтобы позволить пользователю «схватить» кнопку. Затем событие OnMouseMove должно переместить (переместить, перетащить) кнопку. Наконец, OnMouseUp должен завершить операцию перемещения.
Перетаскивание и изменение размеров элементов управления на практике
Во-первых, добавьте несколько элементов управления на форму. Установите флажок для включения или отключения перемещения и изменения размеров элементов управления во время выполнения.
Затем определите три процедуры (в интерфейс раздел объявления формы), который будет обрабатывать события мыши, как описано выше:
тип TForm1 = учебный класс(TForm)... процедура ControlMouseDown (Отправитель: TObject; Кнопка: TMouseButton; Shift: TShiftState; X, Y: целое число); процедура ControlMouseMove (Отправитель: TObject; Shift: TShiftState; X, Y: целое число); процедура ControlMouseUp (Отправитель: TObject; Кнопка: TMouseButton; Shift: TShiftState; X, Y: целое число); частный inReposition: логическое значение; oldPos: TPoint;
Примечание: две переменные уровня формы требуются для отметки, если происходит перемещение управления (inReposition) и хранить контрольные старые позиции (OldPos).
В событии OnLoad формы назначьте процедуры обработки событий мыши соответствующим событиям (для тех элементов управления, которые вы хотите перетаскивать / изменять размер):
процедура TForm1.FormCreate (Отправитель: TObject); начать Button1.OnMouseDown: = ControlMouseDown; Button1.OnMouseMove: = ControlMouseMove; Button1.OnMouseUp: = ControlMouseUp; Edit1.OnMouseDown: = ControlMouseDown; Edit1.OnMouseMove: = ControlMouseMove; Edit1.OnMouseUp: = ControlMouseUp; Panel1.OnMouseDown: = ControlMouseDown; Panel1.OnMouseMove: = ControlMouseMove; Panel1.OnMouseUp: = ControlMouseUp; Button2.OnMouseDown: = ControlMouseDown; Button2.OnMouseMove: = ControlMouseMove; Button2.OnMouseUp: = ControlMouseUp; конец; (* FormCreate *)
Примечание. Приведенный выше код позволяет изменять положение кнопок Button1, Edit1, Panel1 и Button2 во время выполнения.
Наконец, вот волшебный код:
процедураTForm1.ControlMouseDown ( Отправитель: TObject; Кнопка: TMouseButton; Shift: TShiftState; X, Y: целое число);начатьесли (ChkPositionRunTime. Проверено) И (Sender является TWinControl) тогданачать inReposition: = True; SetCapture (TWinControl (Sender) .Handle); GetCursorPos (oldPos); конец; конец; (* ControlMouseDown *)
ControlMouseDown вкратце: если пользователь нажимает кнопку мыши над элементом управления, если во время выполнения включена репозиция (флажок chkPositionRunTime Проверено), а элемент управления, получивший указатель мыши, даже получен из TWinControl, отметьте, что перемещение элемента управления происходит (inReposition: = True) и убедитесь, что вся обработка мыши перехвачена для элемента управления - чтобы не происходили события «щелчка» по умолчанию обработанный.
процедураTForm1.ControlMouseMove ( Отправитель: TObject; Shift: TShiftState; X, Y: целое число);Const minWidth = 20; minHeight = 20; вар newPos: TPoint; frmPoint: TPoint; начатьесли inReposition тогданачатьс TWinControl (Отправитель) делатьначать GetCursorPos (newPos); если ssShift в сдвиг тогданачать//resize Экран. Курсор: = crSizeNWSE; frmPoint: = ScreenToClient (мышь. CursorPos); если frmPoint. X> minWidth тогда Ширина: = frmPoint. ИКС; если frmPoint. Y> minHeight тогда Высота: = frmPoint. Y; конецеще//moveначать Экран. Курсор: = crSize; Слева: = Слева - старые посты. X + newPos. ИКС; Top: = Top - oldPos. Y + newPos. Y; oldPos: = newPos; конец; конец; конец; конец; (* ControlMouseMove *)
ControlMouseMove вкратце: измените курсор экрана, чтобы отразить операцию: если нажата клавиша Shift, разрешите изменение размера элемента управления или просто переместите элемент управления в новое положение (куда движется мышь). Замечания: MinWidth и MinHeight константы обеспечивают своего рода ограничение размера (минимальная ширина и высота элемента управления).
Когда кнопка мыши отпущена, перетаскивание или изменение размера завершено:
процедураTForm1.ControlMouseUp ( Отправитель: TObject; Кнопка: TMouseButton; Shift: TShiftState; X, Y: целое число);начатьесли inReposition тогданачать Экран. Курсор: = crDefault; ReleaseCapture; inReposition: = False; конец; конец; (* ControlMouseUp *)
ControlMouseUp вкратце: когда пользователь закончил перемещение (или изменил размеры элемента управления), отпустите захват мыши (чтобы включить обработку щелчков по умолчанию) и отметьте, что репозиция завершена.
И это делает это! Загрузите образец приложения и попробуйте сами.
Примечание. Другой способ перемещения элементов управления во время выполнения - использование Delphi's. перетащить связанные свойства и методы (DragMode, OnDragDrop, DragOver, BeginDrag и т. д.). Перетаскивание можно использовать, чтобы пользователи могли перетаскивать элементы из одного элемента управления, например из списка или дерева, в другой.
Как запомнить контрольную позицию и размер?
Если вы разрешаете пользователю перемещать и изменять размеры элементов управления формы, вы должны убедиться, что размещение элемента управления каким-то образом сохраняется при закрытии формы и восстановлении позиции каждого элемента управления при создании / загрузке формы. Вот как хранить свойства Left, Top, Width и Height для каждого элемента управления в форме в INI файл.
Как насчет 8 размер ручки?
Когда вы позволяете пользователю перемещать и изменять размеры элементов управления в форме Delphi, во время выполнения с помощью мыши, чтобы полностью имитируя среду разработки, вы должны добавить восемь элементов управления размером к элементу управления изменен.