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
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
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
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
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
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=access.menu)
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)