TREEVIEW - fermeture

Le
DB
Bonjour !

J'ai un formulaire avec un treeview qui affiche 5000 noeuds.
Lorsque j'ouvre le formulaire, l'affichage des 5000 noeuds prend 1,5
seconde.
Lorsque je ferme le formulaire, cela prends 5 secondes !!!!.
Pourtant je met la variable du treeview à nothing lorsque les noeuds sont
affichés.
Plus il y a de noeuds plus le formulaire est long à fermer !!!?
Je ne comprends pas.

Merci d'avance
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
www.eztree-msdn.com \(Laurent Jordi\)
Le #5373521
Salut !

Il m'a fallu très longtemps pour régler ce problème et je n'ai pu le faire
qu'en vb...

L'astuce était de construire dynamiquement le composant treeview. Puis de le
décharger avec la commande unload. Malheureusement access ne supporte pas la
construction dynamique des contrôles.

Si tu sais faire un active x tu pourrais résoudre le problème. Si tu ne le
sais pas, je pourrais le faire pour toi.

Il me faudrait une demie journée. Si tu es intéressé, contacte moi par mail.

@+

LJ

www.eztree-msnd.com
www.ezlogic.mc

"DB" news:c70vfn$4vr$
Bonjour !

J'ai un formulaire avec un treeview qui affiche 5000 noeuds.
Lorsque j'ouvre le formulaire, l'affichage des 5000 noeuds prend 1,5
seconde.
Lorsque je ferme le formulaire, cela prends 5 secondes !!!!.
Pourtant je met la variable du treeview à nothing lorsque les noeuds sont
affichés.
Plus il y a de noeuds plus le formulaire est long à fermer !!!?
Je ne comprends pas.

Merci d'avance





Guy DETIENNE
Le #5373401
Salut ;O)

Une éventuelle solution serait de supprimer tous les éléments du TreeView
avant la fermeture du formulaire.

La méthode Clear du TreeView étant super lente lorsqu'il y a bcp de noeuds,
un nettoyage via API reste le plus rapide. J'ai testé est c'est
phénoménale.

Essaye ceci :

A coller dans un module :


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 TVM_DELETEITEM As Long = (TV_FIRST + 1)
Private Const TVGN_ROOT As Long = &H0
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 :

Call fClearTreeView(Me.MonListView.Hwnd)


J'espère que cela répondra à ton problème.

Guy


"DB" news:c70vfn$4vr$
Bonjour !

J'ai un formulaire avec un treeview qui affiche 5000 noeuds.
Lorsque j'ouvre le formulaire, l'affichage des 5000 noeuds prend 1,5
seconde.
Lorsque je ferme le formulaire, cela prends 5 secondes !!!!.
Pourtant je met la variable du treeview à nothing lorsque les noeuds sont
affichés.
Plus il y a de noeuds plus le formulaire est long à fermer !!!?
Je ne comprends pas.

Merci d'avance





www.eztree-msdn.com \(Laurent Jordi\) Enlever le s à infos pour me contacter par mail
Le #5373371
Salut

Beau boulot... Si c'est aussi rapide que tu le dis... C'est pas mal.
Quitte à utiliser les api. Ne serai-t-il pas possible d'utiliser un
destructeur pour la collection des Nodes ?

@+

LJ

"Guy DETIENNE" news:
Salut ;O)

Une éventuelle solution serait de supprimer tous les éléments du TreeView
avant la fermeture du formulaire.

La méthode Clear du TreeView étant super lente lorsqu'il y a bcp de
noeuds,

un nettoyage via API reste le plus rapide. J'ai testé est c'est
phénoménale.

Essaye ceci :

A coller dans un module :


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 TVM_DELETEITEM As Long = (TV_FIRST + 1)
Private Const TVGN_ROOT As Long = &H0
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 :

Call fClearTreeView(Me.MonListView.Hwnd)


J'espère que cela répondra à ton problème.

Guy


"DB" news:c70vfn$4vr$
Bonjour !

J'ai un formulaire avec un treeview qui affiche 5000 noeuds.
Lorsque j'ouvre le formulaire, l'affichage des 5000 noeuds prend 1,5
seconde.
Lorsque je ferme le formulaire, cela prends 5 secondes !!!!.
Pourtant je met la variable du treeview à nothing lorsque les noeuds
sont


affichés.
Plus il y a de noeuds plus le formulaire est long à fermer !!!?
Je ne comprends pas.

Merci d'avance









Guy DETIENNE
Le #5373331
Salut ;O)

Selon moi c'est la façon la plus efficace de vider un TreeView.
Je n'ai jamais vu d'autre façon de faire. Et cette méthode fonctionne à
merveille.

Le principe est d'empêcher le "redessinement" du TreeView et de virer tous
les Nodes et ensuite de réactiver le "redessinement". Tout cela par API qui
sont dans la plupart des cas, bcp plus rapides que via VB.

Guy

