Redimensionnement automatique du contenu d'un form en vb.net

Soyez le premier à donner votre avis sur cette source.

Vue 23 694 fois - Téléchargée 2 760 fois

Description

Je me suis inspiré d'un code déposé en CSharp.NET par "bestmomo" (http://www.csharpfr.com/code.aspx?ID=33792), que j'ai transcrit en VB.NET, un peu amélioré, et surtout dans lequel j'ai corrigé un bug qui m'a fait tourner en bourrique pendant un moment.

Pour ceux qui iront fouiner dans le code
========================================

La version de "bestmomo" est basée sur la mémorisation (dans un tableau unidimensionnel de structures) des tailles, positions et fonts de la liste des controles contenus dans la Form, ainsi que de leurs conteneurs respectifs. Cela se fait par balayage, grâce à une fonction récursive, de l'arborescence des controles.

Ensuite, lorsque le Resize est demandé, l'arborescence de controles est à nouveau balayée, et l'ancienne taille stockée dans le tableau de structures est modifiée (augmentée ou diminuée) suivant la nouvelle taille de la Form.

Or je me suis aperçu, sur un exemple de Form contenant près de 200 controles, que l'arborescence des controles n'est pas forcément balayée dans le même ordre à deux instants très proches l'un de l'autre. D'où un décalage qui fait que les contrôles sont redimensionnés n'importe comment.

D'autre part, il y a un problème si la Form contient un DataGrid, car un Datagrid peut contenir lui-même des contrôles (TextBox, CheckBox, ou autre). Ma classe 'Resize' s'arrête au niveau de la Datagrid elle-même, sans tenir compte des éventuels contrôles qu'elle contiendrait.

La méthode 'DoResize' possède un argument vrai/faux qui permet d'adapter la taille de la police de chaque contrôle (sauf les Datagrids), et un autre argument qui permet d'affecter un coefficient multiplicateur à la police contenue dans les Datagrids, mais cette dernière fonctionnalité n'est pas au point. Mettre ce dernier à 0 pour l'ignorer.

J'ai fait des tests sur une Form contenant environ 200 contrôles (dont une dizaine de Datagrids), des panels, des groupBox, et conteneurs divers, répartis sur 5 onglets, pas de problèmes. Par contre, avec une telle quantité de controles, ca pédale un peu.

Sur un exemple plus simple tel que celui contenu dans le ZIP, ca marche nickel.

Voilà, I hope this will help you !

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

scortex84
Messages postés
379
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
20 avril 2011
1 -
Hello.
C'est pas mal, le ptit plus c'est le redimensionnement des polices (qui marche pas terrible chez moi...).

Je veux pas faire mon rabajoie, mais en utilisant les encres (proprieté anchor des composants), on arrive au meme résultat...

Remarquez moi j'avais codé des lignes et des lignes de codes il y a quelques années tout ça pour découvrir que "instr" faisait la meme chose... ;-) On en apprend tous les jours !

Bonne programmation à toutes (y'en a ?) et à tous !
Seb.
chris_brabant
Messages postés
64
Date d'inscription
dimanche 24 juillet 2005
Statut
Membre
Dernière intervention
29 septembre 2014
-
j'aimerais bien que tu me montres un exemple de Form COMPLEXE, c'est à dire avec des onglets, avec des Panels, des GroupBoxes, des DataGrids, etc.... et dont le redimensionnement fonctionne nickel avec les Anchor, ca m'intéresse. Dans mon cas, j'ai 5 onglets, avec au total environ 200 contôles...

J'ai trouvé des exemples sur Internet, mais d'une part, il faut bidouiller avec le Concepteur du projet, ce qui n'est pas génial, l'ORDRE dans lequel on positionne les Anchor sur les objets est apparemment important, et de plus, si tu décides pour une raison X ou Y de rajouter un Conteneur en plein milieu de ta Form, ca chamboule toute l'interaction entre les Anchor. Il faut alors tout reprendre à zéro pour prendre en compte le conteneur ajouté.

qu'en penses-tu ?
scortex84
Messages postés
379
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
20 avril 2011
1 -
Hello,
J'ai l'impression que tu as mal pris ma critique. Je ne voulais pas te vexer, tu as fait du bon boulot !

Perso je n'ai pas de form aussi complexe que la tienne (elle met combien de temps à se charger ? 30 secondes ?!), mais j'utilise les encres sur des forms pas mal complexes tout de meme (comme toi plusieurs onglets, etc, etc). Et entre les panels, les onglets, et tous les conteneurs qui existent je m'en sors bien. Evidement, il faut pour chaque control définir l'encre dans le concepteur, ce qui peut etre galère quand on en a 200 (200?! wahou j'en reviens pas...). Par contre le fait d'ajouter un conteneur, ou meme l'ordre dans lequel tu définis les encres n'influe en rien sur la mise en page.
Par contre je voudrais savoir une chose : pour tes onglets, tu utilises des "tabcontrol" ? Si oui, rencontres-tu le fameux bug de la réorganisation des tabs aléatoirement (bug référencé par microsoft, sans aucun correctif à priori) ? Ou as-tu trouvé une solution ?
Seb.
chris_brabant
Messages postés
64
Date d'inscription
dimanche 24 juillet 2005
Statut
Membre
Dernière intervention
29 septembre 2014
-
non non, je n'ai pas mal pris ta critique qui n'en est pas vraiment une en plus...
simplement je ne vois pas comment utiliser les Anchor dans mon cas.

Pour ce qui est de la quantité de controles, pour une interface de base de données ou il y a des masques de saisie avec pas mal de champs, les 200 controles sont vite atteints (textBox, Combobox, Labels pour chaque champ)

J'utilise bien les tabControls, mais je n'ai pas constaté de bug particulier. Quel est ce bug exactement ?

Chris
scortex84
Messages postés
379
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
20 avril 2011
1 -
Re
Le bug fait que le tabcontrol change l'ordre des tabs aléatoirement. Autant tu vas ouvrir le concepteur 10 fois sans aucun soucis, puis la 11 ieme fois, toutes les tabs vont changer de sens. Ca agace !

Voilou !
Seb.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.