Перемещение и изменение размеров элементов управления во время выполнения

Ниже описано, как включить перетаскивание и изменение размеров элементов управления (в форме Delphi) с помощью мыши во время работы приложения.

Редактор форм во время выполнения

Поместив элемент управления (визуальный компонент) в форму, вы можете настроить его положение, размер и другие свойства времени разработки. Однако существуют ситуации, когда вы должны разрешить пользователю вашего приложения перемещать элементы управления формы и изменять их размер во время выполнения.

Чтобы включить перемещение пользователя во время выполнения и изменение размеров элементов управления на форме с помощью мыши, три события, связанные с мышью нужна специальная обработка: OnMouseDown, OnMouseMove и OnMouseUp.

Теоретически, допустим, вы хотите, чтобы пользователь мог перемещать (и изменять размеры) кнопочный элемент управления с помощью мыши во время выполнения. Во-первых, вы обрабатываете событие OnMouseDown, чтобы позволить пользователю «схватить» кнопку. Затем событие OnMouseMove должно переместить (переместить, перетащить) кнопку. Наконец, OnMouseUp должен завершить операцию перемещения.

instagram viewer

Перетаскивание и изменение размеров элементов управления на практике

Во-первых, добавьте несколько элементов управления на форму. Установите флажок для включения или отключения перемещения и изменения размеров элементов управления во время выполнения.

Затем определите три процедуры (в интерфейс раздел объявления формы), который будет обрабатывать события мыши, как описано выше:

тип
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, во время выполнения с помощью мыши, чтобы полностью имитируя среду разработки, вы должны добавить восемь элементов управления размером к элементу управления изменен.

instagram story viewer