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

Вниз

Список фаилов в меню   Найти похожие ветки 

 
anod ©   (2004-05-02 15:35) [0]

Здраствуйте!
Тема не совсем точна. Я не могу придумать как решить эту проблему.
Есть у меня список файлов с полными путями, мне нужно создать меню в котором есть последняя директория (к неи подменю с фаилами из списка в этой директории) (с чем я успешно справляюсь).
Возникла проблема, определить если есть поддиректория к уже существующеи директории в списке, то ее нужно тоже добавит в подменю ну и т.д.

Для примера:
Список:
C:\WINDOWS\Rhododendron.bmp
C:\WINDOWS\River Sumida.bmp
C:\WINDOWS\Web\bullet.gif
У меня выходит следующее (Я просто определяю последнюю папку):
Windows -> Rhododendron.bmp
       -> River Sumida.bmp
Web     -> bullet.gif
Нужно так:
Windows -> Web              -> bullet.gif
       -> Rhododendron.bmp
       -> River Sumida.bmp

         
Если есть какие-нибудь идеи, подскажите... пожалуиста.


 
Palladin ©   (2004-05-02 15:49) [1]

дай кусок кода и тебе найдут ошибку


 
TUser ©   (2004-05-02 15:50) [2]

Можно рекурсией, можно и без рекурсии. Гонять цикл, пока не дайдешь до конца пути. На каждой итерации выделяешь соотв. папку и укорачиваешь путь. Т.е. в некой переменной хранишь путь, который еще надо пройти. Дальше определяешь - елси такая папка уже добавлена, запоминаешь CurrentMenuItem, если нет - добавляешь и запоминаешь.


 
DVM ©   (2004-05-02 16:23) [3]

Типа того (что такое PMenuItemData, не спрашивай):

procedure Scan(Dir: string; Menu: HMENU);
var
 FD : TWin32FindData;
 FH : THandle;
 mii: TMenuItemInfo;
