FAQ MS-Access

FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
Sommaire→Formulaires→Contrôles→TreeView- 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 = TrueDim 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 SubExemple 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 SubNotons 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 SubCi-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


