Page 1 of 1

cGetFile help

Posted: Mon May 11, 2015 2:15 pm
by Wanderson
Hi,

How I can use cGetFile to select more than one file?

Thanks.

Re: cGetFile help

Posted: Mon May 11, 2015 2:44 pm
by MarcoBoschi
Try this

Is not my code 8)

Code: Select all

    #include "Fivewin.ch"


    FUNCTION MAIN()

        LOCAL aFiles := CGETFILEEX( "Tutti i file (*.*)|*.*", "Select more files", , CURDRIVE() + ":\" + CURDIR() )

        ? VALTYPE( aFiles )
        IF VALTYPE( aFiles ) = "C"
            ? aFiles
        ELSE
            ? LEN( aFiles )
            WQOUT( aFiles )
        ENDIF

        RETURN NIL


#pragma BEGINDUMP

#include <windows.h>
#include <hbapi.h>
#include <clipapi.h>


static WORD CharsToWord( LPSTR pChars )
{
   WORD w = 0;

   if( pChars[ 0 ] != '0' )
      w = ( WORD ) ( ( pChars[ 0 ] - '0' ) * 10 );

   if( pChars[ 1 ] != '0' )
      w += ( WORD ) ( ( pChars[ 1 ] - '0' ) );

   return w;
}


static WORD CharsToLong( LPSTR pChars )
{
   LONG l = 0;

   if( pChars[ 0 ] != '0' )
   {
      l = ( ( pChars[ 0 ] - '0' ) * 100 );
      l *= 10;                          // Borland C++ bug
   }

   if( pChars[ 1 ] != '0' )
      l += ( ( pChars[ 1 ] - '0' ) * 100 );

   if( pChars[ 2 ] != '0' )
      l += ( ( pChars[ 2 ] - '0' ) *  10 );

   if( pChars[ 3 ] != '0' )
      l += ( pChars[ 3 ] - '0' );

   return ( WORD ) l;
}


HB_FUNC( SETFTIME )    //  ( nFileHandle, cTime, dDate ) --> lSuccess
{
   void * wHandle = ( void * ) hb_parnl( 1 );
   SYSTEMTIME st;
   FILETIME ft;
   LPSTR pTime  = hb_parc( 2 );
   LPSTR pDate  = IF( ISDATE( 3 ), hb_pards( 3 ), hb_parc( 3 ) );

   _bset( ( char * ) &st, 0, sizeof( st ) );

   if( pDate )
   {
      st.wDay   = CharsToWord( pDate + 6 );
      st.wMonth = CharsToWord( pDate + 4 );
      st.wYear  = CharsToLong( pDate );
   }
   if( pTime )
   {
      st.wHour   = CharsToWord( pTime );
      st.wMinute = CharsToWord( pTime + 3 );
      st.wSecond = CharsToWord( pTime + 6 );
      st.wMilliseconds = 0;
   }

   SystemTimeToFileTime( &st, &ft );
   hb_retl( SetFileTime( wHandle, &ft, &ft, &ft ) );
}

#pragma ENDDUMP


    #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   = ( WORD ) 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  = ( WORD ) 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 = ( WORD ) min( ( unsigned long ) 254, hb_parclen( 8 ) );
          _bcopy( pFile, hb_parc( 8 ), wLen );
       }
       else
       {
          wLen = ( WORD ) min( ( unsigned long ) 254, hb_parclen( 1 ) );
          _bcopy( pFile, hb_parc( 1 ), wLen );
       }
       * ( pFile + wLen ) = 0;

       pFilter = ( LPSTR ) hb_xgrab( 400 );
       wLen    = ( WORD ) 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






Re: cGetFile help

Posted: Mon May 11, 2015 3:19 pm
by nageswaragunupudi
FWH introduced function aGetFiles(...) in December 2009.

Extract from whatsnew.txt of December 2009
New: Function aGetFiles( cFileMask, cTitle, nDefaultMask, cInitDir ) --> aFiles, for selection of multiple files.
Please review FWH\source\winapi\getfiles.prg

Re: cGetFile help

Posted: Mon Jun 01, 2020 10:16 am
by pacotre
Hola:
No tengo este ejemplo con aGetfiles() en mi FWH.
Podriais subir un ejemplo práctico de la captura de varios ficheros y el posterior tratamiento de los mismos?

Muchas gracias

Re: cGetFile help

Posted: Mon Jun 01, 2020 11:37 am
by karinha

Re: cGetFile help

Posted: Tue Jun 02, 2020 3:04 am
by nageswaragunupudi
pacotre wrote:Hola:
No tengo este ejemplo con aGetfiles() en mi FWH.
Podriais subir un ejemplo práctico de la captura de varios ficheros y el posterior tratamiento de los mismos?

Muchas gracias
Please try this small sample

Code: Select all

#include "fivewin.ch"

function Main()

   local aFiles

   aFiles := aGetFiles( "Program files(*.prg)|*.prg|", ; // file mask
                               "Select Multiple Prg files", ; // title
                               , ;
                               "c:\fwh\samples" ) // initial directory


   XBROWSER aFiles

return nil
 
Image

Image

Re: cGetFile help

Posted: Tue Jun 02, 2020 9:19 am
by pacotre
Muchas gracias. Lo he probado y me va a servir de mucho.

Ahora necesito saber como abrir una determinada carpeta que solo me muestre el contenido y pueda eliminar, copiar y pegar ficheros, pero no moverme fuera de ella.
Me explico mejor:

Cada expediente tiene una carpeta donde se guardan diferentes documentos (doc,jpg,pdf, etc etc). Lo que necesito es abrir esa carpeta y ver esos documentos y al mismo tiempo llamar a aGetFile que me permita buscar e incorporar otros documentos a esa carpeta, pero no quiero que el usuario pueda moverse de la carpeta del expediente, y eso no lo consigo con cGetFile o aGetfile.

Estoy dándole vueltas y no sé como hacerlo. Alguna ayuda?

Re: cGetFile help

Posted: Wed Jun 03, 2020 7:26 am
by pacotre
Lo pregunto de otra forma:

Puedo "encapsular" cGgetfile en un cuadro de dialogo, en cuyo dialogo pueda tener un segundo cgetfile?. En el primero, a la izquierda estarían mis documentos y en el otro, a la derecha donde buscar e incorporar al primero.

Espero vuestra ayuda.
Gracias

Re: cGetFile help

Posted: Wed Jun 03, 2020 1:30 pm
by pacotre
Bueno, pues visto que no hay respuesta, he seguido trabajando y lo estoy resolviendo de la siguiente forma:

Meto todos los ficheros en un Browse y genero un menupopup con todas las opciones posibles sobre cualquiera de los registros (abrir con Shellexecute, borrar, copiar mover o abrir un cgetFile para capturar e incorporar nuevos fichero), y hago otra pregunta.

Hay posibilidad de meter el cGetFile en un cuadro de Dialogo, donde mismo tengo el pequeño xBrowse?

Gracias