Resize sans douleur

Resize sans douleur

Introduction

Quelle douleur que de devoir mettre sur pied la méthode <form>.Resize pour une forme le moindrement complexe.

J'ai mis au point cette approche lorsque j'ai du élaborer le Resize d'une forme contenant des tabs contenant eux-mêmes d'autres contrôles dont certains étaient redimensionnés et d'autres seulement déplacés tous azimuths. Plus de 400 contrôles (en comptant les instances de chaque contrôle des arrays de contrôles.)

Mettez tout d'abord le ScaleMode de la forme à Pixel: vous aurez ainsi des nombre pas trop gros.

Premiere étape:

Parcourir la forme au complet et noter les dimensions suivantes de tout les contrôles dans une table:

<nomParent> Left, Top, Height, Width
<nonControle> Left, Top, Height, Width

Vous vous rendrez la vie facile si vous progressez du Parent aux contrôles contenus et ainsi de suite.

Deuxième étape

Griser les cases qui ne changeront pas de dimension en vous référant à vos spécifications pour cette forme.

Pour un contrôle collé en haut de la forme (ou d'un 'Frame' ou d'un 'Tab'), Left et Top ne varieront pas.
Pour un contrôle qui ne sera pas redimensionné, Height et Width Top ne varieront pas.
Évidemment, si toute la ligne d'un contrôle est grisée, aucune opération n'est nécessaire (Ça ne m'est pas encore arrivé.)

Troisième étape

Il faut faire quelques calculs selon la méthode ci-dessous, à mettre dans la même table.

Les commentaires ci-dessous sont traduits de la forme ou j'ai implémenté cette méthode et expliquent le détail des calculs.

Pour les contrôles redimensionnés

Le 'Rembourrage' représente l'espace total libre dans le parent pour un certain contrôle.
Ce rembourrage ne varie pas lors des Resize et c'est la clef de l'opération.
Le Parent est l'objet contenant le contrôle.

'Rembourrage'.Largeur = .Width - control.Left - control.Width
'Rembourrage'.Hauteur = .Height- control.Top - control.Height

Pour fixer la Largeur (Width) au 'runtime', on renverse la fonction
control.Width = Parent.Width - control.Left - 'Rembourage'.Largeur
De même pour la hauteur.

Le 'Rembourrage' est obtenu comme constante pour un contrôle dans les deux directions, hauteur et largeur, par simple soustraction.
kW = .Width - control.Width
kH = .Height - control.Height

Pour les contrôles déplacés sans redimensionnement

kMoveW = .Width - control.Left 'dimension design time
kMoveH = .Height - control.Top 'dimension design time

Pour un contrôle à la fois déplacé (kMoveW, kMoveH) et redimensionné (kW, kH)

Le code complet serait:

'<ControlName>.Move (.Width - kMoveW), (.Height - kMoveH),
' (.Width - kW),(.Height - kH)
' -----------------------------------------------------------------------------------

Comme exemple, un fragment de code du 'Resize' du Tab 'Main'. Notez que les dimensions du tab ont été mises dans des variables (pctTabW = largeur, pctTabH = hauteur)
Les nombres purs sont des dimensions 'design time' du contrôle qui ne varient pas.
Comme on ne peut laisser des espaces vide and le 'Move', ceux-ci servent a remplir l'appel de fonction.

' -----------------------------------------------------------------------------------
' Main tab
' -----------------------------------------------------------------------------------
' kW = 7925, kH = N/A
<textBox>.Move 5790, 165, lng_pctTabW - 7925, 360
' kMoveW = 2030, kMoveH = N/A
<CheckBox1>(0).Move (lng_pctTabW - 2030)
<CheckBox2)(0).Move (lng_pctTabW - 2030)
<CommandButton>.Move (lng_pctTabW - 2030)
' Ces trois derniers sont seulement déplacés horizontalement d'ou un seul chiffre.
' kW= 5825, kH = 1080
<SSTab1>.Move 5790, 1005, lng_pctTabW - 5825, lng_pctTabH - 1080
' kW= 135 kH = 480
<RichTextBox>.Move 60, 50, (<SSTab1>.Width - 135), (<SSTab1>.Height - 480)

Résultats

Une forme contenant presque 255 contrôles (plus, si on compte les instances des arrays de controls) qui redimensionnent presque sans erreurs au premier essai (temps de debug: 15 minutes).

Ce document intitulé « Resize sans douleur » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous