FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- Dans un TreeView, comment remettre en surbrillance le nœud sur lequel on vient d'ajouter un fils ?
- Comment récupérer les lignes cochées d'un TreeView ?
- Comment connaître la génération d'un nœud dans un TreeView ?
- Comment imprimer un contrôle de type TreeView ?
- Comment piloter le clic droit dans un contrôle TreeView ?
En récupérant l'index, vous pouvez repointer le nœud sur lequel vous avez ajouté un fils.
Par exemple, vous êtes sur un nœud, vous stockez son index, vous ajoutez le fils puis vous activez le nœud ainsi :
oTreeView.Nodes
(
intOriginalIndex).Selected
=
True
Dim
currentNode As
MSComctlLib.node
'parcours du node courant
Dim
nbCheckedNodes As
Integer
' Pour chaque node contenu dans la collection nodes de l'objet TreeView
For
Each
currentNode In
LeTreeViewDeTonFormulaire.Nodes
' Traitement du node courant. Exemple compter les nodes cochés
If
currentNode.Checked
Then
nbCheckedNodes =
nbCheckedNodes +
1
End
If
End
Sub
Dans cet exemple nous nous contentons de compter le nombre de lignes sélectionnées. Vous pourrez donc facilement imaginer comment procéder à divers traitements sur les lignes qui vous intéressent.
Pour cela on peut utiliser une procédure récursive qui remonte l'arbre.
Cette procédure est la suivante :
Private
Sub
ChercheGeneration
(
oNode As
Node, intGeneration As
Integer
)
If
Not
oNode.Parent
Is
Nothing
Then
intGeneration =
intGeneration +
1
' Appeler la procédure pour le parent
ChercheGeneration oNode.Parent
, intGeneration
End
If
End
Sub
Exemple d'utilisation sur l'événement Double-Clic du TreeView
Private
Sub
MonTreeView_DblClick
(
)
Dim
Generation As
Integer
ChercheGeneration MonTreeView.SelectedItem
, Generation
MsgBox
Generation
End
Sub
Notons que la numérotation commence à zéro.
Ce code permet d'imprimer dans un état le même TreeView de votre formulaire.
Il faut impérativement faire référence à la bibliothèque d'objets de VB6 (VB6.olb) car ce code utilise l'objet Printer.
Option
Compare Database
Option
Explicit
Const
COORDINATE_XY As
Integer
=
1440
Const
TEXT_HEIGHT As
Integer
=
192
Const
OFFSET_TORIGHT As
Integer
=
256
Const
OFFSET_TODOWN As
Integer
=
128
Private
Sub
cmdPrint_Click
(
)
'***************************************************
' Faire référence à VB6.olb (C:\Program Files\Microsoft Visual Studio\VB98)
'***************************************************
Dim
oTreeView As
TreeView
Set
oTreeView =
TreeViewMain.Object
Printer.CurrentX
=
COORDINATE_XY
Printer.CurrentY
=
COORDINATE_XY
PrintTreeView oTreeView , Printer, COORDINATE_XY
Printer.EndDoc
Set
oTreeView =
Nothing
MsgBox
"Impression de l'arborescence terminée !"
, 64
End
Sub
Private
Sub
PrintTreeView
(
ByVal
TVWObject As
TreeView, ByVal
DevicePrinter As
Object, DeviceCoordinates As
Integer
)
Dim
oNode As
Node
' Préparation de l'impression du TreeView
Set
oNode =
TVWObject.Nodes
(
1
)
Do
Until
oNode Is
Nothing
DevicePrinter.CurrentX
=
DeviceCoordinates
PrintCurrentNode oNode, DevicePrinter
Set
oNode =
oNode.Next
Loop
Set
oNode =
Nothing
End
Sub
Private
Sub
PrintCurrentNode
(
ByVal
TVWNode As
Node, ByVal
DevicePrinter As
Printer)
Dim
sngNodeChildOffset As
Single
Dim
sngX1 As
Single
Dim
sngY1 As
Single
Dim
sngX2 As
Single
Dim
sngY2 As
Single
Dim
sngTreeLineHeight As
Single
' Arboresence...
With
DevicePrinter
sngNodeChildOffset =
.CurrentX
+
OFFSET_TORIGHT
sngX1 =
.CurrentX
+
OFFSET_TORIGHT /
2
sngTreeLineHeight =
TEXT_HEIGHT +
OFFSET_TODOWN
Printer.Print
TVWNode.Text
sngY1 =
DevicePrinter.CurrentY
End
With
' Nœuds enfants
Set
TVWNode =
TVWNode.Child
Do
Until
TVWNode Is
Nothing
' Dessine une ligne pour chaque nœud...
sngX2 =
DevicePrinter.CurrentY
sngY2 =
sngX2 +
sngTreeLineHeight /
2
DevicePrinter.Line
(
sngX1, sngY1)-(
sngX1, sngY2)
DevicePrinter.Line
-
Step
(
OFFSET_TORIGHT /
2
, 0
)
' ...de façon recursive
DevicePrinter.CurrentY
=
sngX2
DevicePrinter.CurrentX
=
sngNodeChildOffset
PrintCurrentNode TVWNode, DevicePrinter
Set
TVWNode =
TVWNode.Next
Loop
End
Sub
Ci-joint un code permettant de piloter le clic droit dans un TreeView nommée TV.
' Si clic à droite + Node visé, appliquer l'effet DropHighlight sur le Node pointé
'
Private
Sub
TV_MouseDown
(
ByVal
Button As
Integer
, ByVal
Shift As
Integer
, ByVal
X As
Long
, ByVal
Y As
Long
)
' Il peut n'y avoir aucun objet sous la souris
If
Button =
vbKeyRButton Then
Set
TV.DropHighlight
=
TV.HitTest
(
X, Y)
Else
Set
TV.DropHighlight
=
Nothing
End
If
End
Sub
' Si la souris est déplacée et que le bouton droit n'est pas enfoncé,
' alors annuler l'effet DropHighlight.
'
Private
Sub
TV_MouseMove
(
ByVal
Button As
Integer
, ByVal
Shift As
Integer
, ByVal
X As
Long
, ByVal
Y As
Long
)
Screen.MousePointer
=
0
If
Not
(
TV.DropHighlight
Is
Nothing
) And
Button <>
vbKeyRButton Then
' Le Node est "abandonné"
Set
TV.DropHighlight
=
Nothing
End
If
End
Sub
' Si Bouton droit est relâché et Node pointé est le même que celui référencé par DropHighLight,
' alors configurer et afficher un menu PopUp.
' Puis annuler l'effet DropHighlight.
'
Private
Sub
TV_MouseUp
(
ByVal
Button As
Integer
, ByVal
Shift As
Integer
, ByVal
X As
Long
, ByVal
Y As
Long
)
Dim
oNode As
MSComctlLib.Node
, p As
Parametrage
If
Button =
vbKeyRButton Then
Set
oNode =
TV.HitTest
(
X, Y)
' Vérifier qu'un Node est effectivement pointé et que c'est celui de l'événement _MouseDown
If
Not
(
oNode Is
Nothing
) Then
If
Not
(
TV.DropHighlight
Is
Nothing
) Then
If
oNode =
TV.DropHighlight
Then
' Placer ici le code de paramétrage et d'ouverture du menu contextuel
...
End
If
End
If
End
If
End
If
Set
TV.DropHighlight
=
Nothing
End
Sub