Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.12;
Скачать: CL | DM;

Вниз

Компонент TTreeView   Найти похожие ветки 

 
Lefan ©   (2003-05-26 07:41) [0]

Приетсвую народ!
Такая проблемка появилась, в компонент TTreeView нужно добавить папку с ее структурой (вложения),
и так и сяк голову ломаю, ничего не получается...
Мож у кого есть сырки, иль просветит?

Заранее благодарен!
С уважением Алексей.


 
MBo ©   (2003-05-26 07:46) [1]

Ну так рекурсивный обход Findfirst-findNext


 
Lefan ©   (2003-05-26 10:11) [2]

с рекурсивным, понятно, не получается в объект TTreeView добавить... поправочка, правильно добавить....

1 вариант, нашел папку, добавил, захожу:
C:\
arch (1 , 1)
111 (2 , 2)
ааа (3 , 3)
222 (2 , 4)
Program (1 , 5)
pascal (6 , 6)
333 (7 , 7)
444 (7 , 8)
Delphi (6 , 9)
XXX (1 , 10)
yyy (11 , 11)

(1 , 2) первое - номер родительской папочки в списке + 1, второе - номер по проядку, т.е. каким по счету был добавлен
вот так правильно, а реализовать не получается...



2 вариант, сначала добаляю все папки, а потом уже захожу в каждую и сканирую:
C:\
arch (1 , 1)
111 (2 , 4)
ааа (3 , 6)
222 (2 , 5)
Program (1 , 2)
pascal (6 , 7)
333 (7 , 9)
444 (7 , 10)
Delphi (6 , 8)
XXX (1 , 3)
yyy (11 , 11)

(1 , 2) первое - номер родительской папочки в списке + 1, второе - номер по проядку, т.е. каким по счету был добавлен


1 вариант предпочтительнее


 
Silver_ ©   (2003-05-26 10:17) [3]

Может проще использовать стандартный компонент SellTreeView с вкладки Samples


 
pasha_golub ©   (2003-05-26 10:51) [4]

procedure TfmShell.LogDir(Dir: TFileName); //считать структуру каталога
var SR: TSearchRec;
Node, Root: TTreeNode;

begin
Root := tvFolders.Selected;
Root.ImageIndex := 1;
//File & Folders logging
tvFolders.Items.BeginUpdate;
if FindFirst(Dir+"\*", FAttr or faDirectory,SR) = 0 then
Repeat
if (SR.Attr and FAttr) = SR.Attr then
tvFolders.Items.AddChild(Root,SR.Name)
else
if ((SR.Attr and faDirectory) = faDirectory) and (SR.Name<>".") and (SR.Name<>"..") then
begin
Node := tvFolders.Items.AddChild(Root,AnsiUpperCase(SR.Name));
tvFolders.Selected := Node;
LogDir(Dir+"/"+SR.Name);
end;
Until FindNext(SR) <> 0;
tvFolders.Items.EndUpdate;
FindClose(SR);
Root.CustomSort(nil,0,true);
end;

Коряво, чуть-чуть, но сойдет, я думаю
var
tvFolders: TTreeView;
fmShell: TfmShell;


 
Lefan ©   (2003-05-26 13:29) [5]

> Может проще использовать стандартный компонент SellTreeView с вкладки Samples

Не подходит по задаче...
немучился бы тогда...

А пример попробую, спасибо...


 
Lefan ©   (2003-05-26 13:32) [6]

кстати, как мне раскрыть списочек TTreeView програмно?


 
jack128 ©   (2003-05-26 13:38) [7]

TTreeNode.Expand(...)


 
Song ©   (2003-05-26 13:38) [8]

TTreeNode.Expand()


 
Lefan ©   (2003-05-28 09:38) [9]

