Synchroniser deux treeview sans faire une copie.

Résolu
pracoupeau Messages postés 10 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 5 septembre 2005 - 1 août 2005 à 19:50
pracoupeau Messages postés 10 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 5 septembre 2005 - 2 août 2005 à 01:22
Bonjour,

J'ai une Form "Frm1", toujours chargée, qui doit acceder a un Treeview dans lequel il peu y avoir plus de 10 000 node. Cette Form n'a pas d'interface utilisateur et n'est jamais visible.

Une 2éme Form "Frm2" est chargée de temps en temps par l'utilisateur final, dans laquelle un Treeview montre les données qui peuvent être modifiées, supprimer,...
Cette Frm2 contient beaucoup de controls et ne peut pas être laissée en mémoire pour une question d'optimisation.

J'ai donc besoin de "Synchroniser" ces deux éléments qui, pour une raison évidente de place en mémoire, ne doivent pas être DEUX Treeview, mais un seul.

J'ai essayé un truc du genre :
Dans Frm2 j'ai ajouté un controle Treeview, chargé les données et dans Frm1 j'ai ajouté une variable "Private Tx as Frm2.Tw", ca marche sauf que lorsque Frm2 est déchargée, la prochaine intruction dans Frm1 qui utilise la variable Tx, recharge Frm2 en mémoire à cause de la référence à son objet Tw.

Donc j'ai essayé dans l'autre sens :
J'ai déclaré dans Frm1 "Private Tx as Treeview", j'ai chargé les données dans sa structures, mais lorsque je charge Frm2, (j'ai besoin d'un Treeview avec interface utilisateur), impossible d'affecter une référence d'objet au Treeview de Frm2, l'instruction Set Tw = Frm1.Tx génère une erreur.

Si quelqu'un a une idée pour ne pas avoir 2 Treeview à charger, et pour pouvoir affecter une référence d'objet à un control VB ?

Merci d'avance.

Phil.

3 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
1 août 2005 à 20:28
j'ai essayé ça qui permet d'avoir un seul Treeview qui passe d'une Forme à l'autre

sur la Form2 on a pas les évênements mais on a accès à la Treeview par: Form1.TreeView1.

l'inverse est possible





dans la Form1



Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long



Private Sub Command1_Click()

SetParent TreeView1.hWnd, Form2.hWnd

TreeView1.Visible = True

Form2.Show

Me.Hide

End Sub



dans la Form2



Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long



Private Sub Command1_Click()

MsgBox Form1.TreeView1.SelectedItem.Text

End Sub



Private Sub Form_Unload(Cancel As Integer)

SetParent Form1.TreeView1.hWnd, Form1.hWnd

TreeView1.Visible = False

Me.Hide

Form1.Show

End Sub


Daniel
3
pracoupeau Messages postés 10 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 5 septembre 2005
2 août 2005 à 01:22
Salut,



Heu [auteurdetail.aspx?ID= 84425 nhervagault] , J'ai pas bien compris ta réponse, mais peut être que mon exposé n'était pas très clair. Enfin merci pour ta participation.



Daniel, Merci pour ton aide . En fait ca marche, et pour les
évènements, ils continuent à réagir dans la Form initiale, et on peut
même continuer à s'adresser au control comme si il n'avait pas changé
de Form !



En fait la solution exacte c'est ça :

Dans Form1, il y a le Treeview dessiné sous l'IDE, nom Tw, et tout le
code pour charger les données, traiter les évènements, Clic,
BeforeLabelEdit, ... et RIEN d'autre ( pas d'appel à SetParent.

Sur demande, par un menu contextuel par ex, il y a juste : Form2.Show.



Dans Form2 :

Private Sub Form_Load()

SetParent Form1.Tw.Hwnd, Me.Hwnd

Form1.Tw.Move 200, 200

Form1.Tw.Visible = True



End Sub



Private Sub Form_Unload(Cancel As Integer)

Call SetParent(Form1.Tw.Hwnd, Form1.Hwnd)

End Sub



Quelque part dans le code de Form2, il suffit de s'adresser au Treeview normalement :

Label.caption = Form1.Tw.SelectedItem.Text

(Alors qu'il est dans Form2 !!)
Phil
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
1 août 2005 à 20:21
Salut,



Tu peux gérer avec un seul treeview

Utilises la propriétés TAG pour gérer l'état.



Exemple



nodes.tag = "supprimable"

nodes2.tag = "modifiable"

nodes3.tag = "supprimable|modifiable"



Un split permet de séparé les deux cas.



Pour optimiser

tu peux gérer avec des nombres et les op binaires



1 supprimable

2

4 Modifiable

Si 5 alors les deux



A toi de gérer espérant t'avoir guider dans ton pb.
0
Rejoignez-nous