les boutons qui sont à l'intérieur se suivent pas

  • Initiateur de la discussion petchy
  • Date de début
P

petchy

Guest
Re le forum

voila,j'ai un USF qui se met en plein écran,mais le probleme c'est que les boutons qui sont à l'intérieur se suivent pas,il restent à gauche,y à t'il un moyen pour que les boutons se centre quand l'USF est en plein écran.
Private Sub UserForm_Initialize()
Me.Width = Application.Width
Me.Height = Application.Height
End Sub

merci
@ plus
petchy
 
@

@+Thierry

Guest
Re Petchy, le Forum

Non, enfin pas à ma connaissance. Je ne vois que deux moyens détournés.

Soit jouer avec la Propriété Zoom du UserForm qui modifiera la taille et
l'emplacement des Controls (Globalement)

Soit jouer avec les Proriété Top & Left des Controls (Individuellement)

Les deux méthodes ont le désavantage d'être un peu fastidueuse à mettre au point et si ton appli est destinée à circuler sur de multiples configurations d'écran alors il te faudra aussi faire un appel API pour connaitre la résolution un peu comme dans "MonExcelDownLoads" que j'avais fait à l'époque...

A moins bien sur que quelqu'un ne connaisse mieux, car c'est un peu lourd tout çà !

Bon fin de Journée
@+Thierry
 
L

LaurentTBT

Guest
Hello,

Juste une petite précision, par rapport au code de Petchy:
Me.Width = Application.Width...

Cela ne suffit pas pour être en plein écran. La preuve, Petchy, si tu dimensionnes ta fenêtre excel pour qu'elle ne soit pas de la taille de l'écran complet, alors ton Usf aussi n'aura pas la taille de l'écran complet.

Bon, cela n'amène pas grand chose de plus, c'était juste dans un souci de précision.

Maintenant, comme dit Thierry, pour centrer, en jouant sur les left et top, c'est assez fastidieux.

Alors voici un code qui va centrer l'ensemble des contrôles indépendemment de leur nombre et de leurs positions respective. (je n'ai mis que le code pour centrer horizontalement, il faudra faire exactement pareil en vertical.)


Private Sub UserForm_Initialize()
Dim MinLeft As Double
Dim MaxRight As Double
Dim Contrôle As Control
Dim ContrôleMinLeft As Integer

Me.Width = Application.Width

MinLeft = Me.InsideWidth
MaxRight = 0
i = 1
For Each Contrôle In Me.Controls
MinLeft = Application.WorksheetFunction.Min(MinLeft, Contrôle.Left)
If MinLeft = Contrôle.Left Then ContrôleMinLeft = i
MaxRight = Application.WorksheetFunction.Max(MaxRight, Contrôle.Left + Contrôle.Width)
i = i + 1
Next Contrôle
For Each Contrôle In Me.Controls
Contrôle.Left = Contrôle.Left + (Me.InsideWidth - (MaxRight - MinLeft)) / 2 - Me.Controls(ContrôleMinLeft).Left
Next Contrôle
End Sub


Je pense que ça marche à tous les coups.
Le principe: je recherche la position la plus à droite et celle la plus à gauche. La différence des 2 me donne la "largeur de la zone utile", c'est à dire la largeur de la zone comprenant TOUS les contrôles.

Ensuite, cette zone sera centrée, donc on déplace chaque contrôle vers la droite de la même distance que celui qui est le plus à gauche.

Bon, je suis pas sûr d'être très explicite, mais je crois que ça fonctionne.

Bonne soirée.

Laurent.
Voilà
 
L

LaurentTBT

Guest
Sorry, Petchy,

Pourquoi faire simple quand on peut faire compliqué?

Voici une version qui devrait aller mieux:

Private Sub UserForm_Initialize()
Dim MinLeft As Double
Dim MaxRight As Double
Dim Contrôle As Control

Me.Width = Application.Width

MinLeft = Me.InsideWidth
MaxRight = 0
For Each Contrôle In Me.Controls
MinLeft = Application.WorksheetFunction.Min(MinLeft, Contrôle.Left)
MaxRight = Application.WorksheetFunction.Max(MaxRight, Contrôle.Left + Contrôle.Width)
Next Contrôle
For Each Contrôle In Me.Controls
Contrôle.Left = Contrôle.Left + (Me.InsideWidth - (MaxRight - MinLeft)) / 2 - MinLeft
Next Contrôle
End Sub

Enfin, j'espère, sinon, désolé pour la fausse joie!

Bonne soirée.

Laurent.
 
@

@+Thierry

Guest
re Petchy, Bonsoir Laurent, le Forum

Je viens d'arriver chez moi, pas loin du bureau !

Sinon pour faire avancer le schmilblick on peut faire précéder ceci :

Application.WindowState = xlMaximized
ActiveWindow.WindowState = xlMaximized

Et ensuite pour laurent, je n'ai pas pu tester sous XP du bureau mais sous 2000 c'est ta ligne :
'If MinLeft = CTRL.Left Then CTRLMinLeft = i
qui fait une erreur d'exécution "argument non valide" (pour laquelle il n'y a pas accès au débogueur).

En fait si je la supprime çà se passe pas si mal avec trois buttons mis n'importe où sur le UserForm de test.

@Suivre...
@+Thierry
 
@

@+Thierry

Guest
ah ben on s'est croisé, Laurent

Bon alors c'était bien ce If qui générait cette erreur alors et appremment pas très utile puisque tu la purement et simplement supprimé !

Merci pour le message d'hier soir au fait, je t'ai répondu.

@+Thierry
 
L

LaurentTBT

Guest
Salut, Thierry,

Oui, j'ai vu ton message hier.

Heu, quand tu dis "trois buttons mis n'importe où sur le UserForm de test", rassure-moi, ce sont bien ceux initialement qui se sont déplacés en centrant pour respecter l'espacement initial?

ou alors j'ai fait n'importe quoi! ce qui est possible (la chaleur, plus habitué, moi!)

bye bye
 

Discussions similaires

Statistiques des forums

Discussions
312 519
Messages
2 089 266
Membres
104 083
dernier inscrit
hecko