Code: |
{©Drkb v.3} // Функция восстанавливает выбранный в ListView элемент из корзины... function RestoreElement(const AHandle: THandle; LV: TListView): Boolean;
function GetLVItemText(const Index: Integer): String; begin if Index = 0 then Result := LV.Selected.Caption else Result := LV.Selected.SubItems.Strings[Index - 1]; end;
var ppidl, Item: PItemIDList; Desktop: IShellFolder; RecycleBin: IShellFolder2; RecycleBinEnum: IEnumIDList; Fetched, I: Cardinal; Details: TShellDetails; Mallok: IMalloc; Valid: Boolean; Context: IContextMenu; AInvokeCommand: TCMInvokeCommandInfo; begin Result := False; if LV = nil then Exit; if SHGetMalloc(Mallok) = S_OK then if SHGetSpecialFolderLocation(AHandle, CSIDL_BITBUCKET, ppidl) = S_OK then if SHGetDesktopFolder(Desktop) = S_OK then if Desktop.BindToObject(ppidl, nil, IID_IShellFolder2, RecycleBin) = S_OK then if RecycleBin.EnumObjects(AHandle, SHCONTF_FOLDERS or SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN, RecycleBinEnum) = S_OK then begin // Перечиляем содержимое корзины while True do begin RecycleBinEnum.Next(1, Item, Fetched); if Fetched = 0 then Break; Valid := False; for I := 0 to DETAIL_COUNT - 1 do if RecycleBin.GetDetailsOf(Item, I, Details) = S_OK then try // Ищем нужный нам элемент Valid := GetLVItemText(I) = StrRetToString(Item, Details.str); if not Valid then Break; finally Mallok.Free(Details.str.pOleStr); end; // Если выделенный элемент найден if Valid then begin // Восстанавливаем его при помощи интерфейса IContextMenu if RecycleBin.GetUIObjectOf(AHandle, 1, Item, IID_IContextMenu, nil, Pointer(Context)) = S_OK then begin FillMemory(@AInvokeCommand, SizeOf(AInvokeCommand), 0); with AInvokeCommand do begin cbSize := SizeOf(AInvokeCommand); hwnd := AHandle; // - локализация не нужна... lpVerb := 'undelete'; // - восстановление фийла из корзины... //lpVerb := 'properties'; // - показ диалога свойства... //lpVerb := 'delete'; // - удаление файла из корзины... fMask := 0; lpDirectory := PChar(LV.Selected.SubItems.Strings[0]); nShow := SW_SHOWNORMAL; end; Result := Context.InvokeCommand(AInvokeCommand) = S_OK; Break; end; end; end; end; end;
procedure TForm1.mnuRestoreClick(Sender: TObject); begin if ListView1.Selected <> nil then if RestoreElement(Handle, ListView1) then ShowMessage('Элемент успешно восстановлен.'); end; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!