Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как в проводнике


FifteenTen ©   (2006-07-19 00:03:00) 

У меня такой вопрос:

Во многих программах видел ListView с выводом файлов, но главное это то, что при нажатии на фаил правой кнопкой вылезает PopupMenu как в проводнике - так вот, как это они делают?(если можно, то на примере)

И ещё, а можно ли изменять класс окна в запущенном приложении?


DiamondShark   (2006-08-02 02:16:00) [1]


> Во многих программах видел ListView с выводом файлов, но
> главное это то, что при нажатии на фаил правой кнопкой вылезает
> PopupMenu как в проводнике - так вот, как это они делают?
> (если можно, то на примере)

Можно на примере.

uses
 ComObj,
 ActiveX,
 ShellApi,
 ShlObj;

procedure TForm1.Button1Click(Sender: TObject);
var
   desktop: IShellFolder;
   mycomputer: IShellFolder;
   folder: IShellFolder;
   pidl: PItemIDList;
   malloc: IMalloc;
   chEaten: ULONG;
   dwAttributes: ULONG;
   contMenu: IContextMenu;
   menu: HMENU;
   cmd: UINT;
   cmici: CMINVOKECOMMANDINFO;
begin
   OleCheck( SHGetMalloc(malloc) );

   OleCheck( SHGetDesktopFolder(desktop) );
   OleCheck( SHGetSpecialFolderLocation(Handle, CSIDL_DRIVES, pidl) );
   try
       OleCheck( desktop.BindToObject(pidl, nil, IShellFolder, mycomputer) );
   finally
       malloc.Free(pidl);
   end;
   dwAttributes := 0;
   OleCheck( mycomputer.ParseDisplayName(Handle, nil, 'C:\My Video\Clips\Nightwish', chEaten, pidl, dwAttributes) );
   try
       OleCheck( mycomputer.BindToObject(pidl, nil, IShellFolder, folder) );
   finally
       malloc.Free(pidl);
   end;
   dwAttributes := 0;
   OleCheck( folder.ParseDisplayName(Handle, nil, 'Nightwish_-_I_Wish_I_Had_An_Angel.mpg', chEaten, pidl, dwAttributes) );
   try
       OleCheck( folder.GetUIObjectOf(Handle, 1, pidl, IContextMenu, nil, contMenu) );
   finally
       malloc.Free(pidl);
   end;
   menu := CreatePopupMenu;
   try
       OleCheck( contMenu.QueryContextMenu(menu, 0, 1, 65535, CMF_NORMAL) );
       cmd := UINT(TrackPopupMenu(menu, TPM_RETURNCMD, Mouse.CursorPos.x, Mouse.CursorPos.y, 0, Handle, nil));
   finally
       DestroyMenu(menu);
   end;
   if cmd > 0 then
       begin
           cmici.cbSize := sizeof(cmici);
           cmici.fMask := 0;
           cmici.hwnd := Handle;
           cmici.lpVerb := PChar(cmd - 1);
           cmici.lpParameters := nil;
           cmici.lpDirectory := nil;
           cmici.nShow := SW_NORMAL;
           OleCheck( contMenu.InvokeCommand(cmici) );
       end
end;


Alexx2000   (2006-08-02 00:37:00) [2]

Посмотри исходники ShellListView (входит в поставку Delphi), или используй этот компонент. Я даже портировал его под KOL, но никак не могу выложить.


Игорь Шевченко   (2006-07-19 11:26:00) [3]


> И ещё, а можно ли изменять класс окна в запущенном приложении?


Можно. Убить окно, создать его от другого класса.


FifteenTen   (2006-07-19 01:25:00) [4]

Потому что, если задам не в конференции KOL то мне ответят что то типа:

"создай класс TComponent" или "Делается это элементарно, используя процедуры VCL ..." - эт я к примеру:) (а дальше в том же духе)

А так как на моей машине запускается Delphi IDE преимущественно с использованием KOL, то вполне разумно задать этот вопрос на форуме посвященном данной библиотеке, kol kol kol:)


AndreyRus   (2006-07-19 00:32:00) [5]

А почему вы задаете этот вопрос в конференцию KOL, если он не имеет к ней отношение?


Наверх

Титульная страница Поиск, карта сайта Написать письмо