Autor Beitrag
meckert77
Hält's aus hier
Beiträge: 9

Win XP, Win 2003
Delphi 7
BeitragVerfasst: Do 29.09.05 20:16 
Danke für die Antworten zu meinen bisherigen Themen. Ich konnte eine Menge daraus ziehen. Und dennoch stehe ich wieder vor einem Problem welches mich zu Verzweiflung bringt und schon diese schauderhafte Prozedur hervorgebracht hat.

ausblenden volle Höhe Delphi-Quelltext
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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
procedure TfmStart.btOProjectClick(Sender: TObject);
  var
    tmp: PHtmlProject;
    PName : string;
    FName : string;
    NodeName : TTreeNode;
  begin
    if OpenDialog1.Execute then
    begin
      if FileExists(OpenDialog1.FileName) then
      begin
        HtmlListe:= LoadFromFile((Opendialog1.FileName));
        GProjectName:= OpenDialog1.FileName;
        if IsEmpty(HtmlListe) then
          ShowMessage('Datei ist leer ???')
        else
        begin
          tmp:= HtmlListe;
          EditField1.Clear;
          while not IsEmpty(tmp) do
          begin
            Editfield1.Items.Add(ExtractFileName(tmp^.Speicherort));
            tmp:= tmp^.next;
          end;
        end;
    GStatus:= ST_OFFEN_PROJ;
    end
    else
      ShowMessage('Die Datei '+OpenDialog1.FileName+' existiert nicht ;o)');

    if (GProjectName <> '') then
      if (trProject.Items.Count = 0) then
      begin
        with trProject.Items.AddFirst( nil, 'ROOT') do
        begin
          Selected:= True;
          //RootImage
          ImageIndex:= IMG_NODE_ROOT;
          SelectedIndex:= IMG_NODE_ROOT;
          MakeVisible;
        end;
        ShowMessage(InttoStr(trProject.Items.Count));
        tmp:= HtmlListe;
        While (tmp <> nil) do
        begin
          PName:= ExtractFilePath(tmp^.Speicherort);
          FName:= ExtractFileName(tmp^.Speicherort);
          tmp:= tmp^.next;
          with trProject.Items.AddChildFirst(trProject.TopItem,  PNAME) do
          begin
            Selected:= True;
            ImageIndex:= IMG_NODE_FOLDER;
            SelectedIndex:= IMG_NODE_FOLDER;
            MakeVisible;
            NodeName:= trProject.Selected;
          end;
            with trProject.Items.AddChild(NodeName, FName) do
            begin
              ImageIndex:= IMG_NODE_FILE;
              SelectedIndex:= IMG_NODE_FILE;
              MakeVisible;
            end;
        end;
      end
    else ShowMessage('HALLO PETER');
  end;
end;


1. Ich bekomme keine Bilder angezeigt obgleich ich eine Imagelist einbinde. WARUM?
2. Es kommt vor, dass in einem Ordner mehrere Dateien liegen. Ich will den Ordner aber nur einmal als Knoten angezeigt bekommen und diesen abfragen können um ggf. weitere Kindknoten an den schon vorhandenen Knoten zu hängen.

Derzeitig ist es mir möglich, meine ausgewählten Ordner und die Verzeichnisse anzuzeigen als Baum. Jedoch ist das nicht Uniq. Ich weiß nicht wie ich prüfen kann, ob es einen Knoten schon gibt oder nicht. Und ich würde gern verhindern, dass Knoten die einem Ordner entsprechen auch Selektiert werden können. Geht das?????

Das wichtigste ist für mich, wie spreche ich die einzelnen Knoten an. Es muss doch möglich sein, das in folgender Form zu tun.

Ist ein Knoten mit diesem Namen schon vorhanden, dann hänge nur was an diesen knoten. Wahrscheinlich muss dieser vorher selektiert werden aber wie?
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Fr 30.09.05 09:21 
1.
-Imagelist hinzufügen
-ImageList an Komponente koppeln(.Images,.StateImages)
-Node.Imageindex zuweisen(stimmen deine Konstanten?)

2.
Siehe Treeviewtutorial "Preventing Dublicates" users.iafrica.com/d/.../TTreeView_eg04.html

Ich empfehle dir Kommentare reinzubaun und evtl in eigene Teilprozeduren zu modularisieren, du siehst nachher nicht mehr durch welche Schleife was macht, insbesondere wenn du nach 2Wochen wieder rein schaust.

Optimal wäre es eine eigene Komponente die von TCustomTreeView abgeleitet ist zu benutzen, dann hast du das schön modularisiert und du hast bessere Filtermöglichkeiten.
meckert77 Threadstarter
Hält's aus hier
Beiträge: 9

Win XP, Win 2003
Delphi 7
BeitragVerfasst: Fr 30.09.05 10:17 
Titel: Modularisierung. Zugriff auf einzelne Elemente?
Ich habe die Procedure nun zu einer eigenen Procedure umgebaut. Soweit klappt dass alles ganz gut. Es gibt eben nur eine Sach, die mir nicht klar ist.

