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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
14-1082531195
stud
2004-04-21 11:06
2004.05.16
удаление sp4 win2000


14-1083134355
Тимохов
2004-04-28 10:39
2004.05.16
TThread.WaitFor


3-1082460803
Fishka
2004-04-20 15:33
2004.05.16
DBCtrlGrid и поиск


1-1083050610
alextov
2004-04-27 11:23
2004.05.16
Как отсортировать по алфавиту массив строк?


1-1083117685
-=[SDA]=-
2004-04-28 06:01
2004.05.16
Панель в QuickReport!!! -> false!!!