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