Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VB .Net 2008 Express] Empêcher la mise à jour à l'écran

7 réponses
Avatar
Bonjour,

La méthode SuspendLayout puis ResumeLayout ne fonctionne pas correctement
dans mon application lors de l'affichage (.Show) ou non (.Hide) de plusieurs
Form fils dans 1 application MDI.

Est-il possible d'interrompre convenablement l'affichage de l'application,
notamment lors de l'affichage de Form fils ?

PS : Toutes mes Form fils doivent rester Maximisées, et une même commande
peut ouvrir et cacher plusieurs Forms.

Merci d'avance pour votre aide,
Stéphane

7 réponses

Avatar
Jérémy Jeanson
Bonjour Stéphane,

Je pense que tu te méprends un peu en ce qui soncerne SuspendLayout et
ResumeLayout. Ce sont deux méthode qui servent à piloter succintement le
moteur qui fait le rendu des controls. En gros quand on le suspend il ne
travail plus. Cela ne veux pas dire que l'état de tes control vas être
conservé, juste que l'affichage ne répondra pas si on lui demande de
faire un rafraichissement.

Concrètement, tu lances SuspendLayout sur un formulaire, si pour une
raison ou un autre une autre application ou un formulaire passe devant
le tiends, tu auras le droits à un formulaire partiellement blanc à
l'emplacement où l'autre application est passée.

Ceci sert principalement quand on modifie plusieurs controls sans que
ceci déclenche le rafraichissements de l'interface (et donc prenne du
temps sur l'opération que l'on a en cours). Vu que ce n'est pas très
esthétique si un autre formulaire passe par là à ce moeent, on a
tendance à faire cela formulaire caché.

Dans ton cas tu semble avoir un souci de rafraichissement, mais à quel
moment? es tu bien certain que ce soit sur le Show()... n'aurrais tu pas
des event Form_Load() un peu trop chargés?
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Merci Jérémy pour ta réponse.

Les Form_Load des fils sont pour l'instant plutôt vide, car il ne s'agit
pour l'instant que d'un squelette de présentation.

Pour résumer l'application.

Au démarrage, je dois avoir plein de fenêtres ouvertes par défaut, toutes en
maximisées.
Il y a les fenêtres A (unique et toujours ouvert, et cache les forms B2 à
D2), B1 et B2 (B1 est toujours ouvert, sur activation de B1, B2 s'ouvre que
et C2 à D2 se cachent), C1 et C2 (C1 est toujours ouvert, sur activation de
C1, C2 s'ouvre et B2 et D2 se cachent), D1 et D2 (même fonctionnement (voire
encore plus loins selon les besoins, en respectant toujours la même logique)
Il y a ensuite 4 boutons : Bouton_A, Bouton_B, Bouton_C et Bouton_D.
Bouton_A active A et cachent B2 à D2.
Bouton_B affiche B2, cachent C2 à D2 et active B1.
Bouton_C affiche C2, cachent B2 et D2 et active C1.
Bouton_D affiche D2, cachent B2 à C2 et active D1.

Pour activer : .Activate
Pour afficher : .Show
Pour cacher : .Hide

Existe-t-il 1 solution pour que le fait d'afficher et de cacher des forms ne
se voient pas à l'écran pendant le traitement ?

Stéphane

PS : je n'ai pas le choix, ca fait partie du cahier des charges.


"Jérémy Jeanson" a écrit dans le message de news:
%23sFLW6s$
Bonjour Stéphane,

Je pense que tu te méprends un peu en ce qui soncerne SuspendLayout et
ResumeLayout. Ce sont deux méthode qui servent à piloter succintement le
moteur qui fait le rendu des controls. En gros quand on le suspend il ne
travail plus. Cela ne veux pas dire que l'état de tes control vas être
conservé, juste que l'affichage ne répondra pas si on lui demande de faire
un rafraichissement.

Concrètement, tu lances SuspendLayout sur un formulaire, si pour une
raison ou un autre une autre application ou un formulaire passe devant le
tiends, tu auras le droits à un formulaire partiellement blanc à
l'emplacement où l'autre application est passée.

Ceci sert principalement quand on modifie plusieurs controls sans que ceci
déclenche le rafraichissements de l'interface (et donc prenne du temps sur
l'opération que l'on a en cours). Vu que ce n'est pas très esthétique si
un autre formulaire passe par là à ce moeent, on a tendance à faire cela
formulaire caché.

Dans ton cas tu semble avoir un souci de rafraichissement, mais à quel
moment? es tu bien certain que ce soit sur le Show()... n'aurrais tu pas
des event Form_Load() un peu trop chargés?
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr


Avatar
Jérémy Jeanson
PS : je n'ai pas le choix, ca fait partie du cahier des charges.

pffff, on a toujours un peu le chois, enfin d'une certaine manière. On
te demande de n'afficher qu'une fenêtre à la fois, alors pourquoi
finalement ne pas charger qu'une fenêtre et n'instancier les autres
qu'au moment où tu en as besoin.

