Skocz do zawartości
olesio

[Delphi] Dodawanie elementow do TreeView w opdowiedni sposób

Polecane posty

Witam. Piszę również na to forum, bo można zawsze liczyć na Waszą pomoc :)

 

Nie jestem zbytnio wprawiony w obsłudze TreeView, a chciałem zrobić jedną rzecz.

Aianowicie mam plik a.txt, który wygląda na przykłąd tak jak poniżej:

 

KOD

arts\artIcons_1\ace.ico

arts\artIcons_1\arabesque.ico

arts\artIcons_2\magichat.ico

arts\artIcons_2\mouse.ico

sport\baseball_caps\al umpire.ico

sport\baseball_caps\texas rangers.ico

sport\f1_helmets\alessandro.ico

sport\f1_helmets\ayrton.ico

 

To co po ostatnim \ to nazwa ikony, ale ona jest nieważna. Ilość wpisów jest

zawsze różna. Chce uzyskać taki efekt, aby moje drzewo wygladalo nastepująco:

 

KOD

arts

|- articons_1

|- artIcons_2

 

sport

|- baseball_caps

|- f1_helmets

 

Czy ktoś może robił coś podobnego i ma przykładowy kod jak to zrobić, bo ja chcę

żeby program jak spotka po "arts\" nowy wpis (na przykłąd "sports\") to stworzy

nowy głowny item, a to co jest późniiej po \ będzie subitemem czyli tylko raz ma

byc artIcons_1, później artIcons_2 i tak dalej. Kombinowałem z takim kodem jak

ten poniżej ale on tworzy takie drzewo jak poniżej czyli powtarza wpisy, a tego

nie chce. Jakby ktoś miał pomysł jak to zrobić to proszę o podzielnie sie kodem.

 

Mój kod póki co wygląda tak. Na kóncu następuje rozwinięcie wszystkich gałęzi:

var
 I, X : integer;
 SL : TStringList;
 TN : TTreeNode;
 OldDir, Dir, Sciezka : string;
begin
 SL := TStringList.Create;
 SL.LoadFromFile('a.txt');
 I := 0;
 repeat
 Sciezka := (SL[I]);
 OldDir := Copy(Sciezka, 1, Pos('', Sciezka) - 1);
   if I [ SL.Count - 1 then
   begin
   X := Pos('', SL[I+1]) + 1;
   Dir := Copy(SL[I+1], X, MaxInt);
   X := Length(Dir);
      while Dir[X] [] '' do
      begin
      Delete(Dir, X, 1);
      X := X - 1;
      end;
    Delete(Dir, Length(Dir), 1);
    end;

 if Dir [] OldDir then
 begin
 TN := TreeView1.Items.Add(nil, OldDir);
 TreeView1.Items.AddChild(TN, Dir);
 end;
Inc(I);
until I = SL.Count;

// Rozszerzenie wszystkich gałęzi
 for I := 0 to TreeView1.Items.Count - 1 do
 begin
 TreeView1.Items[I].Expand(False);
 end;

// Ustawienie zaznaczenia na samą górę
 TreeView1.Items[0].Selected := True;
 TreeView1.Items[0].Expand(False);
end;

I tworzy taką listę:

Obrazek

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

No tak, jak masz:

 

if Dir [] OldDir then

begin

TN := TreeView1.Items.Add(nil, OldDir);

TreeView1.Items.AddChild(TN, Dir);

end;

to nie rób od razu:

TN := TreeView1.Items.Add(nil, OldDir);

ale sprawdź czy masz w TreeView1 węzeł główny z OldDir, jak tak to przypisz go do TN-a

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dziękuje za szybką odpowiedź

Pisałem takze na 4p dlatego zamieniałem znaczniki i zamiast [] powinno być

 

No tak, jak masz:

to nie rób od razu:

TN := TreeView1.Items.Add(nil, OldDir);

ale sprawdź czy masz w TreeView1 węzeł główny z OldDir, jak tak to przypisz go do TN-a

Mógłbym prosić o przykładowy kod? Bo nie bardzo wiem jak takie sprawdzenie zrobić.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Masz gotowca.

Przed chwilą pisane, nie testowałem dokładnie, ale wygląda na to, że jest w porządku... :P

Masz tutaj obsługę dla nieograniczonej głębokości sub-gałęzi.

 

procedure TForm1.Button1Click(Sender: TObject);

 Function GetNode(const Text: String; Owner: TTreeNodes; Parent: TTreeNode): TTreeNode;
 var i: integer;
 begin
   if (Trim(Text) = '') then
       begin
         Result:= Parent;
         Exit;
       end
     else
       Result:= nil;

   for i:=0 to Parent.Count-1 do
     if (Parent[i].Text = Text) then
       begin
         Result:= Parent[i];
         Break;
       end;

   if not Assigned(Result) then
     Result:= Owner.AddChild(Parent, Text);
 end;

var i, offset, p: integer;
   Data: TStrings;
   Node: TTreeNode;
begin
 Data:= Memo1.Lines;
 TreeView1.Items.Clear;
 TreeView1.Items.AddChildFirst(nil, 'root');

 for i:=0 to Data.Count-1 do
   begin
     Node:= TreeView1.Items.GetFirstNode;
     offset:= 1;
     p:= Pos('', Data[i]);
     while (p > 0) do
       begin
         Node:= GetNode( Copy(Data[i], offset, p-offset), TreeView1.Items, Node);
         Offset:= p+1;
         p:= PosEx('', Data[i], offset);
       end;
   end;
end;

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Serdeczne dzięki Cubixmeister. Super :) Działa idealnie.

Na Was można liczyć, szybka i konkretna odpowiedź.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

A ja mam inne pytanie dotyczące TreeView .... Jesli można, oczywiście :)

Znalazłem kod "Fing node by text" Działa , jest oki ale ... Chciałbym aby programowo można było wyszukać Root by text i ... o ile znajdzie go program, niech rozwinie ew. istniejące gałązki tylko tego root ! Ktoś łaskawie pomoże ? <_<

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

×