"www.eztree-msdn.com (Laurent Jordi) Enlever le s à infos pour me contacter
par mail" news:%
Salut

Beau boulot... Si c'est aussi rapide que tu le dis... C'est pas mal.
Quitte à utiliser les api. Ne serai-t-il pas possible d'utiliser un
destructeur pour la collection des Nodes ?

@+

LJ

"Guy DETIENNE" news:
Salut ;O)

Une éventuelle solution serait de supprimer tous les éléments du
TreeView


avant la fermeture du formulaire.

La méthode Clear du TreeView étant super lente lorsqu'il y a bcp de
noeuds,

un nettoyage via API reste le plus rapide. J'ai testé est c'est
phénoménale.

Essaye ceci :

A coller dans un module :


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 TVM_DELETEITEM As Long = (TV_FIRST + 1)
Private Const TVGN_ROOT As Long = &H0
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 :

Call fClearTreeView(Me.MonListView.Hwnd)


J'espère que cela répondra à ton problème.

Guy


"DB" news:c70vfn$4vr$
Bonjour !

J'ai un formulaire avec un treeview qui affiche 5000 noeuds.
Lorsque j'ouvre le formulaire, l'affichage des 5000 noeuds prend 1,5
seconde.
Lorsque je ferme le formulaire, cela prends 5 secondes !!!!.
Pourtant je met la variable du treeview à nothing lorsque les noeuds
sont


affichés.
Plus il y a de noeuds plus le formulaire est long à fermer !!!?
Je ne comprends pas.

Merci d'avance













DB
Le #5373251
J'ai essayé ta solution mais cela ne change rien. c'est toujours aussi long.
Peut-être que j'ai oublié quelque chose !??
Récapitulons :
Je suis sous Access 97 (je n'ai pas le choix)
Le controle treeview se rempli sur l'événement Sur chargement du formulaire.
J'ai collé ton code dans un module.
Call fClearTreeView(Me.Treeview.Hwnd) est exécuté quand le ferme le
formulaire (bonton fermer)

As-tu une explication.
Merci d'avance


"Guy DETIENNE"
Salut ;O)

Une éventuelle solution serait de supprimer tous les éléments du TreeView
avant la fermeture du formulaire.

La méthode Clear du TreeView étant super lente lorsqu'il y a bcp de
noeuds,

un nettoyage via API reste le plus rapide. J'ai testé est c'est
phénoménale.

Essaye ceci :

A coller dans un module :


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 TVM_DELETEITEM As Long = (TV_FIRST + 1)
Private Const TVGN_ROOT As Long = &H0
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 :

Call fClearTreeView(Me.MonListView.Hwnd)


J'espère que cela répondra à ton problème.

Guy


"DB" news:c70vfn$4vr$
Bonjour !

J'ai un formulaire avec un treeview qui affiche 5000 noeuds.
Lorsque j'ouvre le formulaire, l'affichage des 5000 noeuds prend 1,5
seconde.
Lorsque je ferme le formulaire, cela prends 5 secondes !!!!.
Pourtant je met la variable du treeview à nothing lorsque les noeuds
sont


affichés.
Plus il y a de noeuds plus le formulaire est long à fermer !!!?
Je ne comprends pas.

Merci d'avance









DB
Le #5373241
J'ai essayé ta solution mais cela ne change rien. c'est toujours aussi long.
Peut-être que j'ai oublié quelque chose !??
Récapitulons :
Je suis sous Access 97 (je n'ai pas le choix)
Le controle treeview se rempli sur l'événement Sur chargement du formulaire.
J'ai collé ton code dans un module.
Call fClearTreeView(Me.Treeview.Hwnd) est exécuté quand je ferme le
formulaire (bonton fermer)

As-tu une explication.
Merci d'avance


"Guy DETIENNE"
Salut ;O)

Une éventuelle solution serait de supprimer tous les éléments du TreeView
avant la fermeture du formulaire.

La méthode Clear du TreeView étant super lente lorsqu'il y a bcp de
noeuds,

un nettoyage via API reste le plus rapide. J'ai testé est c'est
phénoménale.

Essaye ceci :

A coller dans un module :


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 TVM_DELETEITEM As Long = (TV_FIRST + 1)
Private Const TVGN_ROOT As Long = &H0
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 :

Call fClearTreeView(Me.MonListView.Hwnd)


J'espère que cela répondra à ton problème.

Guy


"DB" news:c70vfn$4vr$
Bonjour !

J'ai un formulaire avec un treeview qui affiche 5000 noeuds.
Lorsque j'ouvre le formulaire, l'affichage des 5000 noeuds prend 1,5
seconde.
Lorsque je ferme le formulaire, cela prends 5 secondes !!!!.
Pourtant je met la variable du treeview à nothing lorsque les noeuds
sont


affichés.
Plus il y a de noeuds plus le formulaire est long à fermer !!!?
Je ne comprends pas.

Merci d'avance









Publicité
Poster une réponse
Anonyme