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;

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!