Autor Tema: Ctrl+z en LisView  (Leído 6932 veces)

0 Usuarios y 1 Visitante están viendo este tema.

JBB

  • Bytes
  • *
  • Mensajes: 28
  • Reputación: +3/-0
    • Ver Perfil
Ctrl+z en LisView
« en: Agosto 05, 2015, 04:25:23 pm »
Hace Muuuuuucho tiempo que vengo realizando un programa con LisView y solo me queda que resolver el tema de recuperar lo que eliminas y va a la papelera.

Me explico:
Es un explorador como el de windows de archivos y carpetas.
En el LV aparecen los archivos y al seleccionar algo y pulsar la tecla delete o suprimir o eliminar, lo mandas a la papelera.

El tema es que quiero pulsar Ctrl+z y que regrese a su origen.
Alguna idea???

GRACIAS MIL o mejor 1 MILLON

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Ctrl+z en LisView
« Respuesta #1 en: Agosto 08, 2015, 01:41:39 pm »
Yo creo que tenes que poner en otro Listview o dentro de una variable temporal por asi decirlo la ruta y el nombre del archivo y cuando pulzas dentro de tu programa la combinacion de control z que vuelva el archivo en su lugar original.
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Ctrl+z en LisView
« Respuesta #2 en: Agosto 08, 2015, 08:04:44 pm »
hola no tengo ni idea, pero que código empleas para enviar a la papelera quizás tenga alguna forma de revertir.

Saludos.


JBB

  • Bytes
  • *
  • Mensajes: 28
  • Reputación: +3/-0
    • Ver Perfil
Re:Ctrl+z en LisView
« Respuesta #3 en: Agosto 10, 2015, 09:39:15 am »
hola no tengo ni idea, pero que código empleas para enviar a la papelera quizás tenga alguna forma de revertir.

Saludos.

He utilizado el FSO pero funciona mejor esta función que pongo.
Esta es la función que utilizo:
'''''''Mueve Copia Elimina y lo manda a la papelera
Public Const FO_MOVE As Long = &H1
Public Const FO_COPY As Long = &H2
Public Const FO_DELETE = &H3
Public Const FOF_ALLOWUNDO = &H40
Type SHFILEOPSTRUCT
     hwnd As Long
     wFunc As Long
     pFrom As String
     pTo As String
     fFlags As Integer
End Type
Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

Gracias.

JBB

  • Bytes
  • *
  • Mensajes: 28
  • Reputación: +3/-0
    • Ver Perfil
Re:Ctrl+z en LisView
« Respuesta #4 en: Agosto 10, 2015, 09:45:31 am »
Yo creo que tenes que poner en otro Listview o dentro de una variable temporal por asi decirlo la ruta y el nombre del archivo y cuando pulzas dentro de tu programa la combinacion de control z que vuelva el archivo en su lugar original.

La idea que comentas se me escapa de mi entendimiento ya que la papelera es una ruta especial (por decirlo de alguna manera).
No es lo mismo que entres a la papelera con el icono de windows a que entres en C:\RECYCLER\
Esa carpeta genera nombres diferentes dentro de un index que a su vez crea unas carpetas con este tipo de nombres:
S-1-5-21-515967899-1482476501-1801674531-1003

Si se te ocurre un ejemplo de como hacerlo aunque no utilicemos un LV seria perfecto.
Gracias

JBB

  • Bytes
  • *
  • Mensajes: 28
  • Reputación: +3/-0
    • Ver Perfil
Re:Ctrl+z en LisView
« Respuesta #5 en: Agosto 10, 2015, 10:04:23 am »
Ctrl+z es algo que utilizo mucho, pero hay que decirlo todo, PUEDE SER MUY PELIGROSO a menos que estés acostumbrado a utilizar esa combinación.

Porque?
Muy sencillo, restaura todo tipo de cosas, lo que mandas a la papelera, un titulo de un archivo o carpeta e incluso lo que puedas haber modificado en el interior de algunos tipos de archivos tipo documentos.
De manera que si por error pulsas una vez mas de la cuenta, el desastre puede ser tremendo y no te enteras.

Ctrl+z  o la flecha de deshacer para mi es perfecto, pero Windows tendría que mejorarlo y que el usuario sepa que es lo que se va a restaurar, o repito, puede ser un desastre monumental.

Este es un error que vienen repitiendo desde Win95 y que en el próximo Win10 también viene de la misma forma.

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Ctrl+z en LisView
« Respuesta #6 en: Agosto 10, 2015, 11:35:58 pm »
Estimado JBB


Una alternativa es que coloques un botón, y que al hacer clic le abra al usuario la papelera de reciclaje para que el usuario seleccione que es lo que necesita restaurar.
Una forma de hacerlo es por Shell, para ello tendrás que colocar dentro del evento clic del botón el siguiente código:


Shell "explorer " & "::{645FF040-5081-101B-9F08-00AA002F954E}", vbNormalFocus




Saludos, desde algún lugar de Lima-Perú
Saludos, desde algún lugar de Lima-Perú

JBB

  • Bytes
  • *
  • Mensajes: 28
  • Reputación: +3/-0
    • Ver Perfil
Re:Ctrl+z en LisView
« Respuesta #7 en: Agosto 12, 2015, 04:35:07 am »
Hola Albertomi.
La opción de abrir la papelera ya la tengo puesta pero no me convence.
Necesito saber como lo hace Windows.