Techniquement personne n'ira regarder si toutes tes fenêtres sont
chargées. si on en veux une on l'instancie et on ferme la dernière
ouverte. Tu y gagneras en ressources utilisées et surtout tu
t'affranchiras des soucis de switch entre les filles mdi qui de toutes
manière arriveront bien à un moment car pour interdire l'accès à une
autre fenêtre la méthode la plus viable reste toujours je ShowModal()...

Attention, à vouloir réinventer la roue on se complique bien trop
souvent le travail et on fini par inclure des erreurs que l'on aurait
souhaité éviter.

Petite question : si on synthétise ton besoin tu as en fais un
dispositif dans le quel tu dois afficher des vues particulières en
fonction de la demande de ton utilisateur.
As tu vraiment besoin dans ce cadre d'utiliser du MDI? Ne serrait il pas
plus simple d'avoir un formulaire avec tes commandes et que celui-ci
héberge tes vue(Celles ci pouvant être des UserControl par exemple) en
switchant d'une vue à l'autre (et donc en instanciant le control utile
dans sa zone destinée à l'afifchage)?
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Merci Jérémy,

Je vais essayer de modifier une copie du projet qui n'ouvrira pas toutes les
fenêtres.

A première vue,
Je pense qu'il faudra que je remplace le menu Vues (MdiWindowsListItem) par
1 menu que je gèrerai moi-même.
Le Control Tab ne permettra plus de passer d'une fenêtre à l'autre.
J'arrive à concevoir que cette méthode permettra d'alléger l'application.
Reste à vérifier si cela empêche les effets visuels désagréables à l'écran.
Je te tiendrai au courant.

Je soumettrai le résultat pour voir si ca peut être une solution.


Concernant l'utilisation des MDI, je préfère utiliser des fenêtres filles,
pour des raisons de visiblité, au niveau utilisateur, mais aussi au niveau
du code.

Gérer soi-même les contrôles qui doivent être affichés dans une seule form,
ce n'est jamais bien évident.

Et mettre tout le contenu d'une Form dans un UserControl, je ne sais pas si
je pourrais y arriver, surtout pour gérer tous les contrôles à l'intérieur.

Je n'ai pour le moment créé qu'un seul UserControl, hérité de PictureBox
pour afficher une image contenue dans une ImageList, avec possibilité de
clignottement via un Timer. Son utilisation est simple, mais faire de même
avec tous les contrôles que j'ai dans mes forms, je vois mal la chose.

A bientôt,
Stéphane


"Jérémy Jeanson" a écrit dans le message de news:
Oj64Wxu$
PS : je n'ai pas le choix, ca fait partie du cahier des charges.

pffff, on a toujours un peu le chois, enfin d'une certaine manière. On te
demande de n'afficher qu'une fenêtre à la fois, alors pourquoi finalement
ne pas charger qu'une fenêtre et n'instancier les autres qu'au moment où
tu en as besoin.

Techniquement personne n'ira regarder si toutes tes fenêtres sont
chargées. si on en veux une on l'instancie et on ferme la dernière
ouverte. Tu y gagneras en ressources utilisées et surtout tu
t'affranchiras des soucis de switch entre les filles mdi qui de toutes
manière arriveront bien à un moment car pour interdire l'accès à une autre
fenêtre la méthode la plus viable reste toujours je ShowModal()...

Attention, à vouloir réinventer la roue on se complique bien trop souvent
le travail et on fini par inclure des erreurs que l'on aurait souhaité
éviter.

Petite question : si on synthétise ton besoin tu as en fais un dispositif
dans le quel tu dois afficher des vues particulières en fonction de la
demande de ton utilisateur.
As tu vraiment besoin dans ce cadre d'utiliser du MDI? Ne serrait il pas
plus simple d'avoir un formulaire avec tes commandes et que celui-ci
héberge tes vue(Celles ci pouvant être des UserControl par exemple) en
switchant d'une vue à l'autre (et donc en instanciant le control utile
dans sa zone destinée à l'afifchage)?
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr


Avatar
Jérémy Jeanson
Re,

En fais je n'ai peut être pas été assez claire :(

Je dont je parlais consitait à rempalcer chaque formulaire par un
UserControl. Comme cela tu gardes ton idée de découpage.

Ensuite tu charges le UserControl dont tu as besoin dans un conteneur
quelconque. Et tuswitch le UserControl en fonction de ce que demande
l'utilisateur.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Jérémy,

Pour te tenir au courant, ne charger qu'un seul Form à la fois a permis de
résoudre le problème, et cela convient.

Merci de m'avoir aiguillé de ce côté.

Stéphane


"Jérémy Jeanson" a écrit dans le message de news:
eev02kv$
Re,

En fais je n'ai peut être pas été assez claire :(

Je dont je parlais consitait à rempalcer chaque formulaire par un
UserControl. Comme cela tu gardes ton idée de découpage.

Ensuite tu charges le UserControl dont tu as besoin dans un conteneur
quelconque. Et tuswitch le UserControl en fonction de ce que demande
l'utilisateur.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr


Avatar
Jérémy Jeanson
Bonjour Stéphane,

Merci de nous avoir tenu au courant.

@+
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr