Entwickler-Ecke

Sonstiges (Delphi) - CheckboxTreeView


hui1991 - Mo 07.05.07 22:41
Titel: CheckboxTreeView
Hallo,

ich suche gerade für mein neues Projekt ein CheckboxTreeView, also man macht sowas wie ein TreeView blos mit CHeckbox zusammen, damit man auch ganze Bäume geselektieren kann. Ich hoffe da kennte jemand eine Komponente dafür.
user defined image

Natürlich freeware ^^
In google keine Freeware gefunden und sonst hier auch nichts gefunden, vllt. war ich einfach nur blind. ^^

MfG
hui1991


Lannes - Mo 07.05.07 23:11

Hallo,

ich kenn da eine Freeware :zwinker:, die Standard-TreeView-Komponete.

Man erstellt zwei Images, gecheckt und nicht gecheckt, diese packt man in eine ImageList, die der Eigenschaft TreeView.StateImages zugewiesen wird.

Durch setzen von StateIndex werden die entsprechenden Images angezeigt.
Im Ereignis OnMouseDown schaltet man dann zwischen den Images um, wenn auf das StateImage geklickt wird.

Überprüfen ob auf das StateImage geklickt wurde und umschalten:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var MyNode : TTreeNode;
begin
  if (htOnStateIcon in TreeView1.GetHitTestInfoAt(x,y)) then
    begin
    MyNode := TreeView1.GetNodeAt(x,y);
    TreeView1.Items.BeginUpdate;
    if MyNode.StateIndex = 2 then
      MyNode.StateIndex := 3
      else
        MyNode.StateIndex := 2;
    end;


hui1991 - Di 08.05.07 14:39

Danke für deine Antwort,

aber gibt es auch schon eine fertige komponente? (Freeware)
Will ja das Rad nicht neu erfinden ^^
Ne, also das ist schon ein Aufwand, wenn man jetzt ein Haupt Baum hat und diesen Abwählt, müssen alle unteren auch abgewählt werden. Wenn jetzt im Baum drinnen einer Abgewählt wird, dann müssen sich die übergeordneten ändern.
Würde gerne auf etwas neues zugreifen.
Ich weis, das Faulheit nicht gern gesehen ist, aber naja ich hab auch nicht gerade viel Zeit, deswegen würde ich lieber eine Fertige komponente haben, die diese Funktion schon drin hat.

MfG
hui1991


Coder - Di 08.05.07 15:35

VirtualTreeView hat Checkboxes.
Ich glaub aber deine Spezialfunktion musst du per ChildNodes selber Programmieren.

MfG


hui1991 - Di 08.05.07 15:50

Hm.. ich glaub da gab es mal eins das genau das was ich braucht.
Das hatte denke ich auch automatisch die Ordner von Arbeitsplatz usw. auch aufgelistet.
Blos wie hieß das.
Hm..
Da ist es auch drauf:
user defined image
Das links die liste da, das TreeView, sowas brauch ich ^^

MfG
hui1991


hui1991 - Do 10.05.07 07:00

Guten Morgen,

also ich habe hier mich doch dran gesetzt und die Situation überschätzt.
Naja Wenn ich etz oben drauf klicke dann werden alle Untergeordneten ab und angewählt.
Blos wenn ich weiter unten eins anschalte bekommen die Oberen kein Quadrat drin, als zeichen, das da drin was angewählt ist.
Ich habe unten eine Grafik gemacht wo der Rote Punkt der Klick mit der Maus bedeutet.
Wenn das Passiert sollte das dann so ausehen wie es da gezeigt wird.
ICh hoffe mir kann jemand erklären wie ich das am Klügsten mache, am besten am Unkomplizierten.
Am besten wäre es, wenn man das in ein Timer stecken kann und es dort laufen lässt.
Es soll der ganze Baum aktualisiert werden.

Hoffe das mir da jemand helfen kann.

MfG
hui1991


Lannes - Do 10.05.07 09:45

Hallo,

warum einen Timer und den ganzen Baum aktualisieren :gruebel: , man muss doch nur die Eltern-Nodes(Parent) aktualisieren.

Such Dir eine Variante aus:

1. while-Schleife

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var aNode : TTreeNode;
begin
  aNode := TreeView.GetNodeAt(x,y);
  while Assigned(aNode.Parent) do
    begin
    aNode := aNode.Parent;
    //hier StateIndex setzen
    end;
end;

2. for-Schleife

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var aNode : TTreeNode;
    z : Integer;
begin
  aNode := TreeView.GetNodeAt(x,y);
  for z := aNode.Level downto 1 do
    begin
    aNode := aNode.Parent;
    //hier StateIndex setzen
    end;{}
end;


3. rekursiv

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure SetStateIcon(aNode: TTreenode);
begin
  //hier StateIndex setzen
  if Assigned(aNode.Parent) then
    SetStateIcon(aNode.Parent);//rekursiv
end;

//...
var aNode : TTreeNode;
begin
  aNode := TreeView.GetNodeAt(x,y);
  if Assigned(aNode.Parent) then
    SetStateIcon(aNode.Parent);
end;


hui1991 - Do 10.05.07 12:16

hi,

lol, es gibt parent naja denken sollte man tun :idea:
Ja bin grad in school

MfG
hui1991