TreeView z TStringList

0

Witam,

Mam mały problem w przeróbce kawałka kodu, generuję TreeView na podstawie StringList
StringList wypełniana jest z pliku w którym są pełne ścieżki do plików, np. C:\ftp\xxx.txt itp

procedure Tfrm.Button2Click(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: TStringList;
    Node: TTreeNode;
begin
  data := TStringList.Create();
  data.LoadFromFile('c:\a.txt');
  trv1.Items.Clear;
  trv1.Items.AddChildFirst(nil, 'root');
  for i:=0 to Data.Count-1 do
    begin
      Node:= trv1.Items.GetFirstNode;
      offset:= 1;   
      p:= Pos('\', Data[i]);
      while (p > 0) do     // while (p > 0) do
        begin
          Node:= GetNode( Copy(Data[i], offset, p-offset), trv1.Items, Node);
          offset:= p+1;
          p:= PosEx('\', Data[i], offset);
        end;
    end;
end;

i wszystko jest pięknie, ładnie poza linią

trv1.Items.AddChildFirst(nil, 'root');

której usunięcie naturalnie powoduje błąd a główna gałąź 'root' nie jest mi potrzebna.
teraz to wygląda tak że jest root a w niej C: , D: itd jako rodzice a chciałbym żeby w drzewie było tylko
C: D: itd jako rodzice, bez tej nadrzędnej gałęxi root.

Czy byłby ktoś w stanie pomóc?
Z góry dziękuję
Pozdrawiam

0

Pewnie chodzi Tobie o kod ktory w oryginale napisal dla mnie Cubixmeister z forum u1 (wątek pod adresem
http://forum.unit1.pl/index.php?showtopic=2449). O ile się nie mylę z TreeView jest jak z XMLem chyba i
w przypadku tego kod - musi być gałąź głowna. PAmiętam, że sam kombinowałem wcześniej jak stworzyć
tę listę bez glownej gałęxi, ale poddałem się i zostawiłem jak jest. Zmieniając nazwę root na inną. Jednak w
moim przypadku przeważyło małe doświadczenie z komponentem TreeView, może ktoś na tym forum ma w
tym temacie większe doświadczenie i podsunie inne rozwiązanie - to ja też bym chętnie skorzystał z niego.

0
olesio napisał(a)

Pewnie chodzi Tobie o kod ktory w oryginale napisal dla mnie Cubixmeister z forum u1 (wątek pod adresem
http://forum.unit1.pl/index.php?showtopic=2449). O ile się nie mylę z TreeView jest jak z XMLem chyba i
w przypadku tego kod - musi być gałąź głowna. PAmiętam, że sam kombinowałem wcześniej jak stworzyć
tę listę bez glownej gałęxi, ale poddałem się i zostawiłem jak jest. Zmieniając nazwę root na inną. Jednak w
moim przypadku przeważyło małe doświadczenie z komponentem TreeView, może ktoś na tym forum ma w
tym temacie większe doświadczenie i podsunie inne rozwiązanie - to ja też bym chętnie skorzystał z niego.

Zgadza się :)
Znalazłem inne rozwiązanie, może komuś się przyda

function GetNode(ParentNode: TTreeNode; NodeName: string): TTreeNode;
var
  TmpNode: TTreeNode;
begin
  if ParentNode = nil then
    TmpNode := frm.trv1.Items.GetFirstNode
  else
    TmpNode := ParentNode.GetFirstChild;
  while (TmpNode <> nil) and (TmpNode.Text <> NodeName) do
    TmpNode := TmpNode.GetNextSibling;
  Result := TmpNode;
end;
//
procedure DelimitStrings(aStrings: TStrings; aPath: string);
var
  DelimiterPos: integer;
begin
  aStrings.Clear;
  DelimiterPos := Pos('\', aPath);
  while DelimiterPos > 1 do
  begin
    aStrings.Add(Copy(aPath, 1, DelimiterPos-1));
    Delete(aPath, 1, DelimiterPos);
    DelimiterPos := Pos('\', aPath);
  end;
  aStrings.Add(aPath); // ostatni element listy
end;
//
procedure Tfrm.Button2Click(Sender: TObject);
var
  i, j: integer;
  CurrentNode, ParentNode: TTreeNode;
  NodeNames: TStringList;
  NodeFile: TStringList; // nasza StringLista
begin
  frm.trv1.Items.Clear;
  NodeNames := TStringList.Create;
  NodeFile := TStringList.Create;
  NodeFile.LoadFromFile('c:\a.txt');
  try
    for i := 0 to NodeFile.Count-1 do
    begin
      DelimitStrings(NodeNames, NodeFile[i]);
      ParentNode := nil;
      for j := 0 to NodeNames.Count-1 do
      begin
        CurrentNode := GetNode(ParentNode, NodeNames[j]);
        if CurrentNode = nil then
          CurrentNode := frm.trv1.Items.AddChild(ParentNode, NodeNames[j]);
          //
          if frm.trv1.Items.Item[j].Parent = nil then
          begin
            CurrentNode.ImageIndex := 0;
            CurrentNode.SelectedIndex := 0;
          end;
          if frm.trv1.Items.Item[j].Parent <> nil then
          begin
            CurrentNode.ImageIndex := 1;
            CurrentNode.SelectedIndex := 1;
          end;
          //
        ParentNode := CurrentNode;
      end;
    end;
  finally
    NodeNames.Free;
    NodeFile.Free;
  end;
end;

Wyświetla drzewo ze StringList, StringLista budowana ze ścieżek do plików w pliku txt
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1