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

Вниз

Вопрос об отображении иерархии в TPopupMenu   Найти похожие ветки 

 
leonidus   (2003-10-10 17:11) [0]

Подскажите пожалуйста как должен выглядеть алгоритм рекурсивного заполнения компонента PopupMenu для отображения данной директории на диске. Мне надо представить папку "Избранное" так же как она отображается в MSIE. Помогите пожалуйста уже вторые сутки бьюсь!!!


 
Романов Р.В. ©   (2003-10-10 17:17) [1]

Алгоритм рекурсивного обхода папок в FAQ


 
From_X   (2003-10-10 17:23) [2]

короче просто ищещь в заданной директории файлы и поддиректории.
если что то найдены то заполняешь TPopupMenu.
далее для всех поддиректорий делаешь все аналогично- рекурсивно


 
leonidus   (2003-10-10 20:12) [3]

А может у кого-нибудь примерчик есть?


 
Palladin ©   (2003-10-10 20:39) [4]

покажи что у тебя есть


 
leonidus   (2003-10-11 12:28) [5]

Я написал процедурку которая сканирует данную директорию и в массив собирает все найденные файлы с расширением url (это и есть закладки) и получается массив такого вида:
links\1.url
links\2.url
links\3.url
work\abc\1.url
work\abc\2.url
work\1.url

вот теперь значениями из этотого массива надо заполнить TPopupMenu в соответствии со структурой.


 
pasha_golub ©   (2003-10-11 12:30) [6]

2leonidus
Код покажи, а не результат, хотя судя по результату ты рекурсию наверное используешь


 
leonidus   (2003-10-11 12:37) [7]

Вот код функции которую я использую для поиска всех файлов в папке "Избранное" все найденное записывется в str:TStringList а уж потом я работаю с ним как с массивом выбирая от туда ссылки и все что мне надо. Тут конечно используется рекурсия, но как ее использовать для заполнения TPopupMenu я не догоняю.

function GetIEFavourites_filename(Dir:string):boolean;
var
SearchRec : TSearchRec;
Separator : string;
begin

if Copy(Dir,Length(Dir),1)="\" then
Separator := ""
else
Separator := "\";

if FindFirst(Dir+Separator+"*.*",faAnyFile,SearchRec) = 0 then
{что-то найдено}
begin
if FileExists(Dir+Separator+SearchRec.Name) then
{найден файл}
begin
str.Add(Dir+Separator+SearchRec.Name);
end
{найден каталог}
else
if DirectoryExists(Dir+Separator+SearchRec.Name) then
begin
if (SearchRec.Name<>".") and (SearchRec.Name<>"..") then
begin
GetIEFavourites_filename(Dir+Separator+SearchRec.Name);
end;
end;

while FindNext(SearchRec) = 0 do
begin
if FileExists(Dir+Separator+SearchRec.Name) then
begin
str.Add(Dir+Separator+SearchRec.Name);
end
else
if DirectoryExists(Dir+Separator+SearchRec.Name) then
begin
if (SearchRec.Name<>".") and (SearchRec.Name<>"..") then
begin
GetIEFavourites_filename(Dir+Separator+SearchRec.Name);
end;
end;
end;
end;
FindClose(SearchRec);
end;


 
pasha_golub ©   (2003-10-11 14:07) [8]

2leonidus
Код прямо скажем запущенный.
pm:TPopupMenu


