Перевод списка файлов и каталогов из TStringList в TreeView с построением дерева каталогов
Автор: Радионов Алексей
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Перевод списка файлов/каталогов из TStringList в
TreeView с построением "дерева каталогов"
Иногда бывает нужно построить "дерево каталогов" по
заданному списку файлов и папок (причем физически
эти файлы и каталоги могут не существовать).
Представляемый здесь код занимается именно этим.
Зависимости: sysutils, classes, comctrls
Автор: Радионов Алексей (Alx2), alx@argo.mv.ru, ICQ:113442587, Ульяновск
Copyright: Alx2
Дата: 3 июля 2002 г.
***************************************************** }
procedure FillTreeViewWithFiles(TreeView1: TTreeView; Strs: TStringList);
var
CachedStrs: TStringList; // CachedStrs вводится для ускорения поиска
// в уже готовом дереве.
procedure AddItem(Lev: Integer; ParentNode: TTreeNode; S: string);
function FindNodeWithText(AParent: TTreeNode; const S: string): TTreeNode;
var
K: Integer;
fStr: string;
tmpNode: TTreeNode;
begin
Result := nil;
fStr := S + IntToStr(Integer(AParent));
K := CachedStrs.IndexOf(fStr);
if K > -1 then
Result := Pointer(CachedStrs.Objects[K])
else
begin
if AParent <> nil then
tmpNode := AParent.getFirstChild
else
tmpNode := TreeView1.Items.GetFirstNode;
while tmpNode <> nil do
begin
if tmpNode.Text = S then
begin
Result := tmpNode;
CachedStrs.AddObject(fStr, Pointer(tmpNode));
break;
end;
tmpNode := tmpNode.getNextSibling;
end;
end
end;
var
prefix: string;
ID: Integer;
aNode: TTreeNode;
begin
if S = '' then
Exit;
ID := Pos('\', S);
prefix := '';
if ID > 0 then
prefix := Copy(S, 1, ID - 1)
else
begin
prefix := S;
S := '';
end;
aNode := FindNodeWithText(ParentNode, prefix);
if aNode = nil then
begin
aNode := TreeView1.Items.AddChild(ParentNode, prefix);
end;
AddItem(Lev + 1, aNode, Copy(S, ID + 1, Length(S)));
end;
var
K: Integer;
begin
CachedStrs := TStringList.Create;
CachedStrs.Duplicates := dupIgnore;
CachedStrs.Sorted := True;
try
TreeView1.Items.BeginUpdate;
TreeView1.SortType := stNone;
for K := 0 to Strs.Count - 1 do
AddItem(0, nil, Strs[K]);
finally
TreeView1.Items.EndUpdate;
CachedStrs.Free;
end;
end;
Пример использования:
// Построим, например, "дерево каталогов" по трем файлам:
procedure TForm1.Button1Click(Sender: TObject);
var
Strs: TStringList;
begin
Strs := TStringList.Create;
try
Strs.Add('D:\Program Files\Borland\Delphi6\Source\Vcl\Printers.dcu');
Strs.Add('D:\Program Files\Borland\Delphi6\Source\Vcl\WinHelp.dcu');
Strs.Add('C:\WINNTS\system\BORLNDMM.DLL');
FillTreeViewWithFiles(TreeView1, Strs);
finally
Strs.Free;
end;
end;
|