OVH Cloud OVH Cloud

barre personnalisé depuis table

2 réponses
Avatar
joyeux atchoum
Bonjour =E0 tous

J'ai regard=E9 dans les news mais je n'ai pas trouv=E9 de r=E9ponse =E0 ma
question.
J'aimerai g=E9n=E9rer dynamiquement une barre d'outils gr=E2ce aux
donn=E9es contenues dans une table
barremenu(id_controle,id_parent,titre,action)

Je pensais pouvoir faire ceci =E0 l'aide d'une fonction r=E9cursive qui
g=E9n=E9rerai le contr=F4le, descendrait si des fils existent, remonter
lorsque le contr=F4le est une feuille, et lors de la remont=E9e associer
le contr=F4le au contr=F4le parent.

Malheureusement je n'arrive pas =E0 cr=E9er un contr=F4le ind=E9pendant
(non associ=E9 =E0 un contr=F4le parent, CommandBar ou CommandBarControl)
et pourvoir l'associer par la suite =E0 son parent.

Auriez vous des id=E9es ? Ou d'autres pistes ?

Cordialement,
ja qui pensait que ce serait plus facile

2 réponses

Avatar
joyeux atchoum
Bonjour

Finalement j'ai trouvé un truc qui n'est pas si mal.
Ce qui au final me manquer c'était le Objet Object pour pouvoir
indifférement sur CommandBarControl et CommandBar

J'ai donc une table
Menu(id_controle,id_parent,titre,parametre,onaction,faceid)

J'ai crée un module de classe clsControle qui posséde comme
accesseurs entre autre
parmi Let
id_controle 'qui charge les information du controle selon son
identifiant

parmi Get
IsNoeud 'indique s'il existe des fils
IsRacine 'indique s'il est en tete de barre de menu
IsFeuille ''indique si c'est un bouton

A partir de là c'est relativement simple


Vous pourrez trouver si dessous le code réduit de ce que j'ai fait (il
y a surement des optimisation à faire)

Comme le code est plutôt long et intéressera peu de monde, je l'ai
posé ici http://km.azerttyu.net


ja
qui malgré tout est arrivé à ses fins

Sub GenererBarreMenu(bolMenuBarre As Boolean)
'initialise les variables
Dim cbBarreMenu As CommandBar
Dim cbcControle As CommandBarControl
Dim cmControle As New clsControleMenu
Dim db As DAO.Database
Dim rs As DAO.Recordset

'Installe la barre de menu
Set cbBarreMenu = CommandBars.Add(MenuBar:=bolMenuBarre,
Position:=msoBarTop, Temporary:=True)

With cbBarreMenu
.Name = "Test"
.Visible = True
End With


'Charge la table contenant les entetes de menu
Set db = CurrentDb
Set rs = db.OpenRecordset("select id_controle from tbl_Menu WHERE
isnull(id_parent)")
rs.MoveFirst
Do Until rs.EOF
cmControle.id_controle = rs("id_controle")
GenererControle cmControle, cbBarreMenu
rs.MoveNext
Loop

End Sub


Function GenererControle(cmControle As clsControleMenu, Optional
cbcParent As Object)
Dim cbcControle As CommandBarControl
Dim cmControleFils As New clsControleMenu
Dim varTypeControle As Variant

With cmControle
If .IsFeuille Then
varTypeControle = msoControlButton
'Set cbcControle =
cbcParent.Controls.Add(Type:=msoControlPopup)
Else
varTypeControle = msoControlPopup
'Set cbcControle =
cbcParent.Controls.Add(Type:=msoControlButton)
End If
End With

'Création du controle
If cmControle.Parametre <> "" Then
Set cbcControle = cbcParent.Controls.Add(Type:=varTypeControle,
Parameter:=cmControle.Parametre)
Else
Set cbcControle = cbcParent.Controls.Add(Type:=varTypeControle)
End If

With cbcControle
.Caption = cmControle.Titre
If cmControle.Action <> "" Then
.OnAction = cmControle.Action
End If
If Not IsNull(cmControle.FaceId) Then
.FaceId = cmControle.FaceId
End If
End With


'Charge les controles fils
If cmControle.IsNoeud Then
'recherche les fils
For Each intfils In cmControle.fils
cmControleFils.id_controle = intfils
GenererControle cmControleFils, cbcControle
Next
End If

End Function
Avatar
joyeux atchoum
Bonjour

Juste pour dire que j'ai modifié mon code, il suffit maintenant d'une
seule classe pour generer la barre de menu.
(http://km.azerttyu.net/?page¬cess.menu)

Cela sera peut être utilie à certains.


ja
qui espere avoir fait un code plus propre