![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TreeView из списка Файлов [Delphi, Windows]
QAZ © (2009-05-12 12:38:00)есть несортированый список файлов с путями
имено готовый список, а не поиск по папкам
как по списку построить дерево?
есть решение на VCL http://www.delphisources.ru/pages/faq/base/sl_to_dir_tree.html
помогите пожалуйста перевести в кол
или может есть у кого готовое уже
QAZ (2009-05-26 19:01:00) [21]спасибо, не помогло :)
exero (2009-05-26 18:03:00) [22]Я думаю с "переводом" любой гугл справится. А что касается советов - они бывают двух видов "спасибо, помогло" или "нет не помогло, давайте еще подумаем"...
QAZ (2009-05-26 17:17:00) [23]
> "Вам шашечки или ехать?"
переведи
exero (2009-05-26 11:14:00) [24]"Вам шашечки или ехать?"
QAZ (2009-05-26 10:48:00) [25]
> Ставь FastMM4
совет ниочем
причом тут смена менеджера память ?
если тормозит конкретно коловский вариант алгоритма,а
оба они используют стандартный менеджер
exero (2009-05-25 11:39:00) [26]Ставь FastMM4 и будут пузомерки работать примерно одинаково.
QAZ (2009-05-25 11:38:00) [27]кстати !!! а какова? просто добавление итемов у ВКЛ медленей чем ВКЛьная версия FillTreeViewWithFiles ???
QAZ (2009-05-25 11:32:00) [28]хм простая конструкция типа
procedure TForm1.Button2Click(Sender: TObject);
var i: Integer;
debug:cardinal;
begin
debug:=gettickcount;
for i := 0 to 10000 do
begin
TV.Items.AddChild(nil,'Item' + InttoStr( i ));
//TV.TVInsert( 0, 0, 'Item' + Int2Str( i ) );
end;
form1.Caption:=inttostr(gettickcount-debug);
//form.Caption:=int2str(gettickcount-debug);
end;
показывает
КОЛ=13672 мс
ВКЛ=11265 мс
что просто работа с деревом "почти" одинакова
тогда где тормоз который дает 6 кратный разнос ???
QAZ (2009-05-25 10:46:00) [29]не знаю точтоли я перевел ВКЛьный вариант с CachedStrs, тем не менее работает ,но скорость всего лиш 36 против 50
походу в даном случае CachedStrs особо не при делах,а просто
ВКЛ имеет по полной КОЛ в плане скорости
procedure FillTreeViewWithFiles(TreeView1: PControl; Strs: PStrListEX);
var
CachedStrs: PStrListEX; // CachedStrs
procedure AddItem(Lev: Integer; ParentNode: Cardinal; S: string);
function FindNodeWithText(AParent: Cardinal; const S: string): Cardinal;
var
K: Integer;
fStr: string;
tmpNode: Cardinal;
begin
Result := 0;
fStr := S + Int2Str(AParent);
K := CachedStrs.IndexOf(fStr);
if K > -1 then
Result := CachedStrs.Objects[K]
else
begin
if AParent <> 0 then
tmpNode := TreeView1.TVItemChild[AParent]
else
tmpNode := TreeView1.TVRoot;
while tmpNode <> 0 do
begin
if TreeView1.TVItemText[tmpNode] = S then
begin
Result := tmpNode;
CachedStrs.AddObject(fStr, tmpNode);
break;
end;
tmpNode := TreeView1.TVItemNext[tmpNode];
end;
end
end;
var
prefix: string;
ID: Integer;
aNode: Cardinal;
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 = 0 then
begin
aNode := TreeView1.TVInsert(ParentNode,TVI_LAST,prefix);
end;
AddItem(Lev + 1, aNode, Copy(S, ID + 1, Length(S)));
end;
var
K: Integer;
begin
CachedStrs := NewStrListEx;
try
for K := 0 to Strs.Count - 1 do AddItem(0, 0, Strs.Items[K]);
finally
CachedStrs.Free;
end;
end;
QAZ (2009-05-22 11:11:00) [30]хм а ВКЛьный вариант в 6 раз быстрее !!! 8,6 секунд против 50 при списке из 10000 файлов
так что зря Дмитрий К исключил CachedStrs из алгоритма :(
QAZ (2009-05-13 12:11:00) [31]пасиба
Дмитрий К (2009-05-12 19:33:00) [32]
program Project1;
uses
KOL;
procedure FillTVWithFL(TV: PControl; FL: PStrList);
function ItemIndex(Parent: Cardinal; ItemName: string): Cardinal;
var Item: Cardinal;
begin
Result := 0;
Item := TV.TVItemChild[Parent];
while Item <> 0 do
begin
if AnsiCompareStrNoCase(TV.TVItemText[Item], ItemName) = 0 then
begin
Result := Item;
Break;
end;
Item := TV.TVItemNext[Item];
end;
end;
var
i: Integer;
s, s1: string;
Parent, Item: Cardinal;
begin
for i := 0 to FL.Count - 1 do
begin
s := FL.Items[i];
s1 := Parse(s, '\');
Parent := TVI_ROOT;
while s1 <> '' do
begin
Item := ItemIndex(Parent, s1);
if Item = 0 then
Parent := TV.TVInsert(Parent, TVI_SORT, s1)
else
Parent := Item;
s1 := Parse(s, '\');
end;
end;
end;
var
Form, TV: PControl;
SL: PStrList;
begin
Form := NewForm(nil, 'TV');
TV := NewTreeView(Form, [], nil, nil).SetAlign(caLeft);
SL := NewStrList;
SL.Add('D:\Program Files\Borland\Delphi6\Source\Vcl\Printers.dcu');
SL.Add('D:\Program Files\Borland\Delphi6\Source\Vcl\WinHelp.dcu');
SL.Add('C:\WINNTS\system\BORLNDMM.DLL');
FillTVWithFL(TV, SL);
SL.Free;
Run(Form);
end.