Bonjour,
comment fait on pour seléctioner plusieur Nodes dune TTreeView avec la souris
en faisant un rectangle(en glissant la souris & faisant un rectangle) sur les nodes desirés.
Merci
Version imprimable
Bonjour,
comment fait on pour seléctioner plusieur Nodes dune TTreeView avec la souris
en faisant un rectangle(en glissant la souris & faisant un rectangle) sur les nodes desirés.
Merci
Je n'ai pas vu ce genre de selection dans un TreeView, essaye plutôt la sélection avec CTRL+Click
avec ctrl+click ca marche tres bien, mais jai beacoup de neux dans ma View, alors jaimerai bien faire une selection rien quavec la souris.
Salut,
Pas le plus simple à faire, et peut-être vaudrait-il mieux réorganiser ton treeview avec plus de sous-noeuds si possible (comme ça un click sur le noeud parent selectionnera tous les enfants), plus deux boutons "tout selectionner" et "tout déselctionner"...
Si ce n'est pas possible, je suppose qu'il va falloir le faire à la main:
Sur le premier OnMouseDown tu récupère l'indice de ton premier noeud (grâce à GetNodeAt(X,Y) ) que tu stock dans une variable. Sur le OnMouseMouve tu récupère l'indice de ton deuxième noeuds et tu lance ta procédure qui colorie ou checked... les items se trouvant entre tes deux noeuds. Sur le OnMouveUp, tu valide ta selection.
A+.
merci PadawanDuDelphi pour lidee, je vais essayé
jai le probleme suivant:
lorsque je fais une selection avec la souris, je la commance pas a partir dun neux, mais en dehors, comme ca, c pas possible de récupèrer l'indice de ce dernier. alor tree.GetNodeAt(x, y) me livre tout le temps un nil.
Effectivement si tu ne click pas sur un noeud tu auras ce problème...Je ne vois que deux solutions avec cette méthode:Citation:
jai le probleme suivant:
lorsque je fais une selection avec la souris, je la commance pas a partir dun neux, mais en dehors, comme ca, c pas possible de récupèrer l'indice de ce dernier. alor tree.GetNodeAt(x, y) me livre tout le temps un nil.
1) Tu met dans le mode d'emploi que la multi-selection ne peut se faire qu'avec une selection sur un noeud.
2) Tu fait une mini fonction pour détecter ton noeud le plus proche (sans pour autant déplacer ton curseur souris). Du style:
Pas tester et clairement à optimiser (De plus, tous les test sont-ils obligatoires, faut-il tester sur les limites de la form...?)...Bref c'était juste une idée comme ça.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 procedure TForm1.TrouverNoeud(sender:TObject;X, Y: Integer): TTreeNode; Const pas:integer =...; //la taille maximum pour laquelle tu es sûr de ne pas rater un noeud voisin (hauteur ou largeur de ta selection d'un noeud). Var Xtest,Ytest: integer; pasEnCours,i:integer; Begin result:=TTreeView(Sender).GetNodeAt(X,Y); if result <>nil then exit; i:=0;pasEnCours:=pas; Xtest:=X;Ytest:=Y; While i<50 do do //test déplacement vers la droite; Xtest:= X+pasEnCours; Ytest:=Y; result:=TTreeView(Sender).GetNodeAt(Xtest,Ytest) if result <>nil then exit; ... //faire les autres tests (gauche, haut, bas, diagonale...) ... inc(pasEnCours,pas); inc(i); End; End;
A+.
Merci PadawanDuDelphi pour l'Idée.
pour le moment je me contante de faire une MultiSelection avec Ctrl ou Shift.
Le reste c un peu compilqué, et jai pas beaucoup le temps.
Soulama
ok, pas de problème...
De toute façon c'est vrai que c'est sûrement pas le plus essentiel, mais si j'arrive à trouver un peu de temps je testerais mon idée...Et je te tiendrais au courant si j'arrive à un truc utilisable.
A+, et bon courage.
super :king:
Donc, après deux-trois tests, il s'est avéré que mon idée était un peu compliquée à mettre en oeuvre (à cause de l'arborescence, et du fait qu'une partie du treeview peut-être dissimulé par le bord de la fenêtre).
J'ai donc essayer autre chose, une sélection type word ou ouverture d'unités Delphi. (c.a.d: premier clic sur ton treview=>selection de celui-ci, puis maj+clic sur un autre noeud=> selection de tous les noeuds entres ces derniers)
A toi de voir si ça te convient, et à l'améliorer dans ce cas.
A+.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 type TForm1 = class(TForm) TreeView1: TTreeView; private node: TTreeNode; End; .... procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var nodeTemp:TTreeNode; i, max, min:integer; begin nodeTemp:= treeview1.GetNodeAt(X,Y); if (ssShift in Shift) And (node <> nil) then Begin Max:=nodeTemp.AbsoluteIndex; Min:= node.AbsoluteIndex ; If Max<Min then begin i:=Max; Max:=Min; Min:=i; End; // inversion des limites si le second noeuds est situé au dessus du premier dans l'arborescence. For i:= min to max do ShowMessage(treeview1.Items[i].Text); // A remplacer par la coloration de tes items en mode "selectionner" (fond bleu) End; node:= nodeTemp; end;
Super Idée Padawan, je me suis inspiré beaucoup du Code.
Enfin jai utilisé la Procedure: Select(Nodes: TList);, en enregistrant tout le noeux qui on eté clické par l'user entre le Min & Max Value dans une TList Globale.
Merci quandmeme.
Soulama