Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

TREEVIEW - fermeture

6 réponses
Avatar
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

6 réponses

Avatar
www.eztree-msdn.com \(Laurent Jordi\)
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" a écrit dans le message de
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





Avatar
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" a écrit dans le message de
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





Avatar
www.eztree-msdn.com \(Laurent Jordi\) Enlever le s à infos pour me contacter par mail
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" a écrit dans le message de
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" a écrit dans le message de
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









Avatar
Guy DETIENNE
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" a écrit dans le message de
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" a écrit dans le message de
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" a écrit dans le message de
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













Avatar
DB
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" a écrit dans le message de 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" a écrit dans le message de
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









Avatar
DB
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" a écrit dans le message de 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" a écrit dans le message de
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