begin process at 2012 02 15 05:23:43
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Windows

 > 

Formulaire et Controls

 > 

treeview


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

treeview

samedi 23 février 2008 à 19:59:55 | treeview

hadddock

Bonjour,
J'ai rempli (en VB6.0.81.76) un treeview avec des données hiérarchisées venant d'une base ACCESS et je souhaiterais balayer l'ensemble de ce treeview de la première à la dernière ligne (pour export vers EXCEL) sans me soucier du niveau hiérarchique de chaque ligne, ce qui n'est pas possible en utilisant la propriété index puisque celle-ci dépend de l'ordre de création des noeuds et de leurs enfants.
Par ailleurs, mon treeview contient environ 40000 lignes et la propriété Nodes.Count devient négative à partir de 32767.

Merci de m'aider
dimanche 24 février 2008 à 02:54:23 | Re : treeview

jack

Administrateur CodeS-SourceS
Salut
Version :
VB6.0.81.76
Je suppose qu'il s'agit de la version que tu lis dans les propriétés du fichier VB6.EXE ?
Pour ma part, c'est la 6.0.97.82 qui est la dernière et uiltime version.
Pour te mettre à jour, charge le SP6 de VB6 dispo chez Microsoft.

Problème :
Cela m'étonne que Nodes.Count soit limité à un Integer.
Vérifie si tu n'essayerai pas de stocker ce Count dans une variable dimensionnée en Integer.
Si oui, modifie son type en Long.

Pour sauvegarder le contenu d'un TreeView, il te faudra sauver aussi le lien Parent-Enfant de chaque Node.
A toi d'imaginer une structure de fichier permettant de repérer facilement cet état.
Suffit aussi de chercher "sauver treeview" parmi les codes du site pour avoir des exemples.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
dimanche 23 mars 2008 à 08:35:48 | Re : treeview

mloriam

Bonjour,
J'ai le même problème avec un treeview utilisé sous Access. Il semble que l'index soit de type Integer et donc limité à 32767, au delà il prend une valeur négative. Avez-vous trouvé des informations complémentaires sur ce sujet, voir une solution ?.
Merci

Mlab
dimanche 23 mars 2008 à 20:15:31 | Re : treeview

hadddock

Bonjour,

D'abord, merci à jack pour le tuyau du SP6.

Ensuite, après recherches, j'ai fini par découvrir que le TreeView ne gérait que des index en Integer : cf. à ce sujet http://support.microsoft.com:80/kb/182231/fr (Microsoft admet qu'il s'agit d'un bug) même si on peut y créer un nombre de n½uds supérieur.

Or mon problème était de balayer les n½uds (environ 45000) de haut en bas, sans me soucier de leur niveau hiérarchique, et de les envoyer dans cet ordre dans les cellules d'un MsFlexGrid ou dans un classeur EXCEL.

Après nombre d'essais infructueux en utilisant des codes source trouvés ici et là (j'avais presque réussi avec http://www.vbfrance.com/codes/SAUVEGARDE-TREEVIEW-ORDRE-SON-CONTENU_39885.aspx mais il y avait un bug dès que plusieurs n½uds étaient rattachés à la racine et il de dépassait pas le seuil des 32767 noeuds).

J'ai donc repris le Pb à zéro et je suis parti des hypothèses suivantes :

En se positionnant sur un n½ud quelconque de niveau n, le n½ud suivant ne pouvait être que :

  1. Son premier enfant (Child) (niveau n+1)

1.1.    Il existe, on se positionne dessus et on le récupère

1.2.    Il n'existe pas (err 91) et on passe au point 2

  1. Son suivant (Next) (niveau n)

2.1.    Il existe, on se positionne dessus et on le récupère

2.2.    Il n'existe pas (err 91) et on passe  au point 3

  1. Le suivant de son père (Parent puis Next) (niveau n-1)

3.1.    Il existe, on se positionne dessus et on le récupère

3.2.    Il n'existe pas (err 91) et on passe au niveau n-2 en recherchant le Parent du Parent puis au point 3

3.3.    S'il n'y a toujours rien au niveau 0, on est arrivé au point 4

  1. Aucun n½ud si on est arrivé à la dernière ligne

Il suffisait donc de se positionner sur le premier n½ud et de faire une boucle jusqu'à arriver au point 4.

Le principal Pb était que la non-existence d'un n½ud se traduisait toujours par la même erreur 91 et qu'il fallait trouver une astuce pour détecter son origine.

Je pense y être à peu près arrivé avec le code ci-dessous qui remplit les 45000 lignes du MsFlexGrid en moins d'une minute. Attention : si le nombre de n½uds est supérieur à 32767, la propriété Nodes.Count provoque une erreur et il faut utiliser la fonction SendMessage.

Bon courage !

Hadddock
 

Private Const TVM_GETCOUNT = &H1105&

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

 