Народ проблемка в том, что сканирует, нормально, но идет только вниз, на верх не возвращается... :(

с:\
aaa(dir)
1.txt
2.tyxt
bbb(dir)
7.txt
8.txt

и все, обратно не возвращается, что-то потыкался помыкался, ника не хочет...
и еще, как мне получить номер ветки, например после того, как вернулись из bbb(dir), нужно знасть номер ветки, чтоб я мог получить 1.txt, 2.tyxt, т.е.
tvListFTP.Items[num].Text
^^^



var
myTree : TTreeNode;
Node, Root: TTreeNode;

...

function TForm1.Scan(path : TFileName) : integer;
var SR: TSearchRec;
FAttr : integer;
begin
FAttr := 2080;
Root := tvListFTP.Selected;
tvListFTP.Items.BeginUpdate;
if FindFirst(path+"\*", faAnyFile,SR) = 0 then
Repeat
if (SR.Attr and FAttr) = SR.Attr then
tvListFTP.Items.AddChild(Root,SR.Name)
else
if ((SR.Attr and faDirectory) = faDirectory) and (SR.Name<>".") and (SR.Name<>"..") then
begin
Node := tvListFTP.Items.AddChild(Root,AnsiUpperCase(SR.Name));
Node.Expand(false);
tvListFTP.Selected := Node;
Scan(path+"\"+SR.Name);
end;
Until FindNext(SR) <> 0;
tvListFTP.Items.EndUpdate;
FindClose(SR);
end;


Заранее благодарен.
С уважением Алексей.


 
Lefan ©   (2003-05-30 12:12) [10]

неужели никто не знает, как решить эту проблему? :(


 
Andryk ©   (2003-05-30 13:38) [11]

Ну точно так же рекурсивно бегать по TreeNode`ам


 
KoluChi ©   (2003-05-30 14:35) [12]

Я делал немного другое: заполнение меню по списку URL.
Список URL находится в файле (читается в TStringList).
Уровень вложенности определяется количеством Tab (#9).
Принцип тот же. Можешь переделать под себя.
//------------------------------------------------------------------------------
procedure Tfrm_Main.CreateURLsMenu();
var
i: Integer;
Str: String;
Item: TMenuItem;
begin
mnitm_URLs.Clear();
i := -1;
try
//(стартовый узел, текущий номер строки/тебе не нужен/, вложенность)
AddURLsToMenu(mnitm_URLs, i, "");
except
end;
end;
//------------------------------------------------------------------------------
procedure Tfrm_Main.AddURLsToMenu(It: TMenuItem; var Index: Integer; StartStr: String);
var
i, Length1, Length2, ind: Integer;
Str, Str1, NameStr, URLStr: String;
Item, OldItem: TMenuItem;
Found: Boolean;
begin
OldItem := It;
repeat
Inc(Index);
Str := OptionsURLs.Strings[Index];
Found := (AnsiPos(StartStr, Str) = 1) or (StartStr = "");
if Found then
//если входит в ткекущую вложенность
begin
if Copy(Str, Length(StartStr) + 1, 1) = #9 then
//следующий уровень
begin
Dec(Index);
AddURLsToMenu(OldItem, Index, StartStr + #9);
end
else
begin
//
Length1 := Length(StartStr);
Str1 := Copy(Str, Length1 + 1, Length(Str) - Length1);
Ind := Pos("|", Str1);
Length2 := Length(Str1);
NameStr := Copy(Str1, 1, Ind - 1);
URLStr := Copy(Str1, Ind + 1, Length2 - Ind);
if NameStr = "" then
begin
NameStr := URLStr;
URLStr := "";
end;
Item := TMenuItem.Create(mnitm_URLs.Owner);
Item.OnClick := OnURLClick;
Item.Caption := NameStr;
Item.Hint := URLStr;

It.Add(Item);
OldItem := Item;
end
end
else
Dec(Index);
until (not Found) or (Index >= OptionsURLs.Count - 1);
end;
//------------------------------------------------------------------------------



Страницы: 1 вся ветка

Текущий архив: 2003.06.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
4-35115
Василий Петрович
2003-04-12 18:18
2003.06.12
вопрос про кнопку


7-35084
Tanya
2003-04-09 18:43
2003.06.12
copy FileName LPT1 - ???


1-34862
Goga
2003-05-31 10:16
2003.06.12
Передача параметра форме


14-34976
LikeLamer
2003-05-28 16:04
2003.06.12
Express Inspector (от DevExpress)


1-34869
OlegNOE
2003-05-31 11:02
2003.06.12
MDI интерфейс