Page 1 of 1

Una de cGetFile()

Posted: Fri Oct 07, 2005 5:23 pm
by Yannis
Hola a todos !
Tengo un problema con cGetFile()
En modo seleccionar UN solo archivo, todo funciona .
En modo multiseleccion , me deja seleccionar mas archivos, pero me devuelve SOLO la ruta donde estan los archivos !

FWH 2.5 + xHarbour + Borland + Windows XP pro
Esta es la funcion que uso :

Code: Select all

// Function YGetFile
Function YGetFile(cFileName)
   local cFile,  cFileMask, cTitle
   Local nDefaultMask, cInitDir, nFlags,  cIniFile, lSave
   Local lLongNames
   MemVar oApp

   cTitle       := "Select file"
   cFileMask    := "Jpeg   (*.jpg) |*.jpg|" + ;
                   "Bitmap (*.bmp) |*.bmp|" + ;
                   "Tiff   (*.tif)  |*.tif|" + ;
                   "Gif    (*.gif)  |*.gif|"

   cTitle       := "Select a photo"
   nDefaultMask := 1
   cInitDir     := ".\"
   nFlags       := OFN_ALLOWMULTISELECT + OFN_EXPLORER   // 512 + 524288
   cIniFile     := ""
   cFileName    := ""
   lSave        := .f.
   lLongNames   := .t.

   cFile        := Space(32000)

   //cGetFile( <cFileMask>, <cTitle>, [<nDefaultMask>], [<cInitialDirectory>], [lSave], [lLongNames], [nFlags] )  --> <cFileName>
   cFile := cGetFile(cFileMask,;
                     cTitle,;
                     nDefaultMask,;
                     cInitDir,;
                     lSave,;
                     lLongNames,;
                     nFlags)

   ? cfile

   If Empty(cFile)
      cFile := cFileName
   Endif
Return cFile

Alguien tiene una solucion ?
De antemano muchas gracias por su ajuda :-)
Un saludo

cGetFile multiple

Posted: Sat Oct 08, 2005 9:20 am
by Paco Garcia
Hola, pues algo asi me paso a mi. Copiando de aqui y de allí conseguí sacar esta función que creo que funciona.

Si alguien la quiere mejorar pues... la compartiremos todos.

Un saludo

Paco García

Code: Select all


#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"
#include <shlobj.h>

static far char IniDir[] = ".\\";
static char szDirName[ MAX_PATH ];
void cdecl _bcopy( void *, void *, unsigned int );
static far char Title[] = "Select the file";

