Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   ShellListView consultas varias (https://www.clubdelphi.com/foros/showthread.php?t=44031)

MaMu 26-05-2007 17:43:15

ShellListView consultas varias
 
Tengo un ShellListView apuntado directamente a un directorio, (lo uso para visualizar los directorios que existen y se vayan creando dentro del directorio apuntado. Tambien lo tengo configurado en su propiedad AutoRefresh como True, asi puedo visualizar en tiempo real cuando se crea o se elimina un directorio. Mis dudas son las siguientes:

1) Como puedo saber el nombre de la ultima carpeta creada (Path)?
2) Como puedo hacer para obtener lo de mi pregunta 1) despues de haber sido creada, cuando se autorefresca el ShellListView?

Es que necesito, agregar el nombre de la carpeta cuando se crea, a una base de datos con un cambo Path y un campo Estado, a True cuando se crea, a False cuando se Elimina.

Si alguien me puede dar una mano, se lo agradecere.

Saludos y Gracias

cHackAll 30-05-2007 21:46:02

Solucion
 
1 Archivos Adjunto(s)

Acá tengo tu solucion, funciona para todos los casos:

Código Delphi [-]
var List: TStrings;
 
procedure BuildList(Path: string; Refresh: Boolean = True);
var Handle: Cardinal; Index: Integer; FindData: TWin32FindData;
begin
 if Refresh then List.Clear;
 Handle := FindFirstFile(PChar(Path + '\*.*'), FindData);
 if Handle <> INVALID_HANDLE_VALUE then
  begin
   repeat
    with FindData do
     if ((dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0) and
        (string(cFileName) <> '.') and (cFileName <> '..') then
      if Refresh then
       List.Add(cFileName)
      else
       begin
        Index := List.IndexOf(cFileName);
        if Index <> -1 then
         List.Delete(Index)
        else
         List.Add(cFileName);
       end;
   until not FindNextFile(Handle, FindData);
   Windows.FindClose(Handle);
  end;
end;
 
function Thread(Handle: Cardinal): Cardinal; stdcall;
label Next; var Path: string;
begin
 List := TStringList.Create;
 Path := Form1.ShellListView.Root;
 if Path[Length(Path)] = '\' then
  SetLength(Path, Length(Path) - 1);
 BuildList(Path);
 Handle := FindFirstChangeNotification(PChar(Path), False, FILE_NOTIFY_CHANGE_DIR_NAME);
 Next: WaitForSingleObject(Handle, INFINITE);
 BuildList(Path, False);
 Form1.ListBox.Items := List; // Acá lo usas como evento
 FindNextChangeNotification(Handle);
 BuildList(Path);
 goto Next;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var Dummy: Cardinal;
begin
 CreateThread(nil, 0, @Thread, nil, 0, Dummy);
 Caption := 'Change to see: ' + ShellListView.Root;
end;

Te explico (porsiaca), el proc. BuildList reacciona de dos maneras, por defecto llena en "Buffer doble" una lista de los directorios (solo los nombres), y del otro "modo" te hace una segregación de los directorios (carpetas o como le llames), modificados.

El hilo Thread es el disparador que con la API FindFirstChangeNotification y WaitForSingleObject llama a BuildList al producirce un cambio en el nombre de las carpetas.

En donde está el comentario el ListBox muestra los cambios, pero puedes usarlo a tu gusto pues te retorna hasta el antigüo nombre y el nuevo en caso de ser renombrado. Si quieres usalo como su fuese un "OnChange"

Te la adjunto para que lo entiendas mejor...

PD: Disculpa el retraso pero andaba "programando"

Suerte!


La franja horaria es GMT +2. Ahora son las 12:48:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi