TShellTreeView - problem z "przechwyceniem" nazwy itema

0

Witam
Pisze program dla własnych potrzeb.
Jednak napotkałem na drobny problem, którego nie jestem w stanie sam rozwiązać
Otóż mając strukturę w ShellTreeView1

  • Polska
    • Warszawa
      • coś tam 1 sub 1
      • coś tam 1 sub 2
      • coś tam 1 sub 3
    • Kraków
      • coś tam 2 sub 1
      • coś tam 2 sub 2
      • coś tam 2 sub 3

I kiedy zaznaczam np. "coś tam 2 sub 2" potrzebuję "przechwycić" do label.caption "Kraków", a klikając na np. "coś tam 1 sub 3" potrzebuję "przechwycić" do label.caption "Warszawa"

Czy mógłby ktoś mi pomóc z kodem powyższego

Z góry dziękuje za pomoc

2

W programie CTCT robię w ten sposób, że pobieram zaznaczony węzeł za pomocą właściwości Selected i wykorzystuję jego właściwość Parent, która zwraca referencję węzła-rodzica. Tyle że w swoim programie w pętli lecę aż do węzła-korzenia, w celu określenia pełnej ścieżki zaznaczonego pliku.

Wygląda to tak (może Ci się kiedyś przyda):

function NodeToFilePath(ANode: TTreeNode): String;
begin
  if ANode <> nil then
  begin
    Result := ANode.Text;
    ANode := ANode.Parent;
  end
  else
    Exit('');

  while ANode <> nil do
  begin
    Result := ANode.Text + '/' + Result;
    ANode := ANode.Parent;
  end;
end;

U Ciebie będzie łatwiej:

function GetParentNodeName(ANode: TTreeNode): String;
begin
  if (ANode <> nil) and (ANode.Parent <> nil) then
    Result := ANode.Parent.Text
  else
    Result := '';
end;

Pozostaje jeszcze dodać sprawdzanie, czy zaznaczony węzeł jest liściem (czyli czy ma węzły potomne, a do tego służy właściwość HasChildren). Nie napisałeś co się ma dziać jeśli użytkownik kliknie w item Kraków, ani w item Polska, więc resztę kodu sobie dopisz sam. ;)

2

@furious programming: obie te funkcje są w standardzie:

  • ścieżka: ShellTreeView1.Selected.GetTextPath;
  • nazwa rodzica: ShellTreeView1.Selected.Parent.Text;
0

Kod działa w 100%, pełen profesjonalizm BARDZO DZIĘKUJĘ. Wątek do zamknięcia

1

Jeśli brać wszystkie okoliczności pod uwagę, to rozwiązanie powinno wyglądać w ten sposób:

var
  Node: TTreeNode;
begin
  Node := ShellTreeView.Selected;
  
  if Assigned(Node) and Assigned(Node.Parent) and not Node.HasChildren then
    Label.Caption := Node.Parent.Text;

Trzeba pamietać, że właściwość ShellTreeView.Selected może zwrócić nil i kod musi być zabezpieczony przed tym. A może zwrócić nil, jeśli pozwalamy użytkownikowi odznaczyć węzeł poprzez kliknięcie w pustą przestrzeń kontrolki (przy wyłączonym RowSelect rzecz jasna), co zwykle wykonuje się w zdarzeniu OnMouseDown takim kodem:

procedure TForm1.ShellTreeViewMouseDown(ASender: TObject; AButton: TMouseButton; AShift: TShiftState; AX, AY: Integer);
var
  TreeView: TShellTreeView absolute ASender;
begin
  TreeView.Selected := TreeView.GetNodeAt(AX, AY);
end;

Ale to w ramach ciekawostki, gdyby kogoś taka funkcjonalność interesowała.

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