AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TTreeView und TFilSearcher

Ein Thema von Delbor · begonnen am 14. Okt 2019
Antwort Antwort
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:43 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