Hej Mads,,
Snild er vel så meget sagt, men dette er hvad jeg, en selvlært programmør,
har fundet frem til. Og den virker hos mig udemærket:
Bemærk:
Jeg bruger Q_Strings, hvis functioner er noget hurtigere end delphi's
stadard.
Q_CompTexst svarer til AnsiCompareText
Q_SameText svarer til AnsiSameText
Derudover bruges ikke TtreeView, men Mike Lisches VirtualTreeview, som
bruger records til at gemme alle informationer (som fx. text) i.
Men det skulle ikke være så galt at omskrive det, ellers må du råbe højt : )
God fornøjelse.
Mvh,
Anders Thomsen
PS: Hvis du optimerer koden vil jeg da godt lige se hvad du har lavet : )
Function getLevel(p:pointer; level:integer; toTheRoot:boolean =
false):string;
var i,x:integer;
begin
if level < 0 then result := '' else
begin
result := Prec(p).Fpath;
if toTheRoot then
begin
x:=1;
for i:=0 to level do
x := Q_StrScan(result, '\', x)+1;
result := Q_CopyLeft(result, x-2)
end
else
begin
for i:=0 to level-1 do
Q_cutLeft(result, Q_StrScan(result, '\'));
result :=Q_CopyLeft(result, Q_StrScan(result, '\')-1)
end
end
end;
function CompareUpdateTreeDir(Item1, Item2: Pointer): integer;
begin
result := Q_CompText(Prec(Item1).fPath, Prec(Item2).Fpath) //svarer
til Q_CompText(extractfilePath(s1), extractFilePath(s2))
end;
//Selve koden:
SortList.Sort(CompareUpdateTreeDir);
i:=0;
x:=1;
while x < sortList.count do
begin
if Q_SameText(getFilePath(sortlist.items[i]),
getFilePath(sortlist.items[x])) then
sortList.items[x] := nil
else i := x;
inc(x)
end;
Sortlist.pack;
i:=0;
level:=0;
aNode := rNode;
while (i < sortlist.count) and (level >= 0) do
begin
with tree do
begin
aNode := AddChild(aNode);
with PTreeRec(getnodedata(aNode))^ do
begin
text := getLevel(sortlist.items[i], level);
if level = 0 then Kind := TreeKind_Drive
else Kind := TreeKind_Directory;
end // of with Ptreerec(...
end; // eo with tree
if length(getLevel(sortlist.items[i], level+1)) > 0
then
inc(level)
else
begin
if (i < sortlist.count-1) and
Q_SameText(getLevel(sortlist.items[i], level, true),
getLevel(sortlist.items[i+1], level, true)) then
begin
inc(level);
inc(i)
end
else
begin
aNode := aNode.parent;
if i < sortlist.count-1 then
while not
Q_SameText(getlevel(sortlist.items[i], level-1, true),
getlevel(sortlist.items[i+1], level-1, true)) do
begin
dec(level);
aNode := aNode.parent
end;
inc(i)
end // of Q_SameStr(...
end // of length(..
end // of while (i < sortLi...
"Mads M." <wa
up@punkass.com> skrev i en meddelelse
news:susl4u0h5js7hbvekvl732f6amqu9nu42d@4ax.com...
> Er der en snild måde at putte filnavne + stier ind i en treeview,
> ligesom i exploreren?
>
> c:\fil1,txt
> c:\fil2,txt
> c:\x\fil1,txt
> c:\x\fil2,txt
> c:\x\fil3,txt
>
> Ind i treeview
> c:
> fil1.txt
> fil2.txt
> [x]
> fil1.txt
> fil2.txt
> fil3.txt
>
>
> Osv...
>
> Jeg døjer lidt med at lave en fejlsikker algoritme uden alt for mange
> lykker, så gode råd er velkomne...
>
> /Mads
>
>