HB_FUNC ( CGETFILEEX )   
{
	OPENFILENAME ofn;
	char buffer[65536];
	char cFullName[64][1024];
	char cCurDir[512];
	char cFileName[512];
	int iPosition = 0;
	int iNumSelected = 0;
	int n;
   LPSTR  pFile,pFilter,pTitle,pDir;
   WORD w = 0, wLen;
	int flags =  OFN_ALLOWMULTISELECT | OFN_EXPLORER ; //OFN_FILEMUSTEXIST  |

	buffer[0] = 0 ;

   pTitle = ( LPSTR ) hb_xgrab( 128 );

   if ( hb_pcount() > 1 && ISCHAR( 2 ) )
   {
      wLen   = min( ( unsigned long ) 127, hb_parclen( 2 ) );
      _bcopy( pTitle, hb_parc( 2 ), wLen );
      * ( pTitle + wLen ) = 0;

   }
   else
   {
      pTitle  = Title;
   }

   pDir = ( LPSTR ) hb_xgrab( 128 );

   if ( hb_pcount() > 3 && ISCHAR( 4 ) )
   {
      wLen  = min( ( unsigned long ) 127, hb_parclen( 4 ) );
      _bcopy( pDir, hb_parc( 4 ), wLen );
      * ( pDir + wLen ) = 0;
   }
   else
   {
      * ( pDir ) = 0;
   }

   pFile = ( LPSTR ) hb_xgrab( 255 );

   if ( hb_pcount() > 7 && ISCHAR( 8 ) )
   {
      wLen = min( ( unsigned long ) 254, hb_parclen( 8 ) );
      _bcopy( pFile, hb_parc( 8 ), wLen );
   }
   else
   {
      wLen = min( ( unsigned long ) 254, hb_parclen( 1 ) );
      _bcopy( pFile, hb_parc( 1 ), wLen );
   }
   * ( pFile + wLen ) = 0;

   pFilter = ( LPSTR ) hb_xgrab( 400 );
   wLen    = min( ( unsigned long ) 398, hb_parclen( 1 ) );
   _bcopy( pFilter, hb_parc( 1 ), wLen );
   * ( pFilter + wLen ) = 0;

   while( * ( pFilter + w ) )
   {
      if( * ( pFilter + w ) == '|' )
      {
         * ( pFilter + w ) = 0;
         if ( hb_pcount() < 8 )
            * (pFile) = 0;
      }
      w++;
   }

   * ( pFilter + wLen  ) = 0;
   * ( pFilter + wLen + 1 ) = 0;


	memset( (void*) &ofn, 0, sizeof( OPENFILENAME ) );
	ofn.lStructSize = sizeof(ofn);
	ofn.hwndOwner = GetActiveWindow();
	ofn.lpstrFilter = pFilter;
	ofn.nFilterIndex = 1;
	ofn.lpstrFile = buffer;
	ofn.nMaxFile = sizeof(buffer);
	ofn.lpstrInitialDir = hb_parc(3);
	ofn.lpstrTitle = pTitle;
	ofn.nMaxFileTitle = 512;
	ofn.Flags = flags;

	if( GetOpenFileName( &ofn ) )
	{
		if(ofn.nFileExtension!=0)
		{
			hb_retc( ofn.lpstrFile );
		}
		else
		{
			wsprintf(cCurDir,"%s",&buffer[iPosition]);
			iPosition=iPosition+strlen(cCurDir)+1;

			do
			{
				iNumSelected++;
				wsprintf(cFileName,"%s",&buffer[iPosition]);
				iPosition=iPosition+strlen(cFileName)+1;
				wsprintf(cFullName[iNumSelected],"%s\\%s",cCurDir,cFileName);
			}
			while(  (strlen(cFileName)!=0) && ( iNumSelected <= 63 ) );

			if(iNumSelected > 1)
			{
				hb_reta( iNumSelected - 1 );

				for (n = 1; n < iNumSelected; n++)
				{
					hb_storc( cFullName[n], -1, n );
				}
			}
			else
			{
				hb_retc( &buffer[0] );
			}
		}
	}
	else
	{
		hb_retc( "" );
	}
}

INT CALLBACK BrowseCallbackProc(HWND hwnd,
                                UINT uMsg,
                                LPARAM lp,
                                LPARAM pData)
{
   switch(uMsg)
   {
   case BFFM_INITIALIZED:
      if (szDirName)
      {
         // WParam is TRUE since you are passing a path.
         // It would be FALSE if you were passing a pidl.
         SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)szDirName);
      }
      break;
   }
   return 0;
}

#pragma ENDDUMP


Posted: Sat Oct 08, 2005 10:14 am
by Guest
Hola Paco !
Ya me hice unas pruebas.
Funciona muy bien ! :-)
Excellente la solucion la de revolver un array de archivos !

Un problemita :
Cuando la seleccion es de UN solo archivo, devuelve un array con las letras del nombre del archivo.
Nada para preocuparse. Hago un check para ver si los elementos del array
tienen un solo caratter.

Ya me salvaste el dia :D :D
Muchas gracias por tu tiempo y por este aporte..
Un saludo
Yannis Yannas
http://www.trinityvision.gr

Se puede arreglar la clase Original ;-)

Posted: Thu Oct 20, 2005 5:03 pm
by jesus
Ya que hay un parche que funciona, mas o menos... Necesita que se le pasen ciertos parametros para que sea igual que la clase original.

Antonio !
¿ por que no se puede arreglar la clase original ?
Necesito la multiple selección, pero tambien la normal y que le pueda pasar los flags...

Un saludo