begin
 if Dir = "" then exit;
 FH := FindFirstFile(PChar(Dir + "*.*"), FD);
 repeat
   if (FH<>INVALID_HANDLE_VALUE) and (FD.cFileName <> string(".")) and
     (FD.cFileName<>string("..")) and ((FILE_ATTRIBUTE_HIDDEN and FD.dwFileAttributes) = 0) then
     begin
       if (FILE_ATTRIBUTE_DIRECTORY and FD.dwFileAttributes) <> 0 then
         begin
           
           ZeroMemory(@mii, SizeOf(mii));
           mii.cbSize:=SizeOf(TMenuItemInfo);
           New(PMenuItemData(mii.dwItemData));
           PMenuItemData(mii.dwItemData).Path:=Dir + FD.cFileName;
           hSubMenu:=CreatePopUpMenu;
           mii.fType:=MFT_OWNERDRAW;
           mii.fMask:=MIIM_TYPE or MIIM_DATA or MIIM_SUBMENU or MIIM_ID;
           mii.hSubMenu:=hSubMenu;
           mii.wID:=n;
           InsertMenuItem (Menu, 0, true, mii);

           Scan(Dir + FD.cFileName + "\", hSubMenu);
         end
       else
         begin
           
           ZeroMemory(@mii, SizeOf(mii));
           New(PMenuItemData(mii.dwItemData));
           mii.cbSize:=SizeOf(TMenuItemInfo);
           mii.fType:=MFT_OWNERDRAW;
           mii.fMask:=MIIM_TYPE or MIIM_DATA  or MIIM_ID;
           mii.wID:=n;
           PMenuItemData(mii.dwItemData).Path:=Dir + FD.cFileName;
           InsertMenuItem (Menu, 0, true, mii);

         end;
         n:=n+1;
     end;
 until FindNextFile(FH,FD) = false;
 if FH <> 0 then FindClose(FH);
end;


 
anod ©   (2004-05-03 00:23) [4]

Немного не то.
1. У меня уже есть список файлов
2. Мне нужно чтобы в меню были только последние директории, не полностью путь

2TUser
Я думал может построить какое-то дерево сначала...
Нужно подумать, но звучит довольно призрачно, если взять к сведенью пункт 2


 
DVM ©   (2004-05-03 00:29) [5]


> anod ©   (03.05.04 00:23) [4]
> Немного не то.

А у меня там нет пути. У меня там строится что-то наподобии меню пуск, если натравить на папку программы - то меню пуск и будет.


 
TUser ©   (2004-05-03 09:37) [6]

В jedi есть компонент - TJvStartMenuBtn. А там в jedi - если в исходниках покопаться, все что хочешь найдется. Например

procedure TJvStartMenuBtn.DeleteItem(Item: TMenuItem; LookTag: Boolean);
var
 I: Integer;
begin
 for I := Item.Count - 1 downto 0 do
   if (not LookTag) or (Item[I].Tag = 0) then
   begin
     DeleteItem(Item[I]);
     Item[I].Free;
   end;
end;

...

procedure TJvStartMenuBtn.DynBuild(Item: TMenuItem; Directory: string);
var
 Res, FolderIndex: Integer;
 SearchRec: TSearchRec;
 It, It2: TMenuItem;
 First: Boolean;
 Bmp: TBitmap;

 function GetPathImage(const APath: string): TBitmap;
 var
   FileInfo: SHFILEINFO;
 begin
   SHGetFileInfo(PChar(APath), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
   Result := IconToBitmap2(FileInfo.hIcon, 16, clMenu);
//  Result := IconToBitmap2(ExtractAssociatedIcon(Application.Handle, PChar(It.Hint), w),16,clMenu);
 end;

begin
 DeleteItem(Item, True);
 if (Directory <> "") and (Directory[Length(Directory)] <> "\") then
   Directory := Directory + "\";
 Res := FindFirst(Directory + "*.*", faAnyFile, SearchRec);
 First := True;
 FolderIndex := 1;
 while Res = 0 do
 begin
   if (SearchRec.Name <> ".") and (SearchRec.Name <> "..") then
   begin
     if First then
       Item.Items[0].Visible := False;
     if (SearchRec.Attr and faDirectory) = faDirectory then
     begin
       It := TMenuItem.Create(Item);
       It.Caption := SearchRec.Name;
       It.Hint := Directory + SearchRec.Name;
       It.OnClick := DirectoryClick;
       It.ImageIndex := 0;
       Item.Insert(FolderIndex, It);
       Inc(FolderIndex);
       It2 := TMenuItem.Create(It);
       with It2 do
       begin
         Caption := RC_EmptyItem;
         Enabled := False;
         Tag := 1;
       end;
       It.Add(It2);
     end
     else
     begin
       It := TMenuItem.Create(Item);
       It.Caption := ChangeFileExt(SearchRec.Name, "");
       It.OnClick := UrlClick;
       It.Hint := Directory + SearchRec.Name;
       Bmp := GetPathImage(It.Hint);
       It.Bitmap.Assign(Bmp);
       Bmp.Free;
       Item.Add(It);
     end;
   end;
   Res := FindNext(SearchRec);
 end;
 FindClose(SearchRec);
end;



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

Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.035 c
1-1083225554
Dysan
2004-04-29 11:59
2004.05.16
опредиление кодировки


14-1082951872
Dmitriy O.
2004-04-26 07:57
2004.05.16
Вчера я открыл дачный сезон ! Вскопал грядку !


3-1082106946
Smile))
2004-04-16 13:15
2004.05.16
Конвертация БД


1-1083492460
TechnoDreamer
2004-05-02 14:07
2004.05.16
Выезжающая боковая панель


3-1082112658
Dimbas
2004-04-16 14:50
2004.05.16
Проблема открытия базы с CD





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский