olesio Napisano Listopad 1, 2008 Zgłoś Share Napisano Listopad 1, 2008 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ę: Pozdrawiam: olesio Link do komentarza Udostępnij na innych stronach More sharing options...
Force Napisano Listopad 1, 2008 Zgłoś Share Napisano Listopad 1, 2008 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 Baza tysięcy lotnisk: http://airportsbase.com Link do komentarza Udostępnij na innych stronach More sharing options...
olesio Napisano Listopad 1, 2008 Autor Zgłoś Share Napisano Listopad 1, 2008 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ć. Pozdrawiam: olesio Link do komentarza Udostępnij na innych stronach More sharing options...
Cubixmeister Napisano Listopad 1, 2008 Zgłoś Share Napisano Listopad 1, 2008 Masz gotowca. Przed chwilą pisane, nie testowałem dokładnie, ale wygląda na to, że jest w porządku... 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; Link do komentarza Udostępnij na innych stronach More sharing options...
olesio Napisano Listopad 2, 2008 Autor Zgłoś Share Napisano Listopad 2, 2008 Serdeczne dzięki Cubixmeister. Super Działa idealnie. Na Was można liczyć, szybka i konkretna odpowiedź. Pozdrawiam: olesio Link do komentarza Udostępnij na innych stronach More sharing options...
Henryk555 Napisano Wrzesień 1, 2014 Zgłoś Share Napisano Wrzesień 1, 2014 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 ? Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.