PDA

Ver la Versión Completa : ShellListView consultas varias


MaMu
26-05-2007, 17:43:15
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
Acá tengo tu solucion, funciona para todos los casos:


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!