Voici comment activer le glissement et le redimensionnement des contrôles (sur un formulaire Delphi) avec une souris pendant que l'application est en cours d'exécution.
Éditeur de formulaires au moment de l'exécution
Une fois que vous avez placé un contrôle (composant visuel) sur le formulaire, vous pouvez ajuster sa position, sa taille et d'autres propriétés au moment du design. Il existe cependant des situations où vous devez autoriser un utilisateur de votre application à repositionner les contrôles de formulaire et à modifier leur taille, au moment de l'exécution.
Pour activer le déplacement de l'utilisateur au moment de l'exécution et le redimensionnement des contrôles sur un formulaire avec une souris, trois événements liés à la souris besoin d'une gestion spéciale: OnMouseDown, OnMouseMove et OnMouseUp.
En théorie, supposons que vous souhaitiez permettre à un utilisateur de déplacer (et de redimensionner) un contrôle bouton, avec une souris, au moment de l'exécution. Tout d'abord, vous gérez l'événement OnMouseDown pour permettre à l'utilisateur de "saisir" le bouton. Ensuite, l'événement OnMouseMove doit repositionner (déplacer, faire glisser) le bouton. Enfin, OnMouseUp devrait terminer l'opération de déplacement.
Faire glisser et redimensionner les contrôles de formulaire dans la pratique
Tout d'abord, supprimez plusieurs contrôles sur un formulaire. Avoir une CheckBox pour activer ou désactiver les contrôles de déplacement et de redimensionnement au moment de l'exécution.
Ensuite, définissez trois procédures (dans le interface section de la déclaration de formulaire) qui gérera les événements de souris comme décrit ci-dessus:
type TForm1 = classe(TForm)... procédure ControlMouseDown (expéditeur: TObject; Bouton: TMouseButton; Shift: TShiftState; X, Y: Entier); procédure ControlMouseMove (expéditeur: TObject; Shift: TShiftState; X, Y: Entier); procédure ControlMouseUp (Sender: TObject; Bouton: TMouseButton; Shift: TShiftState; X, Y: Entier); privé inReposition: booléen; oldPos: TPoint;
Remarque: Deux variables de niveau de formulaire sont nécessaires pour marquer si un mouvement de contrôle a lieu (inReposition) et pour mémoriser l'ancienne position du contrôle (oldPos).
Dans l'événement OnLoad du formulaire, affectez des procédures de gestion des événements de la souris aux événements correspondants (pour les contrôles que vous souhaitez faire glisser / redimensionner):
procédure TForm1.FormCreate (expéditeur: TObject); commencer 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; fin; (* FormCreate *)
Remarque: le code ci-dessus permet le repositionnement au moment de l'exécution de Button1, Edit1, Panel1 et Button2.
Enfin, voici le code magique:
procédureTForm1.ControlMouseDown ( Expéditeur: TObject; Bouton: TMouseButton; Shift: TShiftState; X, Y: Entier);commencersi (chkPositionRunTime. Vérifié) ET (Expéditeur est TWinControl) ensuitecommencer inReposition: = True; SetCapture (TWinControl (Sender) .Handle); GetCursorPos (oldPos); fin; fin; (* ControlMouseDown *)
ControlMouseDown en bref: une fois qu'un utilisateur appuie sur un bouton de la souris sur un contrôle, si le repositionnement au moment de l'exécution est activé (case à cocher chkPositionRunTime est cochée) et le contrôle qui a reçu la souris même est dérivé de TWinControl, marque que le repositionnement du contrôle est en cours (inReposition: = True) et assurez-vous que tout le traitement de la souris est capturé pour le contrôle - pour empêcher les événements de "clic" par défaut d'être traité.
procédureTForm1.ControlMouseMove ( Expéditeur: TObject; Shift: TShiftState; X, Y: Entier);const minWidth = 20; minHeight = 20; var newPos: TPoint; frmPoint: TPoint; commencersi inReposition ensuitecommenceravec TWinControl (expéditeur) fairecommencer GetCursorPos (newPos); si ssShift dans Décalage ensuitecommencer//resize Écran. Curseur: = crSizeNWSE; frmPoint: = ScreenToClient (souris. CursorPos); si frmPoint. X> minWidth ensuite Largeur: = frmPoint. X; si frmPoint. Y> minHeight ensuite Hauteur: = frmPoint. Y; finautre//movecommencer Écran. Curseur: = crSize; Gauche: = Gauche - oldPos. X + newPos. X; Top: = Top - oldPos. Y + newPos. Y; oldPos: = newPos; fin; fin; fin; fin; (* ControlMouseMove *)
ControlMouseMove en bref: changez le curseur d'écran pour refléter l'opération: si vous appuyez sur la touche Maj, autorisez le redimensionnement du contrôle, ou déplacez simplement le contrôle vers une nouvelle position (où va la souris). Remarque: minWidth et minHeight les constantes fournissent une sorte de contrainte de taille (largeur et hauteur de contrôle minimum).
Lorsque le bouton de la souris est relâché, le glissement ou le redimensionnement est terminé:
procédureTForm1.ControlMouseUp ( Expéditeur: TObject; Bouton: TMouseButton; Shift: TShiftState; X, Y: Entier);commencersi inReposition ensuitecommencer Écran. Curseur: = crDefault; ReleaseCapture; inReposition: = False; fin; fin; (* ControlMouseUp *)
ControlMouseUp en bref: lorsqu'un utilisateur a fini de déplacer (ou de redimensionner le contrôle), relâchez la capture de la souris (pour activer le traitement des clics par défaut) et marquez que le repositionnement est terminé.
Et ça suffit! Téléchargez l'exemple d'application et essayez par vous-même.
Remarque: Une autre façon de déplacer des contrôles au moment de l'exécution consiste à utiliser Delphi glisser déposer propriétés et méthodes associées (DragMode, OnDragDrop, DragOver, BeginDrag, etc.). Le glisser-déposer peut être utilisé pour permettre aux utilisateurs de faire glisser des éléments d'un contrôle - comme une zone de liste ou une arborescence - vers un autre.
Comment mémoriser la position et la taille du contrôle?
Si vous autorisez un utilisateur à déplacer et redimensionner des contrôles de formulaire, vous devez vous assurer que le placement des contrôles est en quelque sorte enregistré lorsque le formulaire est fermé et que la position de chaque contrôle est restaurée lorsque le formulaire est créé / chargé. Voici comment stocker les propriétés Left, Top, Width et Height, pour chaque contrôle d'un formulaire, dans un INI fichier.
Que diriez-vous de 8 poignées de taille?
Lorsque vous autorisez un utilisateur à déplacer et redimensionner des contrôles sur un formulaire Delphi, au moment de l'exécution à l'aide de la souris, pour imiter pleinement l'environnement de conception, vous devez ajouter huit poignées de taille au contrôle redimensionné.