Ακολουθεί ο τρόπος με τον οποίο μπορείτε να ενεργοποιήσετε τη μεταφορά και την αλλαγή μεγέθους των στοιχείων ελέγχου (σε μορφή Delphi) με ένα ποντίκι ενώ η εφαρμογή εκτελείται.
Επεξεργασία φόρμας κατά την εκτέλεση
Μόλις τοποθετήσετε ένα στοιχείο ελέγχου (οπτικό στοιχείο) στη φόρμα, μπορείτε να προσαρμόσετε τη θέση, το μέγεθος και τις άλλες ιδιότητες χρόνου σχεδιασμού. Υπάρχουν περιπτώσεις, ωστόσο, όταν πρέπει να επιτρέψετε σε ένα χρήστη της εφαρμογής σας να επανατοποθετήσει τα στοιχεία ελέγχου φόρμας και να αλλάξει το μέγεθός τους, κατά την εκτέλεση του χρόνου.
Για να ενεργοποιήσετε την εκτέλεση του χρόνου εκτέλεσης του χρήστη και την αλλαγή μεγέθους των στοιχείων ελέγχου σε μια φόρμα με ένα ποντίκι, τρία ποντικιών σχετικών συμβάντων χρειάζονται ειδικό χειρισμό: OnMouseDown, OnMouseMove και OnMouseUp.
Θεωρητικά, ας υποθέσουμε ότι θέλετε να επιτρέψετε σε ένα χρήστη να μετακινήσει (και να αλλάξει το μέγεθος) ένα κουμπί ελέγχου, με ένα ποντίκι, κατά το χρόνο εκτέλεσης. Πρώτον, χειρίζεστε το συμβάν OnMouseDown για να επιτρέψετε στον χρήστη να "πιάσει" το κουμπί. Στη συνέχεια, το συμβάν OnMouseMove πρέπει να επανατοποθετήσει (μετακινήστε, σύρετε) το κουμπί. Τέλος, το OnMouseUp θα πρέπει να ολοκληρώσει τη λειτουργία κίνησης.
Ο έλεγχος φόρμας μεταφοράς και αλλαγής μεγέθους στην πράξη
Πρώτον, αφήστε αρκετούς ελέγχους σε μια φόρμα. Έχετε ένα CheckBox για να ενεργοποιήσετε ή να απενεργοποιήσετε τα στοιχεία ελέγχου μετακίνησης και αλλαγής μεγέθους κατά την εκτέλεση.
Στη συνέχεια, ορίστε τρεις διαδικασίες (στο διεπαφή τμήμα της δήλωσης φόρμας) που θα χειριστεί τα γεγονότα του ποντικιού όπως περιγράφεται παραπάνω:
τύπος TForm1 = τάξη(TForm)... διαδικασία ControlMouseDown (αποστολέας: TObject; Κουμπί: TMouseButton; Μετατόπιση: TShiftState; X, Y: ακέραιος αριθμός). διαδικασία ControlMouseMove (αποστολέας: TObject; Μετατόπιση: TShiftState; X, Y: ακέραιος αριθμός). διαδικασία ControlMouseUp (αποστολέας: TObject; Κουμπί: TMouseButton; Μετατόπιση: TShiftState; X, Y: ακέραιος αριθμός). ιδιωτικός inReposition: boolean; 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 *)
Σημείωση: Ο παραπάνω κώδικας επιτρέπει την επανατοποθέτηση του πλήκτρου 1, του Edit1, του Panel1 και του Button2.
Τέλος, εδώ είναι ο μαγικός κώδικας:
διαδικασίαTForm1.ControlMouseDown ( Αποστολέας: TObject; Κουμπί: TMouseButton; Μετατόπιση: TShiftState; X, Y: ακέραιος αριθμός).ξεκινήσειαν (chkPositionRunTime. Τετραγωνισμένος) ΚΑΙ (Αποστολέας είναι TWinControl) έπειταξεκινήσει inReposition: = True; SetCapture (TWinControl (Sender)). GetCursorPos (oldPos); τέλος; τέλος; (* ControlMouseDown *)
ControlMouseDown εν συντομία: αφού ένας χρήστης πιέσει ένα κουμπί του ποντικιού πάνω από ένα στοιχείο ελέγχου, εάν ενεργοποιηθεί η επανατοποθέτηση του χρόνου εκτέλεσης (πλαίσιο ελέγχου chkPositionRunTime είναι ελεγμένο) και ο έλεγχος που έλαβε το ποντίκι κάτω ακόμη και προέρχεται από το TWinControl, σημειώστε ότι η επανατοποθέτηση του ελέγχου λαμβάνει χώρα (inReposition: = True) και βεβαιωθείτε ότι η επεξεργασία του ποντικιού έχει ληφθεί για τον έλεγχο - για να αποφευχθεί η εμφάνιση των προεπιλεγμένων συμβάντων "κλικ" επεξεργασία.
διαδικασίαTForm1.ControlMouseMove ( Αποστολέας: TObject; Μετατόπιση: TShiftState; X, Y: ακέραιος αριθμός).const minWidth = 20; minHeight = 20; var newPos: TPoint; frmPoint: TPoint; ξεκινήσειαν inReposition έπειταξεκινήσειμε TWinControl (αποστολέας) κάνωξεκινήσει GetCursorPos (newPos); αν ssShift σε Βάρδια έπειταξεκινήσει//resize Οθόνη. Δρομέας: = crSizeNWSE; frmPoint: = ScreenToClient (ποντίκι. CursorPos); αν frmPoint. X> minWidth έπειτα Πλάτος: = frmPoint. Χ; αν frmPoint. Y> minHeight έπειτα Ύψος: = frmPoint. Υ; τέλοςαλλού//moveξεκινήσει Οθόνη. Δρομέας: = crSize; Αριστερά: = Αριστερά - παλιάPos. X + newPos. Χ; Κορυφή: = Κορυφαία - oldPos. Y + newPos. Υ; oldPos: = newPos; τέλος; τέλος; τέλος; τέλος; (* ControlMouseMove *)
ControlMouseMove Εν συντομία: αλλάξτε το Cursor οθόνης για να αντικατοπτρίσετε τη λειτουργία: εάν πιέσετε το πλήκτρο Shift επιτρέψτε την αλλαγή μεγέθους ή απλά μετακινήστε το χειριστήριο σε μια νέα θέση (όπου το ποντίκι πηγαίνει). Σημείωση: minWidth και minHeight οι σταθερές παρέχουν ένα είδος περιορισμού μεγέθους (ελάχιστο πλάτος ελέγχου και ύψος).
Όταν το κουμπί του ποντικιού απελευθερωθεί, η μεταφορά ή η αλλαγή μεγέθους έχει λήξει:
διαδικασίαTForm1.ControlMouseUp ( Αποστολέας: TObject; Κουμπί: TMouseButton; Μετατόπιση: TShiftState; X, Y: ακέραιος αριθμός).ξεκινήσειαν inReposition έπειταξεκινήσει Οθόνη. Δρομέας: = crDefault; ReleaseCapture; inReposition: = Λάθος; τέλος; τέλος; (* ControlMouseUp *)
ControlMouseUp Εν συντομία: όταν ένας χρήστης έχει τελειώσει μετακίνηση (ή αλλαγή μεγέθους του στοιχείου ελέγχου), απελευθερώστε τη δέσμευση του ποντικιού (για να ενεργοποιήσετε την προεπιλεγμένη επεξεργασία κλικ) και επισημάνετε ότι η επανατοποθέτηση ολοκληρώθηκε.
Και αυτό το κάνει! Κατεβάστε την εφαρμογή δείγματος και δοκιμάστε τον εαυτό σας.
Σημείωση: Ένας άλλος τρόπος για να μετακινήσετε τους ελέγχους κατά το χρόνο εκτέλεσης είναι να χρησιμοποιήσετε τους Delphi's σύρετε και αποθέστε (DragMode, OnDragDrop, DragOver, BeginDrag κ.λπ.). Η μεταφορά και απόθεση μπορεί να χρησιμοποιηθεί για να επιτρέψει στους χρήστες να μεταφέρουν αντικείμενα από ένα στοιχείο ελέγχου - όπως ένα πλαίσιο λίστας ή μια δέντρο - σε μια άλλη.
Πώς να θυμάστε τη θέση και το μέγεθος ελέγχου;
Εάν επιτρέπετε σε ένα χρήστη να μετακινήσει και να αλλάξει το μέγεθος των στοιχείων ελέγχου φόρμας, πρέπει να βεβαιωθείτε ότι η τοποθέτηση ελέγχου είναι με κάποιο τρόπο αποθηκεύονται όταν η φόρμα είναι κλειστή και κάθε θέση ελέγχου επαναφέρεται όταν δημιουργηθεί / φορτωθεί η φόρμα. Δείτε πώς μπορείτε να αποθηκεύσετε τις ιδιότητες Αριστεράς, κορυφής, πλάτους και Ύψους, για κάθε έλεγχο σε μια φόρμα, σε μια INI αρχείο.
Πόσο περίπου 8 μεγέθη λαβές;
Όταν επιτρέπετε σε ένα χρήστη να μετακινήσει και να αλλάξει το μέγεθος των στοιχείων ελέγχου σε μορφή Delphi, κατά τη διάρκεια εκτέλεσης με χρήση του ποντικιού, σε να μιμείται πλήρως το περιβάλλον χρόνου σχεδιασμού, θα πρέπει να προσθέσετε οκτώ λαβές μεγέθους στο στοιχείο ελέγχου μέγεθος.