Einzelnen Beitrag anzeigen

Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

TTreeView und TFilSearcher

  Alt 14. Okt 2019, 21:23
Delphi-Version: 10.2 Tokyo
Hi zusammen

Mit TOpenFileFrame und der TFileSearcher-Komponente zeige ich mir die Ordner und Dateien an. Diesem Frame hab ich nun noch ein PopUp verpasst, womit ich eigentlich ein neues Rootverzeichnis festlegen will. Der Code hierfür:
Delphi-Quellcode:
procedure TOpenFileFrame.Wurzelverzeichnis1Click(Sender: TObject);
  var AnItem: TTreeNode; ATextSelection :String; LDirectory: Boolean;
begin
  AnItem := TVFilesExplorer.Selected;
  Self.FFileName := AnItem.Text;
  ATextSelection := PNameRec(AnItem.Data)^.RealName;
  LDirectory := PNameRec(AnItem.Data)^.IsDirectory;
  if LDirectory then
  begin
    ShowMessage('Ordnername := ' + ATextSelection);
    Self.FileSearcher1.RootDir := ATextSelection;
    FileSearcher1.Execute;
  end;
end;
Das Problem ist nicht der FileSearcher, der macht seine Arbeit nach wie vor gut. Das Problem liegt hier (oder sitzt vor dem Bildschirm?):
Delphi-Quellcode:
procedure TOpenFileFrame.FileSearcher1MatchFound(Sender: TObject;
  const Path: string; const FileInfo: TSearchRec);
  var Complettpath, J: String;
begin
  if Assigned(FCurrentNode) then
  begin
    Complettpath := IncludeTrailingPathDelimiter(Path) + FileInfo.Name; // Complettpath := DeleteDrivesName(Complettpath);
    AddNewNode(FCurrentNode, FileInfo.Name, Complettpath,TSearchRecAnalyzer.IsDirectory(FileInfo));
  end;
end;
Diese Prozedur wird jedesmal aufgerufen, wenn der FileSearcher eine Datei oder einen Ordner gefunden hat. Das Problem ist: FCurrentNode ist Nil.
Belegt wird dieses Feld hier:

Delphi-Quellcode:
procedure TOpenFileFrame.TVFilesExplorerExpanding(Sender: TObject;
  Node: TTreeNode; var AllowExpansion: Boolean);
var
  ChildNode: TTreeNode;
begin
  AllowExpansion := not FileSearcher1.Busy;
  FileSearcher1.Recursive := False;
  FileSearcher1.SearchType := stBoth;
  FileSearcher1.AttributeMode := amInclusive;
  if AllowExpansion then
    if Node.HasChildren then
    begin
      FOrdner := PNameRec(Node.Data)^.RealName;
      if assigned(FOnFoundFolderEvent) then
        FOnFoundFolderEvent(Self,FOrdner);
      ChildNode := Node.getFirstChild;
      (* Dummy-Knoten löschen und Verzeichnisinhalt einlesen *)
      if not Assigned(ChildNode.Data) and Assigned(Node.Data) then
      begin
        Node.DeleteChildren;
        FCurrentNode := Node; //<===
        FPathlist.Clear;
        (* RootDir auf den hinterlegten, aber unsichtbaren String setzen *)
        FileSearcher1.RootDir := PNameRec(Node.Data)^.RealName;
        FileSearcher1.Execute;
      end;
    end;
end;
Hier wird der Frame erstellt und in einer Schleife AddNewNode aufgerufen, wo die Ordner für die Laufwerke und Partitionen erstellt werden:
Delphi-Quellcode:
constructor TOpenFileFrame.Create(AOwner: TComponent);
  var Drive, D: string;
      Drives: TStringlist;
begin
  inherited;
  Drives := TStringlist.Create;
  try
    TDrives.ListDrivesAndNames(Drives);
    for Drive in Drives do
    begin
      D := Copy(Drive, 1, 3);
      AddNewNode(nil, Drive, Copy(Drive, 1, 3), true);
    end;
  finally
    FreeAndNil(Drives);
  end;
  FileSearcher1.SearchType := stBoth;
  FPathlist := TStringlist.Create;
  PnlLookOut.Align := alClient;
  FCmbxItem := False;
end;
Delphi-Quellcode:
procedure TOpenFileFrame.AddNewNode(ParentNode: TTreeNode; const aCaption,
  aRealName: string; aIsdirectory: Boolean);
  var Node: TTreeNode; NameRec: PNameRec;
      Lextension: String;
begin
  Node := TVFilesExplorer.Items.AddChild(ParentNode, aCaption);
  if aIsdirectory then
    begin
      Node.ImageIndex := 1;
      Node.SelectedIndex := 1;
      (* Dummy-Knoten anlegen *)         // 'alle Dateien', '.pdf', '.Docx', '.bmp', '.nef', '.jpg', '.png
      TVFilesExplorer.Items.AddChild(Node, 'dummy');
    end
  else
    begin
      Node.ImageIndex := 2;
      Node.SelectedIndex := 2;
      FPathlist.Add(aRealName);
      Lextension := ExtractFileExt(aRealName); // Hier wird die Übereinstimmung mit dem aktuellen
      Node.Enabled := False; // Datefilter (Dateiendung) festgestellt. Wenn nein,
      if (FFileType = Lextension) or // ist der eingefügte Node nicht Enabled
         (FFileType = 'alle Dateien') then
          Node.Enabled := true;
    end;
  New(NameRec);
  NameRec^.RealName := aRealName;
  NameRec^.IsDirectory := aIsdirectory;
  Node.Data := NameRec;
end;
Und jetzt steh ich sprichwörtlich auf dem Schlauch...


Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat