Para seleccionar una carpeta, delphi y Builder disponen de la conocida función SelectDirectory.
En aquellos casos en los que nuestro programa requiera bajo nivel de programación usando la API directamente, podemos implementar una función similar usando sólo la API, en concreto SHBrowseForFolder.
Coloco un código simple en C y delphi:
En C:
Código: [Seleccionar]
#include// Asegurarse que Directory tiene espacio igual o mayor de MAX_PATH BOOL SelectDirectory(HWND hWnd, const PCHAR Caption, PCHAR Directory) { BROWSEINFO BrowseInfo; LPITEMIDLIST ItemIDList; LPMALLOC ShellMalloc; ZeroMemory(&BrowseInfo, sizeof(BrowseInfo)); if(SHGetMalloc(&ShellMalloc) == S_OK && ShellMalloc){ BrowseInfo.hwndOwner = hWnd; BrowseInfo.pidlRoot = 0; BrowseInfo.pszDisplayName = Directory; BrowseInfo.lpszTitle = Caption; BrowseInfo.ulFlags = BIF_RETURNONLYFSDIRS; ItemIDList = SHBrowseForFolder(&BrowseInfo); if(ItemIDList){ SHGetPathFromIDList(ItemIDList, Directory); ShellMalloc->Free(ItemIDList); } } return ItemIDList!=0; }
Ejemplo en C:
Código: [Seleccionar]
char Carpeta[MAX_PATH]; SelectDirectory(Handle, "Seleccione la carpeta destino", Carpeta);
Y ahora en delphi:
Código: [Seleccionar]
uses ShlObj, ActiveX; function SelectDirectory(Wnd: HWND; const Caption: string; var Directory: String): boolean; var BrowseInfo: TBrowseInfo; ItemIDList: PItemIDList; ShellMalloc: IMalloc; Buffer: array [0..MAX_PATH] of CHAR; begin ZeroMemory(@BrowseInfo, sizeof(BrowseInfo)); if(SHGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then begin BrowseInfo.hwndOwner:= Wnd; BrowseInfo.pidlRoot:= 0; BrowseInfo.pszDisplayName:= Buffer; BrowseInfo.lpszTitle:= PCHAR(Caption); BrowseInfo.ulFlags:= BIF_RETURNONLYFSDIRS; ItemIDList:= SHBrowseForFolder(BrowseInfo); if(ItemIDList <> nil) then begin SHGetPathFromIDList(ItemIDList, Buffer); ShellMalloc.Free(ItemIDList); Directory:= Buffer; end; end; Result:= ItemIDList <> nil; end;
Ejemplo en delphi:
Código: [Seleccionar]
var Carpeta: string; begin SelectDirectory(Handle, 'Seleccione Carpeta', Carpeta); Label1.Caption:= Carpeta; end;
Espero que os sea de utilidad.
Saludos.
1 comentarios:
no importa si tiene mas contenido que MAX_PATH, ahi solo le cambias esa constante por un valor 4 o 5 vevces mayor para que no tehagas problemas pq MAX_PATH solo ekivale a 255 si tu le pones $FFFF ya pz con eso es suficiente
Publicar un comentario