procedure ItemsAdd(RootItem: TMenuItem; Dir: string);
var
SR:TSearchRec;
Item:TMenuItem;
begin
if FindFirst(Dir+"\*", faAnyFile or faDirectory,SR) = 0 then
Repeat
if ((SR.Attr and faDirectory) = faDirectory) and (SR.Name<>".") and (SR.Name<>"..") then
begin
Item := TMenuItem.Create(Form1);
Item.Caption := SR.Name;
RootItem.Add(Item);
ItemsAdd(item,Dir+"\"+SR.Name);
end
else
begin
Item := TMenuItem.Create(Form1);
Item.Caption := SR.Name;
RootItem.Add(Item);
end;
Until FindNext(SR) <> 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
pm.Items.Add(TMEnuItem.Create(Self));
ItemsAdd(pm.Items[0],"d:\test");
end;


 
pasha_golub ©   (2003-10-11 14:11) [9]

Эту процедуру для наглядности перепишем

procedure TForm1.Button1Click(Sender: TObject);
begin
pm.Items.Add(TMEnuItem.Create(Self));
ItemsAdd(pm.Items[0],"d:\test");
end;

==>

procedure TForm1.Button1Click(Sender: TObject);
var
Item:TMenuItem;
begin
Item := TMEnuItem.Create(Self);
Item.Caption := "d:\test";
pm.Items.Add(Item);
ItemsAdd(Items,Item.Cpation);
end;


 
pasha_golub ©   (2003-10-11 14:42) [10]

Ошибка
ItemsAdd(Items,Item.Cpation);
Надо
ItemsAdd(Item,Item.Cpation);


 
leonidus   (2003-10-11 21:28) [11]

Че-то не работает это дело выдается ошибка "Access violation..."


 
Palladin ©   (2003-10-11 22:22) [12]

procedure ItemsAdd(RootItem: TMenuItem; Dir: string);
var
SR:TSearchRec;
Item:TMenuItem;
begin
if FindFirst(Dir+"\*.*", faAnyFile,SR) = 0 then
Repeat
if (sr.name<>".") and (sr.name<>"..") then
begin
Item := TMenuItem.Create(Form1);
Item.Caption := SR.Name;
RootItem.Add(Item);
if ((SR.Attr and faDirectory) = faDirectory) then
ItemsAdd(item,Dir+"\"+SR.Name);
end;
Until FindNext(SR) <> 0;
FindClose(sr);
end;


 
Palladin ©   (2003-10-11 22:26) [13]

ну вот, закралась маленькая ошибка, кто найдет тому приз :)


 
leonidus   (2003-10-12 15:21) [14]

>Palladin но твой аглоритм ведь тоже не работает, все таже ошибка вылазеет!


 
Palladin ©   (2003-10-12 15:25) [15]


> leonidus (12.10.03 15:21) [14]

парень, ты TPopupMenu создал?
моя процедура это переделка процедуры pasha_golubя, вернее устранение его ошибки с директориями "." и "..", ну и немного упрощенная на предмет нагромождения конструкций...

Твоя ошибка, это твоя ошибка, и никакого отношения эта твоя ошибка к данной процедуре не имеет.


 
leonidus   (2003-10-12 16:52) [16]

>Palladin - прости пожалуйста, я действительно не создал TPopupMenu. Все работает, единственное при вызове процедуры

Item := TMEnuItem.Create(Self);
Item.Caption := path_favor;
pm.Items.Add(Item);
ItemsAdd(Items,Item.Cpation);

Первый пункт создается path_favor а потом уже вся структура данной папки, а как сразу всю структуру отобразить без этого начального итема?


 
Palladin ©   (2003-10-12 16:57) [17]

Item := TMEnuItem.Create(Self);
Item.Caption := path_favor;
pm.Items.Add(Item);
ItemsAdd(Item,Item.Cpation);


 
leonidus   (2003-10-12 17:29) [18]

>Palladin не понял...


 
Palladin ©   (2003-10-12 17:35) [19]

Вызывай не
ItemsAdd(Items,Item.Caption);
а
ItemsAdd(Item,Item.Caption);

тоесть начинай сканировать и добаволять в только что созданный пункт и убедись что путь выставлен верно...


 
leonidus   (2003-10-12 18:21) [20]

>Palladin - я не от туда скопировал код, вот как я вызываю процедуру сканирования:

pm:=tPopupMenu.Create(self);
Item := TMenuItem.Create(Self);
Item.Caption := path_favor;
pm.Items.Add(Item);
ItemsAdd(Item,Item.Caption);

Но самым первым итемом естественно получается path_favor - т.е. сам путь к папке "Избранное", а мне он не нужен, надо просто содержимое самой папки. Как это сделать?


 
Palladin ©   (2003-10-12 18:30) [21]


> leonidus (12.10.03 18:21) [20]

чего удивлятся, ведь ты его сам добавил
pm.Items.Add(Item);
не создавай тогда...

pm:=tPopupMenu.Create(self);
ItemsAdd(pm,path_favor);


 
leonidus   (2003-10-12 21:10) [22]

Всем большое спасибо - заработало!


 
pasha_golub ©   (2003-10-13 11:53) [23]

2Palladin
Да точно, много лишнего. Я этот код из другого проекта брал, да вообще-то многовато лишнего :-)



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

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

Наверх




Память: 0.52 MB
Время: 0.016 c
14-74460
sashcan
2003-10-03 15:57
2003.10.23
оКНА


14-74463
Knight
2003-10-02 23:52
2003.10.23
Кто какие сайты посещает?


3-73977
Alexadre
2003-10-05 23:31
2003.10.23
DBGrid-после удаления записи


4-74532
guest777
2003-08-16 22:05
2003.10.23
перехват сообщений от клавиатуры с помощью getmessage


3-74036
Abikos
2003-10-03 12:08
2003.10.23
Создание скрипта в Interbase