Przenoszenie i zmiana rozmiaru kontrolek w czasie wykonywania

Oto jak włączyć przeciąganie i zmianę rozmiaru kontrolek (w formularzu Delphi) za pomocą myszy, gdy aplikacja jest uruchomiona.

Edytor formularzy w czasie wykonywania

Po umieszczeniu formantu (komponentu wizualnego) w formularzu można dostosować jego położenie, rozmiar i inne właściwości w czasie projektowania. Są jednak sytuacje, w których użytkownik aplikacji musi zmienić położenie formantów formularza i zmienić ich rozmiar w czasie wykonywania.

Aby umożliwić ruch użytkownika w środowisku wykonawczym i zmianę rozmiaru formantów w formularzu za pomocą myszy, trzy zdarzenia związane z myszą wymagają specjalnej obsługi: OnMouseDown, OnMouseMove i OnMouseUp.

Teoretycznie powiedzmy, że chcesz umożliwić użytkownikowi przesuwanie (i zmianę rozmiaru) kontrolki przycisku za pomocą myszy w czasie wykonywania. Po pierwsze, obsługujesz zdarzenie OnMouseDown, aby umożliwić użytkownikowi „złapanie” przycisku. Następnie zdarzenie OnMouseMove powinno zmienić pozycję przycisku (przenieść, przeciągnąć). Na koniec OnMouseUp powinien zakończyć operację przenoszenia.

instagram viewer

Przeciąganie i zmiana rozmiaru formantów w praktyce

Po pierwsze, upuść kilka formantów na formularzu. Posiadaj CheckBox, aby włączyć lub wyłączyć przesuwanie i zmianę rozmiaru kontrolek w czasie wykonywania.

Następnie zdefiniuj trzy procedury (w berło sekcja deklaracji formularza), która będzie obsługiwać zdarzenia myszy, jak opisano powyżej:

rodzaj
TForm1 = klasa(TForm)... procedura ControlMouseDown (Sender: TObject; Przycisk: TMouseButton; Shift: TShiftState; X, Y: liczba całkowita); procedura ControlMouseMove (Sender: TObject; Shift: TShiftState; X, Y: liczba całkowita); procedura ControlMouseUp (Sender: TObject; Przycisk: TMouseButton; Shift: TShiftState; X, Y: liczba całkowita); prywatny
inReposition: boolean; oldPos: TPoint; 

Uwaga: Wymagane są dwie zmienne poziomu formularza, aby zaznaczyć, czy ma miejsce ruch kontrolny (inReposition) i do przechowywania kontroli starej pozycji (oldPos).

W zdarzeniu OnLoad formularza przypisz procedury obsługi zdarzeń myszy do odpowiednich zdarzeń (dla tych elementów sterujących, które chcesz przeciągać / zmieniać rozmiar):

procedura TForm1.FormCreate (Sender: TObject); zaczynać
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; koniec; (* FormCreate *)

Uwaga: powyższy kod umożliwia zmianę położenia Button1, Edit1, Panel1 i Button2 w czasie wykonywania.

Wreszcie, oto magiczny kod:

proceduraTForm1.ControlMouseDown ( Nadawca: TObject; Przycisk: TMouseButton; Shift: TShiftState; X, Y: liczba całkowita);zaczynaćgdyby (chkPositionRunTime. Sprawdzone) I
(Nadawca jest TWinControl) następniezaczynać
inReposition: = True; SetCapture (TWinControl (Sender). Uchwyt); GetCursorPos (oldPos); koniec; koniec; (* ControlMouseDown *)

ControlMouseDown w skrócie: gdy użytkownik naciska przycisk myszy nad kontrolką, jeśli zmiana położenia w czasie wykonywania jest włączona (pole wyboru chkPositionRunTime jest zaznaczone), a kontrola, która otrzymała mysz w dół, pochodzi nawet z TWinControl, zaznacz, że zmiana położenia kontroli ma miejsce (inReposition: = True) i upewnij się, że wszystkie operacje myszy zostały przechwycone dla formantu - aby zapobiec domyślnym zdarzeniom „kliknięcia” obrobiony.

proceduraTForm1.ControlMouseMove ( Nadawca: TObject; Shift: TShiftState; X, Y: liczba całkowita);const
minWidth = 20; minHeight = 20; var
newPos: TPoint; frmPoint: TPoint; zaczynaćgdyby inReposition następniezaczynaćz TWinControl (nadawca) robićzaczynać
GetCursorPos (newPos); gdyby ssShift w Zmiana następniezaczynać//resize
Ekran. Kursor: = crSizeNWSE; frmPoint: = ScreenToClient (mysz. CursorPos); gdyby frmPoint. X> minWidth następnie
Szerokość: = frmPoint. X; gdyby frmPoint. Y> minHeight następnie
Wysokość: = frmPoint. Y; koniecjeszcze//movezaczynać
Ekran. Kursor: = crSize; Left: = Left - oldPos. X + nowe Poz. X; Top: = Top - oldPos. Y + nowe Poz. Y; oldPos: = newPos; koniec; koniec; koniec; koniec; (* ControlMouseMove *)

ControlMouseMove w skrócie: zmień kursor ekranowy, aby odzwierciedlić operację: jeśli wciśnięty jest klawisz Shift, zmień rozmiar kontrolki lub po prostu przenieś kontrolkę do nowej pozycji (tam, gdzie idzie mysz). Uwaga: minWidth i min. wysokość stałe zapewniają rodzaj ograniczenia rozmiaru (minimalna szerokość i wysokość kontroli).

Po zwolnieniu przycisku myszy przeciąganie lub zmiana rozmiaru dobiegają końca:

proceduraTForm1.ControlMouseUp ( Nadawca: TObject; Przycisk: TMouseButton; Shift: TShiftState; X, Y: liczba całkowita);zaczynaćgdyby inReposition następniezaczynać
Ekran. Kursor: = crDefault; ReleaseCapture; inReposition: = False; koniec; koniec; (* ControlMouseUp *)

ControlMouseUp w skrócie: gdy użytkownik zakończy przenoszenie (lub zmianę rozmiaru kontrolki), zwolnij przechwytywanie myszy (aby umożliwić domyślne przetwarzanie kliknięć) i zaznacz, że zmiana położenia jest zakończona.

I to wystarcza! Pobierz przykładową aplikację i spróbuj sam.

Uwaga: Innym sposobem przenoszenia kontrolek w czasie wykonywania jest użycie Delphi przeciągnij i upuść powiązane właściwości i metody (DragMode, OnDragDrop, DragOver, BeginDrag itp.). Przeciąganie i upuszczanie umożliwia użytkownikom przeciąganie elementów z jednego elementu sterującego - takiego jak pole listy lub widok drzewa - do innego.

Jak zapamiętać pozycję kontrolną i rozmiar?

Jeśli zezwalasz użytkownikowi na przenoszenie i zmianę rozmiarów kontrolek formularzy, musisz upewnić się, że jakoś to kontroluje zapisywane po zamknięciu formularza i przywracane jest położenie każdej kontrolki podczas tworzenia / ładowania formularza. Oto jak przechowywać właściwości Left, Top, Width i Height dla każdej kontrolki w formularzu w INI plik.

Co powiesz na 8 rozmiarów uchwytów?

Gdy pozwalasz użytkownikowi przesuwać i zmieniać rozmiar formantów w formularzu Delphi, w czasie wykonywania za pomocą myszy, do całkowicie naśladując środowisko projektowania, należy dodać osiem uchwytów do elementu sterującego zmieniono rozmiar.

instagram story viewer