unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
VirtualTrees;
type
Tmainform =
class(TForm)
VSTOrdnerstruktur: TVirtualStringTree;
procedure FormCreate(Sender: TObject);
procedure initialiseVSTOrdnerstruktur();
procedure leseOrdnerStruktur( aNode : PVirtualNode;
sPath :
String;
iNodeLevel : Integer);
function AddNode( VST : TCustomVirtualStringTree;
aNode : PVirtualNode;
aSearchRec : TSearchRec;
sPath :
String;
iNodeLevel : Integer): PVirtualNode;
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
type
PMyFolderRec = ^MyFolderRec;
// Zeiger auf unser MyFolderRec-Record
MyFolderRec =
record
SearchRec : TSearchRec;
sPath : WideString;
end;
var
mainform: Tmainform;
implementation
{$R *.DFM}
procedure TMainForm.FormCreate(Sender: TObject);
begin
initialiseVSTOrdnerstruktur;
end;
procedure TMainForm.initialiseVSTOrdnerstruktur();
begin
VSTOrdnerstruktur.RootNodeCount := 0;
VSTOrdnerstruktur.NodeDataSize := SizeOf(MyFolderRec);
// nun alle Ordner im Tree anzeigen:
leseOrdnerStruktur(
nil,
'
C:\test',
0);
end;
procedure TMainForm.leseOrdnerStruktur( aNode : PVirtualNode;
sPath :
String;
iNodeLevel : Integer);
var
SearchRec : TSearchRec;
p :
String;
begin
p := sPath + '
\*.*';
if FindFirst(p, faAnyFile, SearchRec) = 0
then
begin
repeat
// handelt es sich um ein Verzeichnis?
if (SearchRec.Attr
and faDirectory) = faDirectory
then
begin
if (SearchRec.
Name <> '
.')
and
(SearchRec.
Name <> '
..')
then
begin
// den aktuellen Ordner dem Tree anhängen
aNode := AddNode(VSTOrdnerstruktur, aNode, SearchRec, sPath, iNodeLevel);
// ab in den nächsten Unterordner:
leseOrdnerStruktur( aNode,
IncludeTrailingBackslash(sPath)+ SearchRec.
Name,
iNodeLevel+1);
end;
end;
until
FindNext(SearchRec) <> 0;
FindClose(SearchRec);
// wird benötigt um den Speicher wieder freizugeben
end;
end;
function TMainForm.AddNode( VST : TCustomVirtualStringTree;
aNode : PVirtualNode;
aSearchRec : TSearchRec;
sPath :
String;
iNodeLevel : Integer): PVirtualNode;
var
pData: PMyFolderRec;
begin
VST.BeginUpdate;
if aNode <>
nil then
begin
if VST.GetNodeLevel(aNode) < iNodeLevel
then
// übergeordneter Order Subordner --> an aNode anhängen
Result := VST.AddChild(aNode)
else if VST.GetNodeLevel(aNode) = iNodeLevel
then
// wieder im selben Ordner --> an aNode.Parent anhängen
Result := VST.AddChild(aNode.Parent);
end else
begin
Result := VST.AddChild(
nil);
end;
pData := VST.GetNodeData(Result);
pData^.sPath := sPath;
pData^.SearchRec := aSearchRec;
VST.EndUpdate;
end;
end.