Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TreeView / TreeNode filtern (https://www.delphipraxis.net/203576-treeview-treenode-filtern.html)

Delbor 1. Mär 2020 21:48

Delphi-Version: 10.3 Rio

TreeView / TreeNode filtern
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi zusammen
Wiedermal ist mein TOpenFileFrame mit im Spiel. Dessen Container besitzt eine Combobox, um Filter auszuwählen (BMP etc).
Grundsätzlich wird dieser Filter schon berücksichtigt, wenn die Nodes in der Prozedur AddNewNode das erste mal erstellt werden. Hier das Codeschnipsel, das dies tun sollte: (nur, wenn Node.HasChilds False ist):
Delphi-Quellcode:
  Node.Enabled := False; // Datefilter (Dateiendung) festgestellt. Wenn nein,
  Lextension := ExtractFileExt(aRealName);
  if SameText(FFileType,Lextension) then
    Node.Enabled := True;
  if (FFileType = 'alle Dateien') then
    Node.Enabled := true;
So siehts aus, nachdem ich den Parentnode das erste Mal geöffnet habe:

Anhang 52151
Eigentlich sollten die Datei-Nodes Enabled dargestellt werden - ich vermute hier einen Initialisierungsfehler. habe aber vorerst keine Idee, an was dies liegen könnte.
Ein weiteres Problem zeigt sich bei MausDown:
Anhang 52152
Hier habe ich über die FilterCombo einen neuen Filter gewählt und einen weiteren Node (das erste mal) geöffnet - hier sind die Datei-Nodes nun enabled dargestellt.

Schliesse ich nun den Ordner 'Backgrnd' aus dem ersten Jpeg und öffne ihn wieder, wird der erste Dateinode korrekt Enabled (schwarz) dargestellt, alle andern sind weiterhin disabled.

Der Code, der dies tut:
Delphi-Quellcode:
procedure TOpenFileFrame.TVFilesExplorerMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  var AnItem, AnChild : TTreeNode; P: TPoint; I: integer;
      LRealName, Lextension : String;
begin
  if Button =(mbLeft) then
  begin
    AnItem := TVFilesExplorer.GetNodeAt(X, Y);
    if AnItem.HasChildren then
    begin
      For I := 0 to AnItem.Count -1 do
      begin
        if i = 0 then
          AnChild := AnItem.getFirstChild
        else
          AnChild := AnItem.getNextSibling;
        LRealName := PNameRec(AnChild.Data)^.RealName;
        AnChild.Enabled := False;
        Lextension := ExtractFileExt(LRealName);
        if SameText(FFileType,Lextension) then
          AnChild.Enabled := True;
        if (FFileType = 'alle Dateien') then
          AnChild.Enabled := true;
        end;
      end;
  end;
  if Button =(mbRight) then
  begin
    ...
    ...
  end;
end;
Ursprünglich hatte ich die ersten Zeilen der Schleife so, habe dies aber anhand dieses Scnipsels angepasst:
Delphi-Quellcode:
  if i = 0 then
    AnChild := AnItem.getFirstChild
  else
    AnChild := AnItem.GetNext;
  end;
Was mache ich sonst noch falsch?

Gruss
Delbor


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz