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

Ето как да активирате влаченето и преоразмеряването на контролите (под формата на Delphi) с мишка, докато приложението работи.

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

След като поставите контрола (визуален компонент) върху формуляра, можете да коригирате неговата позиция, размер и други свойства на времето за проектиране. Има обаче ситуации, когато трябва да разрешите на потребител на приложението ви да премества контролите на формуляра и да променя техния размер по време на изпълнение.

За да активирате движение на потребител по време на изпълнение и преоразмеряване на контролите върху формуляр с мишка, три събития, свързани с мишка се нуждаят от специално боравене: OnMouseDown, OnMouseMove и OnMouseUp.

На теория, да кажем, че искате да дадете възможност на потребителя да движи (и оразмерява) управление на бутони с мишка по време на изпълнение. Първо, вие се справяте със събитието OnMouseDown, за да дадете възможност на потребителя да "вземе" бутона. След това събитието OnMouseMove трябва да препозиционира (премести, плъзне) бутона. И накрая, OnMouseUp трябва да завърши операцията за преместване.

instagram viewer

Плъзгане и оразмеряване на контролите на формулярите на практика

Първо, пуснете няколко контрола върху формуляр. Имайте CheckBox, за да активирате или деактивирате движението и преоразмеряването на контролите по време на изпълнение.

След това дефинирайте три процедури (в интерфейс раздел от декларацията за формуляра), която ще обработва събития на мишката, както е описано по-горе:

Тип
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; Бутон1.OnMouseMove: = ControlMouseMove; Button1.OnMouseUp: = ControlMouseUp; Edit1.OnMouseDown: = ControlMouseDown; Edit1.OnMouseMove: = ControlMouseMove; Edit1.OnMouseUp: = ControlMouseUp; Panel1.OnMouseDown: = ControlMouseDown; Panel1.OnMouseMove: = ControlMouseMove; Panel1.OnMouseUp: = ControlMouseUp; Бутон2.OnMouseDown: = ControlMouseDown; Бутон2.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: цяло число);конст
minWidth = 20; minHeight = 20; Var
newPos: TPoint; frmPoint: TPoint; започвамако inReposition тогавазапочвамс TWinControl (подател) правязапочвам
GetCursorPos (newPos); ако ssShift в изместване тогавазапочвам//resize
Screen. Курсор: = crSizeNWSE; frmPoint: = ScreenToClient (Мишка. CursorPos); ако frmPoint. X> minWidth тогава
Ширина: = frmPoint Х; ако frmPoint. Y> minHeight тогава
Височина: = frmPoint Y; крайоще//moveзапочвам
Screen. Курсор: = crSize; Вляво: = Ляво - стариPos. X + newPos. Х; Най-горе: = Най - старPos. Y + newPos. Y; oldPos: = newPos; край; край; край; край; (* ControlMouseMove *)

ControlMouseMove накратко: променете курсора на екрана, за да отразява операцията: ако е натиснат клавиша Shift, позволявайте преоразмеряване на контрола или просто преместете контрола в ново положение (там, където отива мишката). Забележка: minWidth и minHeight константи осигуряват вид ограничение на размера (минимална контролна ширина и височина).

Когато бутонът на мишката бъде освободен, влаченето или преоразмеряването приключи:

процедураTForm1.ControlMouseUp ( Подател: TObject; Бутон: TMouseButton; Shift: TShiftState; X, Y: цяло число);започвамако inReposition тогавазапочвам
Screen. Курсор: = crDefault; ReleaseCapture; inReposition: = Грешно; край; край; (* ControlMouseUp *)

ControlMouseUp накратко: когато потребителят приключи с движение (или промяна на размера на контрола), освободете заснемането на мишката (за да активирате обработката на щракване по подразбиране) и маркирайте, че препозиционирането е завършено.

И това го прави! Изтеглете примерното приложение и опитайте сами.

Забележка: Друг начин за преместване на контролите по време на изпълнение е използването на Delphi Дръпни и пусни свързани свойства и методи (DragMode, OnDragDrop, DragOver, BeginDrag и т.н.). Плъзгането и пускането може да се използва, за да позволи на потребителите да влачат елементи от едно управление - например полето със списък или изглед на дърво - в друго.

Как да запомните контролната позиция и размер?

Ако позволите на потребителя да премества и оразмерява контролите на формуляра, трябва да се уверите, че разположението на контрола е по някакъв начин запазва се, когато формулярът е затворен и че позицията на всеки контролен елемент се възстановява при създаването / зареждането на формата. Ето как да съхранявате свойствата Left, Top, Width и Height за всеки контрол върху формуляр, в an INI файл.

Какво ще кажете за 8 размера дръжки?

Когато позволите на потребителя да движи и преоразмерява контролите във формуляра Delphi, по време на изпълнение с помощта на мишката, за да напълно имитиращи средата за проектиране и време, трябва да добавите осем размера дръжки към контролния елемент преоразмерява.

instagram story viewer