Saturation treeview lors de copie de node

Résolu
retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007 - 28 sept. 2006 à 15:41
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 30 sept. 2006 à 05:10
J'ai 2 treeview. La première récupère ses données dans une table, ensuite, on peut faire passer des données de la première vers la deuxième. J'utilise pour cela une boucle for pour copier les items.


Voici un bout du code:
nnode:=treecust.Items.AddChild(nil,treefields.Selected.text);


       for i := 0 to treefields.Selected.count - 1 do
       begin
       if(getindex(treefields.Selected.Item[i].text, nnode) < 0 ) then //
          treecust.Items.AddChild(nnode,treefields.Selected.Item[i].Text);
          application.ProcessMessages;
           progressbar1.StepBy(1);
       end;


function TFORM1.getindex(str: string; inode : ttreenode) : integer;
  var
  i:integer;
  begin
  result:= -1;
      for i := 0 to inode.Count - 1 do
       begin
           if (Lowercase(inode.Item[i].Text)=lowercase(str)) then
             result:=i
       end;
  end;

Le soucis c'est que au delas d'une centaine d'enregistrement, le processeur est saturé, et cela mets beaucoup de temps à copier ... Quelqu'un aurait-il une autre méthode pour copier efficacement 2 nodes? Sachant que la node de destination n'est peut être pas vide, et ne dois pas avoir de doublons.


Merci d'avance./ /¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

8 réponses

retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007
28 sept. 2006 à 19:01
Ben j'avais cherché dans l'aide, mais j'avais rien trouvé d'intéressant :s
Sinon oui je galère pas mal avec les treeviews ... Je comprends ton code, mais je crois pas que ça soit ce que je recherche... Mon but est de lister toutes les valeurs des différents champs d'une table, puis ensuite de pouvoir les regrouper dans le second treeview, en pouvant nommer ces regroupements, et en évitant les doublons, afin de pouvoir créer facilement des vues.
 
J'ai règlé mon problème autrement, en fait, vu que les données étaient chargée d'une base de données, j'ai recopié directement depuis la base de donnée, et non depuis l'autre treeview, et apparement ça marche plutôt bien... J'ai aussi supprimer le test pour savoir si chacun des élements existait, puisque c'était inutile...

Je te remercie quand même de m'avoir consacrer un peu de ton précieux temps ;)
3
Utilisateur anonyme
28 sept. 2006 à 18:53
Salut,

Encore avec ton TreeView ?? Ben alors on luttte lol.

Après la séquence détente, la séquence dispute : Tu es prié de chercher avant de poster. La touche F1 sert à quoi ??????

procedure TForm1.Button1Click(Sender: TObject);
Var
i : integer;
ACnode : TTreeNode;
begin
For i:=0 to (TreeView1.items.count-1) do // On fait une ptite boucle
Begin
If TreeView1.Items[i].parent=nil then //si pas de parent
TreeView2.Items.add(nil,TreeView1.items[i].text) //alors on additionne
Else TreeView2.Items.addChild(TreeView2.items[i-1],TreeView1.items[i].text); //sinon on additionne comme enfant à partir du TreeNode précédent
end;
End;

C'est quand meme netement moins pourris que ton code : lol.

TU sais quoi ? ca m'a pris 5 min en cherchant avec le bouton F1.

Et encore on doit pouvoir peaufiner
0
Utilisateur anonyme
28 sept. 2006 à 18:58
Un peu plus correct pour le fun :

procedure TForm1.Button1Click(Sender: TObject);
Var
i : integer;
ACnode : TTreeNode;
begin
TreeView2.Items.add(nil,TreeView1.items[0].text);
For i:=1 to (TreeView1.items.count-1) do
Begin
If not assigned(TreeView1.Items[i].parent) then TreeView2.Items.add(nil,TreeView1.items[i].text)
Else TreeView2.Items.addChild(TreeView2.items[i-1],TreeView1.items[i].text);
end;
End;
0
Utilisateur anonyme
28 sept. 2006 à 19:04
Heu mon code fonctionne : il copie intégralement les items de treeview1 dans le treeview2 et il n'y a pas de doublon (maintenant si dans le treeview1 tu as deux items qui ont le meme string, il en sera de même dans le treeview2 : c'est une copie parfaite ^^).

Le mieux est de tester : tu prends deux treeview et un bouton. Et hop le tour est joué
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007
28 sept. 2006 à 22:59
Justement je ne voulais pas faire une copie parfaite, mais pouvoir n'ajouter qu'une node du treeview1 dans le treeview2, et si cette node existe déja dans le 2, prendre uniquement les élements qui n'existent pas !
Enfin laisse tomber j'ai réeussi a me débrouiller :)
0
retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007
28 sept. 2006 à 23:18
Ps, je n'avais pas vu ton deuxième post, à quoi sert la fonction assigned? J'ai pas delphi sous les yeux la, j'irai voir demain dans l'help sinon. Merci.
0
Utilisateur anonyme
29 sept. 2006 à 08:33
assigned veut dire assigné lol

Donc si le premier item du treeview n'est pas assigné alors .....

@+
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
30 sept. 2006 à 05:10
for i := 0 to treefields.selected.count-1 do begin
   if (getindex(treefields.Selected.Item[i].text, nnode) < 0 ) then
      treecust.Items.AddChild(nnode,treefields.Selected.Item[i].Text);
   if (i mod 2) <> 0 then begin
      application.ProcessMessages;
      progressbar1.StepBy(2);
   end;
end;


function getindex(const str: string; inode : ttreenode) : integer;
var
  lt: string;
  i : integer;
begin
  result := -1;
  lt     := LowerCase(Str);

  for i := 0 to inode.Count - 1 do
      if Lowercase(inode.Item[i].Text) = lt then begin
         result := i
         exit;
      end;
end;






<hr size="2" width="100%" />
Croc (click me)
0
Rejoignez-nous