OVH Cloud OVH Cloud

A l'attention des utilisateurs de Treeview

2 réponses
Avatar
Laurent Jordi \(www.ezlogic.mc\)
Salut @ ts...

Je m'adresse aux utilisateurs de treeview (vb 5 & 6) qui trouvent que le
déchargment des nodes est lent...

J'ai trouvé une astuce et je voudrais vous en faire part...

Pour que le déchargement soit instantané il faut détruir l'instance de
l'arbre sans détruire sa collection de nodes. Les puristes pourraient rager
mais bon... Lorsqu'un composant n'a pas les perfs escomptées, il est
nécessaire de contourner le PB...

Lorsque vous construisez votre form et que vous y insérez le treeview, que
nous nommerons MyTree, mettez 0 dans l'index et false dans visible mais
positionnez l'arbre à l'endroit exact où il devra se trouver.

Créez une procédure InitTree er une autre ClearTree.

Dans InitTree utilisez

sub InitTree
Load MyTree(1)
MyTree(1).left = MyTree(0).left
MyTree(1).top = MyTree(0).top
MyTree(1).width= MyTree(0).width
MyTree(1).height = MyTree(0).height
MyTree(1).visible = true
'**** Puis chargez le contenu
end sub

La procédure ClearTree se limitera à
sub ClearTree
Unload MyTree(1)
call InitTree
end sub

Ensuite, au lieu d'utiliser MyTree.nodes...
il vous suffira d'utiliser MyTree(1).nodes...

Ca marche très bien, si vous faites des refresh fréquents de l'arbre, ça
permet de gagner beaucoup de temps, en particulier si l'arbre comporte
beaucoup de nodes...

@+

LJ







Dasn la procédure InitTree, faites un load

2 réponses

Avatar
TINANT Hervé [MVP .NET]
Non seulement cette astuce n'est pas tres propre, mais ca a la limite comme
tu le dis, si les perfs sont meilleurs on peut accepter, mais surtout on ne
recharge que tres rarement un arbre complet, et cette "bidouille" ne permet
pas de rafraichir une partie de l'arbre. Donc meme si au premier abord,
l'astuce est interressante, elle me parait que peut utilisable.

Cordialement,


--
TINANT Hervé (alias Crazyht)
MVP Visual C#.NET

http://www.vbfrance.com
http://www.csharpfr.com

"Laurent Jordi (www.ezlogic.mc)" <inf[o]@ezlogic.mc> a écrit dans le message
de news: %
Salut @ ts...

Je m'adresse aux utilisateurs de treeview (vb 5 & 6) qui trouvent que le
déchargment des nodes est lent...

J'ai trouvé une astuce et je voudrais vous en faire part...

Pour que le déchargement soit instantané il faut détruir l'instance de
l'arbre sans détruire sa collection de nodes. Les puristes pourraient
rager
mais bon... Lorsqu'un composant n'a pas les perfs escomptées, il est
nécessaire de contourner le PB...

Lorsque vous construisez votre form et que vous y insérez le treeview, que
nous nommerons MyTree, mettez 0 dans l'index et false dans visible mais
positionnez l'arbre à l'endroit exact où il devra se trouver.

Créez une procédure InitTree er une autre ClearTree.

Dans InitTree utilisez

sub InitTree
Load MyTree(1)
MyTree(1).left = MyTree(0).left
MyTree(1).top = MyTree(0).top
MyTree(1).width= MyTree(0).width
MyTree(1).height = MyTree(0).height
MyTree(1).visible = true
'**** Puis chargez le contenu
end sub

La procédure ClearTree se limitera à
sub ClearTree
Unload MyTree(1)
call InitTree
end sub

Ensuite, au lieu d'utiliser MyTree.nodes...
il vous suffira d'utiliser MyTree(1).nodes...

Ca marche très bien, si vous faites des refresh fréquents de l'arbre, ça
permet de gagner beaucoup de temps, en particulier si l'arbre comporte
beaucoup de nodes...

@+

LJ







Dasn la procédure InitTree, faites un load




Avatar
Guy DETIENNE
Salut ;O)

Voici une fonction (par API) que j'utilise afin de décharger tous les nodes
d'un TreeView de façon très rapide :

Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As _
Long, ByVal lParam As Long) As Long

Private Const TV_FIRST As Long = &H1100
Private Const TVM_GETNEXTITEM As Long = (TV_FIRST + 10)
Private Const TVGN_ROOT As Long = &H0
Private Const TVM_DELETEITEM As Long = (TV_FIRST + 1)
Private Const WM_SETREDRAW As Long = &HB


Public Sub fClearTreeView(ByVal tvHwnd As Long)

Dim lNodeHandle As Long
' Turn off redrawing on the Treeview for more speed improvements
SendMessageLong tvHwnd, WM_SETREDRAW, False, 0

Do
lNodeHandle = SendMessageLong(tvHwnd, TVM_GETNEXTITEM, TVGN_ROOT, 0)
If lNodeHandle > 0 Then
SendMessageLong tvHwnd, TVM_DELETEITEM, 0, lNodeHandle
Else
Exit Do
End If
Loop

SendMessageLong tvHwnd, WM_SETREDRAW, True, 0
End Sub


Utilisation :

fClearTreeView MyTreeView.Hwnd

Guy
"Laurent Jordi (www.ezlogic.mc)" <inf[o]@ezlogic.mc> a écrit dans le message
de news:%
Salut @ ts...

Je m'adresse aux utilisateurs de treeview (vb 5 & 6) qui trouvent que le
déchargment des nodes est lent...

J'ai trouvé une astuce et je voudrais vous en faire part...

Pour que le déchargement soit instantané il faut détruir l'instance de
l'arbre sans détruire sa collection de nodes. Les puristes pourraient


rager
mais bon... Lorsqu'un composant n'a pas les perfs escomptées, il est
nécessaire de contourner le PB...

Lorsque vous construisez votre form et que vous y insérez le treeview, que
nous nommerons MyTree, mettez 0 dans l'index et false dans visible mais
positionnez l'arbre à l'endroit exact où il devra se trouver.

Créez une procédure InitTree er une autre ClearTree.

Dans InitTree utilisez

sub InitTree
Load MyTree(1)
MyTree(1).left = MyTree(0).left
MyTree(1).top = MyTree(0).top
MyTree(1).width= MyTree(0).width
MyTree(1).height = MyTree(0).height
MyTree(1).visible = true
'**** Puis chargez le contenu
end sub

La procédure ClearTree se limitera à
sub ClearTree
Unload MyTree(1)
call InitTree
end sub

Ensuite, au lieu d'utiliser MyTree.nodes...
il vous suffira d'utiliser MyTree(1).nodes...

Ca marche très bien, si vous faites des refresh fréquents de l'arbre, ça
permet de gagner beaucoup de temps, en particulier si l'arbre comporte
beaucoup de nodes...

@+

LJ







Dasn la procédure InitTree, faites un load