Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - bestimmten Item einer TTreeView selektieren


Robert - Di 17.09.02 18:42
Titel: bestimmten Item einer TTreeView selektieren
Hi!
Ich habn Problem. Könnte mir jemand saen, wie man ein Item einer TreeView auswählt?
Sagen wir mal, ich wollte das zweite Item der gesamten Baumstrucktur auswählen. Das wäre dann ja das erste Item im ersten Zweig der Treeview.
Aber welchen Quellecode muss ich dafür eingeben?

Vielen Dank im Vorraus


LCS - Di 17.09.02 18:49

Hi
wenn du definitiv weisst, dass es sich um das zweite Item handelt, kannst du einfach über den Index der Items darauf zugreifen.

Quelltext
1:
  Treeview1.Items[1].Selected := True;                    


Gruss Lothar


Robert - Di 17.09.02 19:12

Danke!
Jedoch wenn ich mit folgendem versuche, die ersten beiden Zeichen des Textes der TreeView in Icons umzuwandel, dann werden nur die Items der ersten Ebene "beICONt":

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
    Markiert_beim_laden: string;
    Image_number: integer;
begin
    for i:=0 to TreeView1.Selected.Count+0 do begin
      Markiert_beim_laden := TreeView1.Selected.Text;
      Image_number := strtoint(Copy(TreeView1.Selected.Text, 1, 2));
      TreeView1.Selected.ImageIndex    := Image_number;
      TreeView1.Selected.SelectedIndex := Image_number;
      Delete(Markiert_beim_laden, 1, 2);
      TreeView1.Selected.Text := Markiert_beim_laden;
      Treeview1.Items[TreeView1.Selected.Count + 1].Selected := True;
    end;
end;


aogwaba - Di 17.09.02 23:01

Hi!

Quelltext
1:
for i:=0 to TreeView1.Selected.Count+0 do begin                    


Liefert die Root-Knoten. Wenn du alle Knoten ansprechen willst, musst
du dich rekursiv durch die Baumstruktur hangeln.

Wieso eigentlich +0?

cu
waba


Delete - Mi 18.09.02 08:11


Quelltext
1:
for i:=0 to TreeView1.Selected.Count+0 do begin                    

Das berücksichtigt die Root-Knoten wohl nur, wenn "Selected" der Super-Root ist. Wenn du gar nichts gewählt hast, und "Selected" demzufolge nil ist, rumpelt´s schon mal.

Quelltext
1:
2:
3:
4:
for i := 0 to TreeView1.Items.Count - 1 do
  if(TreeView1.Items.Item[i].Level = 0) then // <--
    begin
    end;

bringt tatsächlich alle Root-Knoten des TreeView.

Warum in der Funktion von Robert da ein +Null steht, ist mir allerdings auch ein Rätsel.:?:


Robert - Mi 18.09.02 14:42

Hi!
Das hat leider nur die Wirkung des ersten Codes auch.
Was ich will isz folgendes:

Quelltext
1:
2:
3:
4:
5:
6:
7:
if ("selected Node" <> "letzter Node der TreeView") and (modus = 'laden') then begin
...mach irgendwas...;
Wähle nächsten Node aus;
end else begin
...mach irgendwas...;
modus = 'fertig'; //hauptsache nicht 'laden, dann würde 'if ...' wieder von vorne losgehen
Wähle ersten Node überhaupt aus;
Das geht mit dem anderen Code leider nicht. Der andere wählt nur die ersten beiden Übergeordneten Nodes aus.
Kann mir jemand helfen?


Delete - Mi 18.09.02 18:57

Hi Robert.

Darf ich ehrlich sein? So ganz habe ich immer noch nicht kapiert, was du eigentlich machen willst. Aber wir können ja versuchen, das anhand eines Beispiels zu klären. Also, mein TreeView ("tv1" genannt, weil ich zu lange Kompo-Namen im Code hasse :wink:) sieht so aus:

Quelltext
1:
2:
3:
4:
5:
6:
[ ] Erster Eintrag
[-] Zweiter Eintrag
    [ ] Ein Unterknoten in Punkt 2
[-] Dritter Eintrag
    [-] Ein Unterknoten in Punkt 3
         [ ] Ein Unterunterknoten

Bis hier kein Problem. Folgende Funktion "Button1.OnClick" zeigt dir alle Knoten, die sich im Hauptverzeichnis des Baums befinden:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
begin
  with tv1,Items do
    for i := 0 to Count - 1 do
      if(Item[i].Level = 0) then    // <-- mal auskommentieren!
        ShowMessage(Item[i].Text);
end;

Kommentier nach dem Test einfach mal die von mir markierte Zeile aus, und probier´s erneut. Es ist also so, dass du ohne die Level-Prüfung durch den kompletten Baum gehst.

Die nächste Prozedur (Button2.OnClick) zeigt dir den allerersten und den allerletzten Knotennamen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button2Click(Sender: TObject);
begin
  with tv1 do
    begin
      ShowMessage(Items[0].Text);
      ShowMessage(Items[Items.Count-1].Text);
    end;
end;

Und wenn du mal die Einträge aus meinem TreeView bei dir benutzt, dann wirst du sehen, dass der allerletzte Eintrag nicht zwangsläufig im Hauptverzeichnis sein muss.

Und zu guter Letzt, diese Funktion hier:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button3Click(Sender: TObject);
var
  i : integer;
begin
  with tv1,Items do
    begin
      // zuerst mal der Reihe nach auswählen
      for i := 0 to Count - 1 do
        begin
          Selected := Item[i];
          SetFocus;   // <-- damit man´s auch sieht!
                      // oder "HideSelection" im Objektinspektor auf
                      // FALSE setzen!!

          sleep(150); // <-- damit´s nicht zu schnell geht
        end;

      // jetzt den allerersten Knoten auswählen
      Selected := Item[0];
    end;
end;

wählt sich der Reihe nach durch den Baum und springt am Schluss wieder auf den allerersten Knoten zurück.

So, ich hoffe, das hilft dir weiter.

Gruß,
Mathias.


Robert - Mi 18.09.02 19:35

ja, danke, hat mir weiter geholfen. Die letzte Funktion.
Wenn du das Programm 'MagazinCollector 1.0' haben willst: ICh werde es auf AUQ.de posten und, wenn du willst, schick ich dir eine Mail mit dem Code und der eigentlichen Install-datei.
Musst du mir halt sagen.