Private Sub Sequence(tvw As TreeView)

    On Error GoTo erreur

    Dim Remonter As Byte

    Dim Niveau As Byte

    Dim Colonnes As Byte

    Dim MaxNiveau As Byte

    Dim MaxCol As Byte

    Dim i as Long

    Screen.MousePointer = vbHourglass

    tvw.Visible = False

    MSFlexGrid1.Visible = False

    MSFlexGrid1.Rows = 1   ' réservé pour un en-tête

    For i = 1 To SendMessage(tvw.hwnd, TVM_GETCOUNT, 0, ByVal 0) ' recherche du niveau et du nombre de colonnes maximum

        Niveau = UBound( Split (tvw.Nodes(i).FullPath, tvw.PathSeparator))

        MaxNiveau = IIf(MaxNiveau < Niveau, Niveau, MaxNiveau)

        Colonnes = UBound( Split (tvw.Nodes(i).Text, Chr(9))) + 1

        MaxCol = IIf(MaxCol < Colonnes, Colonnes, MaxCol)

    Next i

    MSFlexGrid1.Cols = MaxCol

    tvw.Nodes(1).Root.Selected = True ' se positionne sur le premier noeud

    MSFlexGrid1.AddItem tvw.SelectedItem.Text

    Do

RechercheEnfant:

        Recherche = "enfant"

        tvw.SelectedItem.Child.Selected = True ' s'il n'existe pas renvoie une erreur 91

        MSFlexGrid1.AddItem tvw.SelectedItem.Text ' s'il existe l'envoie dans la grille

        GoTo suite

RechercheSuivant:

        Recherche = "suivant"

        tvw.SelectedItem.Next.Selected = True ' s'il n'existe pas renvoie une erreur 91

        MSFlexGrid1.AddItem tvw.SelectedItem.Text ' s'il existe l'envoie dans la grille

        GoTo suite

RechercheParent:

        Recherche = "parent"

        tvw.SelectedItem.Parent.Selected = True ' existe forcément puisqu'appelé par un de ses enfants

        tvw.SelectedItem.Next.Selected = True ' s'il n'existe pas renvoie une erreur 91

        MSFlexGrid1.AddItem TreeView1.SelectedItem.Text ' s'il existe l'envoie dans la grille

        Remonter = 0

suite:

    Loop

erreur:

    Select Case Err

    Case 91

        If Recherche = "enfant" Then Resume RechercheSuivant  '   pas d'enfant > recherche du suivant

        If Recherche = "suivant" Then Resume RechercheParent  '   pas de suivant > recherche du parent puis de son suivant

        If Recherche = "parent" Then  '   pas de suivant au parent > recherche du parent au niveau inférieur

            Remonter = Remonter + 1

            If Remonter > MaxNiveau Then  '   pas de parent au niveau le plus bas > sortie

                tvw.Visible = True

                MSFlexGrid1.Visible = True

                Screen.MousePointer = vbArrow

                Exit Sub

            Else

                Resume RechercheParent ' recherche du parent de niveau inférieur

            End If

        End If

    Case Else

        MsgBox ("Erreur " & Err & " : " & Err.Description)

        Resume Next

    End Select

End Sub

 

 



Cette discussion est classée dans : ligne, propriété, treeview


Répondre à ce message

Sujets en rapport avec ce message

Importation base de donnée dnas treeview [ par safireevil ] J'ai un petit problème avec le soft que je fais et j'autai besoin d'aide. J'ai un fichier qui me sert de base de données très important (120 000) lign Propriété TopRow d'une MSFlexGrid en écriture [ par jm6fr ] Bonjour L'aide en ligne indique une utilisation de cette propriété avec une MSHFlexGrid, mais elle indique également dans la liste des application le Problème de composant dans VB [ par bruno b ] Bonjour, J'obtient une érreur système lorsque je veux ajouter un composant à la barre des commposant sur la gauche de VB.message de l'erreur: Erreur problème copatibilité winMe [ par pitou ] Ma société a développé une application VB6 sous Windows 98 et cette dernière ne fonctionne pas sous Windows Me.N'étant pas un spécialiste je recherche Récuperation d'infos dans un txt pour création dynamique d'un treeview [ par zoglub14 ] Bonjour le forum,Je dois créer un treeview different en fonction de l'utilisateur.Je sais créer la treeview, mais je voudrais mettre les informations treeview enlever la sélection [ par betty.34 ] bonjour, j'ai un problème avec mon treeview ... j'aimerais ke lorsque j'ai déplacé une valeure de mon treeview qu'elle ne soit plus sélectionné ... pa Selectionner une ligne dans une MSFlexGrid [ par pop_popp_poppp ] Bonjour :-)   J'utilise dans mon application une MSFlexGrid reliée a une base de données via un contrôle Data. Le mode de sélection de ma MSFlexGrid e Problème Focus ListView [ par philippe laschweng 1 ] Bonjour tout le monde,J'ai un petit problème !J'utilise une ListView avec des données dedans et grace à la propriété 'ListView1.SelectedItem' je peux Propriété formula [ par Tobi26 ] Bonjour à tous !Comment faire comprendre au code suivant, que la valeur a+1 est égale à 2 ? Car je suis dans une boucle et j'ai besoin de dire que la Treeview multi-lignes? [ par turlututuchapopointu ] Bonjour,J'aimerai savoir s'il est possible de faire un treewiew multi ligne. C'est-à-dire que le texte, s'il est trop long pour être contenu sur une s


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,527 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales