Jump to content


Photo

Seleccionar una Carpeta


  • Please log in to reply
1 reply to this topic

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 22 August 2010 - 01:02 PM

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:


cpp
  1. #include <shlobj.h>
  2.  
  3. // Asegurarse que Directory tiene espacio igual o mayor de MAX_PATH
  4. BOOL SelectDirectory(HWND hWnd, const PCHAR Caption, PCHAR Directory)
  5. {
  6.   BROWSEINFO    BrowseInfo;
  7.   LPITEMIDLIST  ItemIDList;
  8.   LPMALLOC      ShellMalloc;
  9.  
  10.   ZeroMemory(&BrowseInfo, sizeof(BrowseInfo));
  11.   if(SHGetMalloc(&ShellMalloc) == S_OK && ShellMalloc){
  12.     BrowseInfo.hwndOwner = hWnd;
  13.     BrowseInfo.pidlRoot = 0;
  14.     BrowseInfo.pszDisplayName = Directory;
  15.     BrowseInfo.lpszTitle = Caption;
  16.     BrowseInfo.ulFlags = BIF_RETURNONLYFSDIRS;
  17.     ItemIDList = SHBrowseForFolder(&BrowseInfo);
  18.     if(ItemIDList){
  19.       SHGetPathFromIDList(ItemIDList, Directory);
  20.       ShellMalloc->Free(ItemIDList);
  21.     }
  22.   }
  23.   return ItemIDList!=0;
  24. }



Ejemplo en C:


cpp
  1. char Carpeta[MAX_PATH];
  2. SelectDirectory(Handle, "Seleccione la carpeta destino", Carpeta);



Y ahora en delphi:


delphi
  1. uses ShlObj, ActiveX;
  2.  
  3. function SelectDirectory(Wnd: HWND; const Caption: string; var Directory: String): boolean;
  4. var
  5.   BrowseInfo:  TBrowseInfo;
  6.   ItemIDList:  PItemIDList;
  7.   ShellMalloc: IMalloc;
  8.   Buffer:      array [0..MAX_PATH] of CHAR;
  9. begin
  10.   ZeroMemory(@BrowseInfo, sizeof(BrowseInfo));
  11.   if(SHGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
  12.   begin
  13.     BrowseInfo.hwndOwner:= Wnd;
  14.     BrowseInfo.pidlRoot:= 0;
  15.     BrowseInfo.pszDisplayName:= Buffer;
  16.     BrowseInfo.lpszTitle:= PCHAR(Caption);
  17.     BrowseInfo.ulFlags:= BIF_RETURNONLYFSDIRS;
  18.     ItemIDList:= SHBrowseForFolder(BrowseInfo);
  19.     if(ItemIDList <> nil) then
  20.     begin
  21.       SHGetPathFromIDList(ItemIDList, Buffer);
  22.       ShellMalloc.Free(ItemIDList);
  23.       Directory:= Buffer;
  24.     end;
  25.   end;
  26.   Result:= ItemIDList <> nil;
  27. end;



Ejemplo en delphi:


delphi
  1. var
  2.   Carpeta: string;
  3. begin
  4.   SelectDirectory(Handle, 'Seleccione Carpeta', Carpeta);
  5.   Label1.Caption:= Carpeta;
  6. end;



Espero que os sea de utilidad.

Saludos.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 22 August 2010 - 02:10 PM

Que  bien, una función más del API que habrá que estudiar :)

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.