Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cuadros De Dialogo: Multipleseleccion

Iniciado por MA]Mestre, 25 de Enero de 2004, 06:21:24 PM

« anterior - próximo »

MA]Mestre

 Hola,

Hace tiempo que arrastro la estupidez de no poder crear un cuadro de dialogo estandart, que permita la seleccion de multiples objetos del disco duro. Utilizo de siempre:

GetOpenFileName (...
GetSaveFileName (...

alguna sugerencia ?

P.D: Creo recordar un dia que me puse tozudo y encontre algun Flag de múltiple selección para esas Apis, lo que no recuerdo es si no funionaba o bien si después no era capaz de saber la lista de elementos selecionados ( creo que esta última opcion es lo que me pasaba )

Un saludo.

Zaelsius

 Copiado del MS Platform SDK:

BOOL GetOpenFileName(LPOPENFILENAME lpofn);

typedef struct tagOFN {
 DWORD         lStructSize;
 HWND          hwndOwner;
 HINSTANCE     hInstance;
 LPCTSTR       lpstrFilter;
 LPTSTR        lpstrCustomFilter;
 DWORD         nMaxCustFilter;
 DWORD         nFilterIndex;
 LPTSTR        lpstrFile;
 DWORD         nMaxFile;
 LPTSTR        lpstrFileTitle;
 DWORD         nMaxFileTitle;
 LPCTSTR       lpstrInitialDir;
 LPCTSTR       lpstrTitle;
 DWORD         Flags;
 WORD          nFileOffset;
 WORD          nFileExtension;
 LPCTSTR       lpstrDefExt;
 LPARAM        lCustData;
 LPOFNHOOKPROC lpfnHook;
 LPCTSTR       lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
 void *        pvReserved;
 DWORD         dwReserved;
 DWORD         FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;


Ejemplito:


char szSelection[2048]; // Reservar espacio suficiente para todos los nombres de arhivo.

OPENFILENAME of;
ZeroMemory((OPENFILENAME*)&of,sizeof(OPENFILENAME));
of.lStructSize = sizeof (OPENFILENAME);
of.lpstrFile = &szSelection;
of.nMaxFile = sizeof(szSelection);
of.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER;

if(GetOpenFileName(&of))
{
//procesar nombres
}



szSelection[0]  contiene el directorio de los archivos seleccionados(acaba con carácter nulo).
szSelection[of.nFileOffset] contiene el primer archivo seleccionado. A partir de ahí se suceden los demás nombres de archivos, separados por caracteres nulos( los \0). El final es marcado por un dos caracteres nulos.


Explicación:

OFN_ALLOWMULTISELECT
Specifies that the File Name list box allows multiple selections. If you also set the OFN_EXPLORER flag, the dialog box uses the Explorer-style user interface; otherwise, it uses the old-style user interface.
If the user selects more than one file, the lpstrFile buffer returns the path to the current directory followed by the file names of the selected files. The nFileOffset member is the offset, in bytes or characters, to the first file name, and the nFileExtension member is not used. For Explorer-style dialog boxes, the directory and file name strings are NULL separated, with an extra NULL character after the last file name. This format enables the Explorer-style dialog boxes to return long file names that include spaces. For old-style dialog boxes, the directory and file name strings are separated by spaces and the function uses short file names for file names with spaces. You can use the FindFirstFile function to convert between long and short file names.

MA]Mestre

 Creo que se lo que es la MS Platform SDK... ...me he pasado un par de veces. ¿ Lo has probado algun vez ? ¿ funciona ? ¿ o simplemente lo has copiado ?


Un saludo.

Zaelsius

 Perdona si te he tradado como un subnormalito, pero no puedo recordar de memoria el nivel de todos los miembros del foro o si usan Windows o Linux normalmente o si saben D3D o OpenGL, etc :rolleyes:

No copié el código del SDK, si lo pruebas verás que faltan algunos casts, etc.

Para asegurarme que no meto la pata, acabo de probarlo y de añadir un MessageBox para mostrar los ficheros:

char szSelection[2048]=""; // Reservar espacio suficiente para todos los nombres de arhivo.

OPENFILENAME of;
ZeroMemory((OPENFILENAME*)&of,sizeof(OPENFILENAME));
of.lStructSize = sizeof (OPENFILENAME);
of.lpstrFile = (char*)&szSelection;
of.nMaxFile = sizeof(szSelection);
of.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER;

if(GetOpenFileName(&of))
{
 unsigned int p = 0;

 while(1)
 {
                       // Notése que nos saltamos el primer elemento, el directorio
  while(szSelection[p]!='\0')p++;

  if(szSelection[p+1]==0)break;

  MessageBox(0,(char*)&szSelection[++p],"Elemento",MB_OK);

 }
}


Puedes crear un proyecto Win32 en Visual Studio y añadir ese código al final de InitInstance().  

MA]Mestre

 Thanks ZaelSiuS,

Ahora que se que funciona ya lo utilizaré, debi estar ofuscado el día que lo intente, pq no es nada del otro mundo. Thanks de nuevo.

Un saludo.


Zaelsius

 Justo ahora he necesitado usar el código en MFC, pero mirando de hacerlo lo más sencillo posible usando las funciones que provee la clase CFileDialog, me ha salido esto:


POSITION p = dlg.GetStartPosition();
CString cstr;
while(p)
{
 cstr = dlg.GetNextPathName(p);
 MessageBox(cstr);
}

Ese trozo sustituiría al bucle while(1) del código anterior(que era Win32).






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.