Wie spreche ich die Knoten an. Es muss doch möglich sein einen Knoten zu finden der sagen wir mal so erzeugt wird.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
//Alle Knoten die am ROOT direkt hängen
with trProject.Items.AddChildFirst(NodeName, 'Knotenname') do
   begin
      ImageIndex:= IMG_NODE_FILE;
      SelectedIndex:= IMG_NODE_FILE;
      MakeVisible;
   end;

Dann heißt der Knoten doch Knotenname oder nicht. Der Link war bis hier schon eine gute Hilfe jedoch habe ich das nun gar nicht verstanden. Wie finde ich raus, ob an dem ROOT schon ein Knoten mit diesem Namen existiert und wenn dieser Knoten schon existiert dann Hänge den Folgenden Knoten bitte an den schon existierenden.

Da fehlts mir an Verständnis.

Danke

Moderiert von user profile iconKlabautermann: Delphi-Tags hinzugefügt.
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Fr 30.09.05 11:28 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
If Node.HasChildren then
begin
  // alle Unterknoten durchsuchen
  for i:= 0 to Node.Count do
  begin
    if Node.Item[i].Text ='BeispielNode' then
      begin
        // An Unterknoten anhängen
        TreeView.Items.AddChild(Node.Item[i],'neuer Node');
      end;
  end;
end;
meckert77 Threadstarter
Hält's aus hier
Beiträge: 9

Win XP, Win 2003
Delphi 7
BeitragVerfasst: Fr 30.09.05 13:32 
Titel: Ansprechen der Knoten
Hallo Ich habe nun meine Funktion versucht zu bearbeiten aber scheinbar verstehe ich deine Erklärung nicht richtig:

ausblenden volle Höhe Delphi-Quelltext
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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
Procedure TfmStart.CreateTree(L: PHtmlProject);
var
    tmp: PHtmlProject;
    PName : string;
    FName : string;
    NodeName : TTreeNode;
begin
    if (GProjectName <> '') then
      begin
      //Wenn neues Project geoeffnet wird, dann muss der Baum gelöscht werden
        if (trProject.Items.Count <> 0) then
          trProject.TopItem.Delete;
          //Erzeugen des Root Items
          if (trProject.Items.Count = 0) then
            begin
            //Pruefen ob Knoten an Root schon existiert
              with trProject.Items.AddFirst( nil, 'ROOT') do
                begin
                  Selected:= True;
                  //RootImage
                  //Bilder koennen nur angezeigt werden, wenn die ImageList Komponente
                  //auch eingebunden wird.
                  ImageIndex:= IMG_NODE_ROOT;
                  //Image welches angezeigt wird, wenn der Eintrag selectiert ist
                  SelectedIndex:= IMG_NODE_ROOT;
                  MakeVisible;
                end;
            tmp:= HtmlListe;
            While (tmp <> nil) do //Liste nicht leer
              begin
                PName:= ExtractFilePath(tmp^.Speicherort); //Speicherort als Children von Root
                FName:= ExtractFileName(tmp^.Speicherort); //Filename als Children von Speicherort
                tmp:= tmp^.next; //Elementer der Liste in der Speicherort unf Dateiname stehen
                    with trProject.Items.AddChildFirst(trProject.TopItem,  PNAME) do
                      begin
                        Selected:= True;
                        ImageIndex:= IMG_NODE_FOLDER;
                        SelectedIndex:= IMG_NODE_FOLDER;
                        MakeVisible;
                        NodeName:= trProject.Selected;
                      end;
                      with trProject.Items.AddChild(NodeName, FName) do
                        begin
                          ImageIndex:= IMG_NODE_FILE;
                          SelectedIndex:= IMG_NODE_FILE;
                          MakeVisible;
                        end;
              end;
            dispose(tmp); //Liste wieder freigeben
          end;
        end
          else if (trProject.Items.Count > 0) then //Wenn die Liste mehrfach geoeffnet wird soll nur ein Baum existieren also ROOT loeschen
            trProject.TopItem.Delete;
end;


Ich verstehe nicht, wieso du in deiner Procedure Node.HasChildren etc ausführen kannst. Wenn ich wüsste wie ich meinen RootNode direkt ansprechen kann dann wäre mir sicher geholfen. Also muss ich eigentlich wissen, wie kann ich den Knoten Root oder einen beliebigen Knoten direkt ansprechen. Das muss doch möglich sein.

Ja und wenn ich weiß wie ich den RootKnoten oder so direkt ansprechen kann dann kann ich auch auf Items.Text vergleichen.

Gibts sowas nachdem die Procedure durchgelaufen ist. Wie etwa

Selektiere den Knoten der Root heisst und Liste alle Kinder von ROOT auf:
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Di 04.10.05 07:41 
Ich glaube deine Verwirrung kommt von den zwei unterschiedlichen Objekten TTreeNode und TTreeNodes.
Das einfachste wäre eine Schleife die alle Knoten durchgeht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
for i:= 0 to TreeView.Items.Count-1 do
begin
  if Node.Level = 0 then
  begin
    if Node.HasChildren then ...
  end;
end;


Das ist natürlich ziemlich blöde aber ich habe grad keine Zeit und ist ja außerdem erst Dienstag, ich muss erstmal wach werden ;)