Контестное меню для нескольких файлов/папок
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.175] |
|
|
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Контестное меню для нескольких файлов/папок
|
Сообщ.
#1
,
|
|
|
|
Нужно из своей проги вызвать контекстное меню для нескольких файлов/папок
делаю это так ![]() ![]() procedure ShowSysPopup(aFileLst: TStringList; P: TPoint; HND: HWND); var Root: IShellFolder; ShellParentFolder: IShellFolder; chEaten,dwAttributes: ULONG; ParentFolderPIDL: PItemIDList; FilesPIDL: PArrayOfPItemIDList; CM: IContextMenu; Menu: HMenu; Command: LongBool; ICM2: IContextMenu2; ICI: TCMInvokeCommandInfo; ICmd: integer; ZVerb: array[0..255] of AnsiChar; Verb: string; Handled: boolean; SCV: IShellCommandVerb; HR: HResult; I: Integer; Malloc: IMalloc; begin OleCheck(SHGetMalloc(Malloc)); OleCheck(SHGetDesktopFolder(Root));//Get the Desktop IShellFolder interface OleCheck(Root.ParseDisplayName(HND, nil, PWideChar(WideString(ExtractFilePath(aFileLst[0]))), chEaten, ParentFolderPIDL, dwAttributes)); // Get the PItemIDList of the parent folder OleCheck(Root.BindToObject(ParentFolderPIDL, nil, IShellFolder, ShellParentFolder)); // Get the IShellFolder Interface of the Parent Folder FilesPIDL := AllocMem(SizeOf(PItemIDList) * aFileLst.Count); try for I := 0 to aFileLst.Count - 1 do OleCheck(ShellParentFolder.ParseDisplayName(HND, nil, PWideChar(WideString(ExtractFileName(aFileLst[I]))), chEaten, FilesPIDL[I], dwAttributes)); // Get the relative PItemIDList of the File ShellParentFolder.GetUIObjectOf(HND, aFileLst.Count, FilesPIDL^[0], IID_IContextMenu, nil, CM); // get the IContextMenu Interace for the file finally for i := 0 to aFileLst.Count - 1 do begin if FilesPIDL^[i] <> nil then Malloc.Free(FilesPIDL^[i]); end; FreeMem(FilesPIDL); end; if CM = nil then Exit; Menu := CreatePopupMenu; try CM.QueryContextMenu(Menu, 0, 1, $7FFF, CMF_EXPLORE or CMF_CANRENAME); CM.QueryInterface(IID_IContextMenu2, ICM2); //To handle submenus. try Command := TrackPopupMenu(Menu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD, p.X, p.Y, 0, HND, nil); finally ICM2 := nil; end; if Command then begin ICmd := LongInt(Command) - 1; HR := CM.GetCommandString(ICmd, GCS_VERBA, nil, ZVerb, SizeOf(ZVerb)); Verb := StrPas(ZVerb); Handled := False; if Supports(nil, IShellCommandVerb, SCV) then begin HR := 0; SCV.ExecuteCommand(Verb, Handled); end; if not Handled then begin FillChar(ICI, SizeOf(ICI), #0); with ICI do begin cbSize := SizeOf(ICI); hWND := 0; lpVerb := MakeIntResourceA(ICmd); nShow := SW_SHOWNORMAL; end; HR := CM.InvokeCommand(ICI); end; if Assigned(SCV) then SCV.CommandCompleted(Verb, HR = S_OK); end; finally DestroyMenu(Menu) end; end; но меню появляется так как будто выбран только один, а не несколько файлов. подскажите плз, где ошибка в моем коде? Добавлено сори что потревожил кажись работает как надо просто была ошибка в формировке списка файлов ПС Кстати добавьте код в FAQ, а то в нете готового кода нету (а может просто плохо искал) |
|
Сообщ.
#2
,
|
|
|
|
Цитата Кстати добавьте код в FAQ, а то в нете готового кода нету (а может просто плохо искал) это твой код? добавлю у себя |
|
Сообщ.
#3
,
|
|
|
|
Цитата VahaC @ Кстати добавьте код в FAQ, а то в нете готового кода нету Оно? Контекстное меню для файла |
|
Сообщ.
#4
,
|
|
|
|
Цитата Rouse_ @ Оно? Контекстное меню для файла немного не оно там для одного файла, а у меня для нескольких Цитата antonn @ это твой код? взял код для одного айтема и перекрутил чтобы работало и для одного и для нескольких |
|
Сообщ.
#5
,
|
|
|
|
Возможно ли Popup-меню инициализировать стандартным меню виндовс? (сообщение #2965844) здесь я когда-то тоже спрашивал. Потом тоже допёр. Если надо - могу полностью код приложить.
|