cGetFile help
Posted: Mon May 11, 2015 2:15 pm
Hi,
How I can use cGetFile to select more than one file?
Thanks.
How I can use cGetFile to select more than one file?
Thanks.
www.FiveTechSoft.com
https://forums.fivetechsoft.com/
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
New: Function aGetFiles( cFileMask, cTitle, nDefaultMask, cInitDir ) --> aFiles, for selection of multiple files.
Please review FWH\source\winapi\getfiles.prg
Please try this small samplepacotre 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
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