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.
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.