Форум: "Основная";
Текущий архив: 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.044 c