Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];

Вниз

Вопрос об отображении иерархии в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.009 c
7-74514
RSN
2003-08-11 22:52
2003.10.23
Закрытие окна


1-74187
iNew
2003-10-09 12:17
2003.10.23
Вопрос по потокам.


14-74403
isko
2003-10-06 08:28
2003.10.23
найдёшь или нет


1-74266
dream
2003-10-13 10:14
2003.10.23
Много ли занимают памяти дополнительные формы ?


1-74143
ura
2003-10-10 21:54
2003.10.23
как ограничить





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский