Redimensionnement de composant pendant l'exécution

- Voici un truc relativement simple qui pourra donner un peu de fantaisie à vos applications. Il s'agit du redimensionnement d'un contrôle pendant l'exécution. Ce n'est pas très difficile et cela demande peu de code. Il suffit d'une variable globale de type Byte et de quelques lignes de code dans les événements OnMouseDown, OnMouseMove et OnMouseUp du contrôle à redimensionner. L'exemple si après ainsi que le code source que je vous incites vivement à télécharger ( Il est très documenté ) porte sur le redimensionnement d'un TPanel, ce qui est le cas le plus interressant. Mais cela peut s'appliquer à d'autres composants, bien que cela présente à prioiri moins d'interêt.

- La marche à suivre :
- 1 : Tout d'abord, dans l'unité concernée, il faut déclarer une variable globale de type Byte. Il n'y a pas besoin que cette variable soit visible en dehors de l'unité. Donc on la déclare en séction Private. Cette variable pourra avoir 5 valeurs :
0 si le composant n'est pas en train d'être redimensionné.
1 si le composant est en train d'être redimensionné par le coté gauche.
2 si le composant est en train d'être redimensionné par le coté droit.
3 si le composant est en train d'être redimensionné par le haut.
4 si le composant est en train d'être redimensionné par le bas.
On va appeler cette variable Coté
Lorsque la fiche contenant le Panel devient active le Panel ne peut pas être en cours de redimensionnement donc dans l'événement FormCreate de la fiche on initialise la variable Coté à zero. ( Cote:=0 )

- 2 : C'est dans l'événement OnMouseDown du Panel qu'on va decider si on commence un redimensionnement du contrôle et par quel coté cela va se faire. Cela se fait simplement par le code suivant :


If Button=MbLeft then begin // Si c'est le bouton gauche qui est pressé If X<=3 then Cote:=1; // On test si on est sur le bord gauche If X>=Panel1.Width-3 then Cote:=2; // ou droit
If Y<=3 then Cote:=3; // ou si on est en haut
If Y>=Panel1.Height-3 then Cote:=4; // ou en bas
end;

 

ici j'ai choisi le bouton gauche de la souris pour modifier la taile du Panel mais en remplaçant MbLeft par MbRight c'est le bouton droit qui serait actif.

- 3 : Ensuite c'est dans l'événement OnMouseMove du panel que le changement de dimension va ce faire. A la condition cependant que la variable Cote ne contienne pas zero. Une instruction Case Of fait parfaitement l'affaire :


With Panel1 do
begin
Case cote of // On test si on est en mode redimensionnement
1:Begin
Left:=left+X; // On redimensionne par le cote gauche
Width:=Width-X;
end;
2:Width:=X; // On redimensionne par le cote droit
3:Begin
Top:=Top+Y; // On redimensionne par le haut
Height:=Height-Y;
end;
4:Height:=Y; // On redimensionne par le bas
end; // Case
end; //With


Le redimensionnement par la droite ou par le bas est le cas le plus simple. Il suffit de modifier la largeur ou la hauteur du contrôle. Alors que pour un redimensionnement par la gauche ou par le haut il faut modifier la position Left ou Top ainsi que la largeur ou la hauteur.
Note : On travaille ici avec les propriété du contrôle à redimensionner et non pas celle de la fiche. Il faut donc qualifier Left, Top, Width et Height ou bien il faut utiliser une instruction With do comme ci dessus.

- 3 : Fin du redimensionnement : Il suffit de détecter le relachement du bouton et de remettre la variable Cote à zero. Donc dans l'événement OnMouseUp du Panel on place l'instruction suivante : Cote:=0;
On peut aussi placer à cet endroit un test afin de verifier la nouvelle taille du Panel. Effet si Width ou Height sont à zero ( Ou inférieur ) le contrôle ne sera plus visible et ne pourra plus être redimensionné. Ce test figure dans le source d'exemple.

- Amélioration :
- Une des principale amélioration possible, qui figure dans le source d'exemple, est d'inclure dans l'événement OnMouseMove deux petits test qui permettront de modifier l'aspect du curseur lorsqu'il se trouve sur le bord du Panel.
- Dans le cas du Panel ( C'est aussi valable pour d'autres contrôles ) il est possible d'écrire un nouveau composant descendant de TPanel et qui incluerait le redimensionnement dans son implémentation, comme je l'ai fait pour TToolBar qui figure sur la page téléchargement de ce site. Cela simplifierait le code de l'application.
- Note : Le code d'exemple joint n'est pas optimisé. Entre autre il est possible d'améliorer le code de l'événement OnMouseMove.


Debut de la page.