Gracias.

79137913

  • Megabyte
  • ***
  • Mensajes: 185
  • Reputación: +21/-4
  • 4 Esquinas
    • Ver Perfil
    • Eco.Resumen Resumenes Cs. Economicas
Re:Ctrl+z en LisView
« Respuesta #8 en: Agosto 12, 2015, 08:42:15 am »
HOLA!!!

Windows tiene un registro de eventos que guarda el explorer.exe, en el mismo se guarda un log tal como:
move file1 file2
delete file1
rename file1 file2

todo asi, cuando pones control Z simplemente se revierte la accion.

Para info de como hacer restore en recycle bin: https://social.msdn.microsoft.com/Forums/vstudio/en-US/05f1476f-a101-4766-847b-0bdf4f6ad397/restore-undelete-file-from-recycle-bin

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

 79137913                          *Shadow Scouts Team*                                                          Resumenes Cs.Economicas

JBB

  • Bytes
  • *
  • Mensajes: 28
  • Reputación: +3/-0
    • Ver Perfil
Re:Ctrl+z en LisView
« Respuesta #9 en: Agosto 12, 2015, 11:04:02 am »
Gracias 7913.
Lo malo es que esta en .net y C* y solo conozco vb6.
Aquí dejo la url del proyecto y funciona bien: http://www.codeproject.com/Articles/2783/How-to-programmatically-use-the-Recycle-Bin

Estuve meditando lo que dice Albertomi de guardar una lista de lo que se elimina y creo que esa formula puede servir.
Lo quiero probar un rato de estos.

De todas formas, muchas gracias.

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Ctrl+z en LisView
« Respuesta #10 en: Agosto 12, 2015, 09:58:28 pm »
Estimado JBB

Ando algo complicado de tiempo, por ello es que respondo algo rápido, pero no dudo que me captaras la idea.

1. Cada vez que elimines un archivo debes de mantener un control del nombre y la extensión del archivo eliminado, para diferenciarlo luego del resto de archivos que hay en la papelera de reciclaje. A esto le he llamado en seudo código "ListaDeArchivosEliminadosDesdeTuAplicacion"

 
2. Este procedimiento te permitirá, con alguna adecuación de tu parte, mostrar en un ListView por ejemplo, solo aquellos archivos eliminados desde tu aplicación descartando el resto de objetos que hay en la papelera de reciclaje.
Public Sub UpdateListViewFileToRestore()
  Const ssfBITBUCKET = 10
 
  Dim objShell As Object
  Dim objRecycleBin As Object
  Dim objRecycleBinItem As Object
 
 
  Set objShell = CreateObject("shell.application")
  Set objRecycleBin = objShell.Namespace(ssfBITBUCKET)
 
  If (Not objRecycleBin Is Nothing) Then
    With objRecycleBin
      For Each objRecycleBinItem In .items
        If objRecycleBinItem.Name = EstaEn_ListaDeArchivosEliminadosDesdeTuAplicacion Then
          AdicionaAlListView_ArchivosRestaurables   'Esto lo implementas tu
        End If
      Next
    End With
  End If
 
  Set objRecycleBinItem = Nothing
  Set objRecycleBin = Nothing
  Set objShell = Nothing
End Sub


3. Del ListView podrás seleccionar el elemento que quieran y restaurarlo a su ubicación original llamando a esta función. El parámetro FullName es el nombre del objeto más su extensión
Public Function RestoreFile(ByVal FullName As String) As Boolean
  Const ssfBITBUCKET = 10
  Const FOF_NOCONFIRMATION = 16
 
  Dim strNameObject As String
  Dim objShell As Object
  Dim objRecycleBin As Object
  Dim objFolderToRestore As Object
  Dim objRecycleBinItem As Object
 
 
  strNameObject = vbNullString
 
  Set objShell = CreateObject("shell.application")
  Set objRecycleBin = objShell.Namespace(ssfBITBUCKET)
 
  If (Not objRecycleBin Is Nothing) Then
    With objRecycleBin
      For Each objRecycleBinItem In .items
        If FullName = objRecycleBinItem.Name Then
          Set objFolderToRestore = objShell.Namespace(objRecycleBinItem.ExtendedProperty("{9B174B33-40FF-11D2-A27E-00C04FC30871}2"))
          objFolderToRestore.MoveHere objRecycleBinItem.Path, FOF_NOCONFIRMATION
         
          ActualizaListaDeArchivosEliminadosDesdeTuAplicacion   'Esto lo implementas tu
          Exit Function
        End If
       
        DoEvents
      Next
    End With
  End If
   
 
  Set objFolderToRestore = Nothing
  Set objRecycleBinItem = Nothing
  Set objRecycleBin = Nothing
    Set objShell = Nothing
End Function

 
Saludos, desde algún lugar de Lima-Perú
Saludos, desde algún lugar de Lima-Perú

JBB

  • Bytes
  • *
  • Mensajes: 28
  • Reputación: +3/-0
    • Ver Perfil
Re:Ctrl+z en LisView
« Respuesta #11 en: Agosto 13, 2015, 02:52:03 am »
Gracias Albertomi, este finde lo pruebo y ya diré que tal me resulto, aunque promete.