Ir al contenido


Foto

Seleccionar una Carpeta


  • Por favor identifícate para responder
1 respuesta en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 22 agosto 2010 - 01:02

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
  • 14.460 mensajes
  • LocationMéxico

Escrito 22 agosto 2010 - 02:10

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

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.