bonjour,
Lien vers : Form GRAPHIQUE, Gestion Bouton
ListOnglet, création dynamique, dimensions et positionnement automatique
![]()
bonjour,
Lien vers : Form GRAPHIQUE, Gestion Bouton
ListOnglet, création dynamique, dimensions et positionnement automatique
![]()
bonjour,
j'ai expliqué, dans une autre discussion, le mécanisme des boutons (dans ce contexte) (suivre le lien au début)
comme le montre la capture, dans la liste des onglets une ligne bleue suit le curseur ce qui n'existe pas avec le "contrôle ListBox" --> "Lbx..."
cette liste est créée dynamiquement (le code ne construit (addition) pas physiquement la liste, il écrit le nom des onglets (ceux autorisé !!) dans la liste)
cette liste est volontairement déroulée (agrandit) pour ne pas utiliser sa ScrollBar (ce qui est plus cool --> on est dans du graphisme)
les dimensions, de cette liste ne sont donc pas connues à l'avance, ET aussi celles du "Cadre avec ombre"
et pour finir, le positionnement de la liste, qui est centrée sur le bouton d'appel, mais qui serra décalée (si elle est trop grande) pour que le bas se positionne avec le bas de la frame (afin de voir l'ombre de dessous)
on calcule une seule fois, (dimensions et position) et on "cache la liste" le bouton d'appel ne fait que la rendre visible ou non
tout çà est fait quand on "initialise le form"
UserForm_Initialize
uniquement pour rappel (voir gestion des boutons), le bouton d'appel
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Private Sub UserForm_Initialize() 'initialise les variables Call SystemINIT_VariableSystem '######################################## FORM '... '######################################## FRAME '---------------------------------------- FRAME,1,Analyse '... 'initialise la List des onglet Call ListPositionne(Me, Me.LblFrm1Opt_3, Me.LbxFrm1ListDesOnglet) 'masque la liste onglet (fond et liste)(non visible à la conception du form) Me.ImgFrm1ListDesOngletFondHaut.Visible = False Me.ImgFrm1ListDesOngletFondMid.Visible = False Me.ImgFrm1ListDesOngletFondBas.Visible = False Me.LbxFrm1ListDesOnglet.Visible = False '---------------------------------------- FRAME,2,Traitement '... End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 '---------------------------------------------------------------------------------------------------------------------- FRAME,1,Analyse,OPTIONS,Btn,3,List Private Sub LblFrm1Opt_3Glass_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Call Btn_MouseMove(Me.ImgFrm1Opt_3Fond, "S", VarListFilmSynchro_BtnFrm1Opt_3) End Sub Private Sub LblFrm1Opt_3Glass_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Call Frm1Opt_3_Action End Sub Private Sub Frm1Opt_3_Action() If VarListFilmSynchro_BtnFrm1Opt_3 = "NO" Then Exit Sub If VarListFilmSynchro_BtnFrm1Opt_3 = "OFF" Then VarListFilmSynchro_BtnFrm1Opt_3 = "ON": Me.ImgFrm1Opt_3Fond.Picture = Me.ImbBtnSombreEnfonceBleu.Picture '---- VarListFilmSynchro_BtnFrm1Opt_1 = "OFF": Me.ImgFrm1Opt_1Fond.Picture = Me.ImbBtnSombreNormal.Picture VarListFilmSynchro_BtnFrm1Opt_2 = "OFF": Me.ImgFrm1Opt_2Fond.Picture = Me.ImbBtnSombreNormal.Picture '---- action Me.ImgFrm1ListDesOngletFondHaut.Visible = True Me.ImgFrm1ListDesOngletFondMid.Visible = True Me.ImgFrm1ListDesOngletFondBas.Visible = True Me.LbxFrm1ListDesOnglet.Visible = True '---- Else VarListFilmSynchro_BtnFrm1Opt_3 = "OFF": Me.ImgFrm1Opt_3Fond.Picture = ImbBtnSombreNormal.Picture '---- action Me.ImgFrm1ListDesOngletFondHaut.Visible = False Me.ImgFrm1ListDesOngletFondMid.Visible = False Me.ImgFrm1ListDesOngletFondBas.Visible = False Me.LbxFrm1ListDesOnglet.Visible = False '---- End If End Sub
bonjour,
La "Face" Graphique
j'utilise Paint (le simple...vu qu'il y a un nouveau Paint 3D) jusqu’à présent
voici donc, une capture de l'espace de travail dans Paint
l’intérieur des cadres oranges, c'est limage qui va dans Un "Contrôle Image"
pourquoi 3 parties ? --> celle du milieu (uniquement rectiligne) peut donc s'agrandir (verticalement) sans "déformation" (altération de l'image)
pour agrandir dans tous les sens, il faut 3 parties horizontales supplémentaires et donc 9 éléments à traiter
nouvelle capture de l'espace de travail dans Paint
--> ce qui peut devenir -->
voici comment se présente la liste onglet dans la construction du form (VBA)
j'ai volontairement mis une capture large pour bien situer la Liste Onglet, dans ce contexte (une longue frame principale qui contient les frames spécifiques à l'Analyse, au Traitement,...)
voici à nouveau un lien pour reprendre depuis le début et comprendre cette configuration
Lien vers : Form GRAPHIQUE, Gestion Bouton
bonjour,
Mécanisme du positionnement de la Liste Des Onglets
tout commence donc à l'initialisation du form, on appelle la procédure de positionnement de la liste
appel de la procédure
ListPositionne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 'initialise la List des onglet Call ListPositionne(Me, Me.LblFrm1Opt_3, Me.LbxFrm1ListDesOnglet)
A NOTER..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 Public Sub ListPositionne(ByVal ObjForm As Object, ByVal ObjIndex As Object, ByVal ObjLbx As Object) 'positionne une List sur une LigneIndex '---- 'ListStyle = 0-fmListStylePlain.....LigneHauteur = (ObjLbx.Font.Size * 1.182) 'ListStyle = 1-fmListStyleOption....LigneHauteur = 14 (à voir plus précisément) ObjLbx.ListStyle = 0 '---- Call ListOngletNameInit(ObjLbx) 'ListHauteur = (ObjLbx.ListCount) * LigneHauteur ObjLbx.Height = (ObjLbx.ListCount) * (ObjLbx.Font.Size * 1.182) 'alligner sur le bouton "Selection" de List LigneIndex = ObjIndex.Top MidList = Int(ObjLbx.ListCount / 2) + 1 If MidList > 16 Then ObjLbx.Top = LigneIndex - (MidList + (MidList - 16)) * (ObjLbx.Font.Size * 1.182) - 12.75 Else ObjLbx.Top = LigneIndex - MidList * (ObjLbx.Font.Size * 1.182) - 3 End If '---- 'positionne le fond graphique sous la liste ObjForm.ImgFrm1ListDesOngletFondHaut.Top = ObjLbx.Top - 10 ObjForm.ImgFrm1ListDesOngletFondMid.Top = ObjForm.ImgFrm1ListDesOngletFondHaut.Top + 12.75 ObjForm.ImgFrm1ListDesOngletFondMid.Height = ObjLbx.Height - 2.75 ObjForm.ImgFrm1ListDesOngletFondBas.Top = ObjLbx.Top + ObjLbx.Height - 2.75 '---- ObjForm.ImgFrm1ListDesOngletFondHaut.Visible = True ObjForm.ImgFrm1ListDesOngletFondMid.Visible = True ObjForm.ImgFrm1ListDesOngletFondBas.Visible = True ObjLbx.Visible = True '---- End Sub
ByVal --> (vu précédemment ByRef --> qui est par défaut) --> est une copie --> l'original n'est pas modifié
le format des noms de variables et ici des objects --> Object, Obj --> ListBox, Lbx et Object ListBox, ObjLbx
ObjLbx.ListStyle = 0 --> le style de la liste est (ici) imposé --> style plain (normal,ordinaire)
pour ce style le coefficient multiplicateur est : 1.182 (comme indiqué dans le code, le "coef" 14 n'est pas certain)
aprés l'appel de la procédure qui va lister et mettre (ou non) les noms des onglets dans la liste
on connait la hauteur de la liste avec : ListHauteur = (ObjLbx.ListCount) * LigneHauteur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Call ListOngletNameInit(ObjLbx)
la hauteur de la ligne dépend bien entendu de la hauteur des caractères utilisés : LigneHauteur = ObjLbx.Font.Size * 1.182
je rappelle que la hauteur de la liste, c'est la partie du milieu des 3 parties graphiques !!!
![]()
bonjour,
La Liste Des Onglets
ListOngletNameInit
A NOTER..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Public Sub ListOngletNameInit(ByVal ObjLbx As Object, Optional SelectOuiNon As String) ObjLbx.Clear For i = 1 To Sheets.Count OngletTitre = Sheets(i).Range("A1").Value If OngletTitre = "NEWS TITRE" Or OngletTitre = "TITRE" Then ObjLbx.AddItem (Sheets(i).Name) If UCase(SelectOuiNon) = "O" Or UCase(SelectOuiNon) = "OUI" Then ObjLbx.Selected(ObjLbx.ListCount - 1) = True End If End If Next End Sub
le paramètre "Optional" --> n'est pas utilisé pour cette liste
dans une autre utilisation, la liste des onglets a un style=1 --> avec des cases à cocher
le paramètre "Optional" est alors : SelectionOuiNon = "0" et toutes les cases sont cochée (ligne après ligne)
tous les Onglets ne sont pas dans la liste, sont retenus uniquement les Onglets contenant une ligne de titre de colonne dont la cellule "A1" contient "TITRE" ou "NEWS TITRE"
le "filtre"
la liste est maintenant construite, elle est "cachée" et l'action du bouton d'appel va la rendre "visible"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 OngletTitre = Sheets(i).Range("A1").Value If OngletTitre = "NEWS TITRE" Or OngletTitre = "TITRE" Then
bonjour,
Une Liste Avec une Ligne Bleue
pour cette liste (déroulée..uniquement)
je précise ce commentaire dans le code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 '---------------------------------------------------------------------------------------------------------------------- FRAME,1,Analyse,OPTIONS,ListDesOnglet Private Sub LbxFrm1ListDesOnglet_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 'ne pas utiliser Lbx..._Click() -> .Selected(n) simule le click !!! -> utiliser Lbx..._MouseDown() Ligne = Int(Y / (LbxFrm1ListDesOnglet.Font.Size * 1.182)) + LbxFrm1ListDesOnglet.TopIndex If Ligne > -1 And Ligne < Me.LbxFrm1ListDesOnglet.ListCount Then Me.LbxFrm1ListDesOnglet.Selected(Ligne) = True End Sub
voila l'action du "faux" Click dans la liste'ne pas utiliser Lbx..._Click() -> .Selected(n) simule le click !!! -> utiliser Lbx..._MouseDown()
l'action (celle d'une ListBox normale) tient en une ligne "schématisée" : TextBox = Listbox.List(value)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Private Sub LbxFrm1ListDesOnglet_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) '---- action Me.TxbAnalyseOptionOngletName = Me.LbxFrm1ListDesOnglet.List(Me.LbxFrm1ListDesOnglet.Value) '... '---- VarListFilmSynchro_BtnFrm1Opt_3 = "OFF": Me.ImgFrm1Opt_3Fond.Picture = ImbBtnSombreNormal.Picture '---- Me.ImgFrm1ListDesOngletFondHaut.Visible = False Me.ImgFrm1ListDesOngletFondMid.Visible = False Me.ImgFrm1ListDesOngletFondBas.Visible = False Me.LbxFrm1ListDesOnglet.Visible = False '---- valide le Btn Frame List If VarListFilmSynchro_BtnFrm1_1 = "ON" Then VarListFilmSynchro_BtnFrm1_1 = "OFF": Me.ImgFrm1_1Fond.Picture = Me.ImbBtnClairNormal.Picture If VarListFilmSynchro_BtnFrm1_2 = "ON" Then VarListFilmSynchro_BtnFrm1_2 = "OFF": Me.ImgFrm1_2Fond.Picture = Me.ImbBtnClairNormal.Picture VarListFilmSynchro_BtnFrm1_3 = "ON": Me.ImgFrm1_3Fond.Picture = Me.ImbBtnClairEnfonceBleu.Picture End Sub
le reste, c'est ce que j'appelle : la "réaction"
éteindre le bouton d'appel
masquer la liste
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2VarListFilmSynchro_BtnFrm1Opt_3 = "OFF": Me.ImgFrm1Opt_3Fond.Picture = ImbBtnSombreNormal.Picture
éteindre divers boutons
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Me.ImgFrm1ListDesOngletFondHaut.Visible = False Me.ImgFrm1ListDesOngletFondMid.Visible = False Me.ImgFrm1ListDesOngletFondBas.Visible = False Me.LbxFrm1ListDesOnglet.Visible = False
et pour terminer, allumer le bouton qui en rapport avec l'onglet sélectionné, va afficher une autre liste avec un autre mécanisme surprenant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 If VarListFilmSynchro_BtnFrm1_1 = "ON" Then VarListFilmSynchro_BtnFrm1_1 = "OFF": Me.ImgFrm1_1Fond.Picture = Me.ImbBtnClairNormal.Picture If VarListFilmSynchro_BtnFrm1_2 = "ON" Then VarListFilmSynchro_BtnFrm1_2 = "OFF": Me.ImgFrm1_2Fond.Picture = Me.ImbBtnClairNormal.Picture
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2VarListFilmSynchro_BtnFrm1_3 = "ON": Me.ImgFrm1_3Fond.Picture = Me.ImbBtnClairEnfonceBleu.Picture
Lien vers : Form GRAPHIQUE, Liste Multi-Colonne et ScrollBar Externe
voila pour cette partie, n’hésitez pas pour aller voir la suite....![]()
@+JP
bonjour,
voila un complément d'information : positionnement des contrôles image et Label décalé sur un nouvel écran 3840x2160
@+JP
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager