Função para selecionar arquivos via Windows Explorer utilizando AdvPL

Função para selecionar arquivos via Windows Explorer utilizando AdvPL

Olá pessoal…

Hoje vou mostrar uma função que desenvolvi para abrir a tela de seleção de arquivos do Windows via AdvPL.

Todos sabemos como a tela padrão do AdvPL para seleção de arquivos (a função cGetFile) não é muito usual, e às vezes acaba confundindo os usuários.

Pensando nisso, criei uma função que você simplesmente passa a máscara desejada para seleção de arquivos, e ele cria a tela para você selecionar.

Testei no Windows 7 e no Windows 10. Abaixo um print da tela.

Janela para escolher o arquivo
Janela para escolher o arquivo

Abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zChooseFile
Função que abre a tela padrão do Windows Explorer para escolher um arquivo
@author Atilio
@since 03/08/2017
@version undefined
@param cMascara, characters, Máscara para escolha de arquivos (Descrição *.extensão | *.extensão)
@type function
@example Exemplos abaixo:
	//Escolher qualquer arquivo ( *.* ):
	u_zChooseFile()
	
	//Escolher somente arquivos texto ( *.txt )
	u_zChooseFile("Arquivos Texto (*.txt)|*.txt")
	
	//Escolher arquivos texto ou todos (*.txt ou *.*)
	u_zChooseFile("Arquivos Texto (*.txt)|*.txt|Todos Arquivos (*.*)|*.*")
	
	//Escolher imagens png ou jpg (*.png ou *.jpg)
	u_zChooseFile("Arquivos Texto (*.png)|*.png|Arquivos Texto (*.jpg)|*.jpg")
/*/

User Function zChooseFile(cMascara)
	Local cResultado := ""
	Local cComando   := ""
	Local cDir       := GetTempPath()
	Local cNomBat    := "zChooseFile.bat"
	Local cArquivo   := "resultado.txt"
	Local cMac       := ""
	Default cMascara := "Todos Arquivos (*.*)|*.*"
	
	//Se o resultado já existir, exclui
	If File(cDir + cArquivo)
		FErase(cDir + cArquivo)
	EndIf
	
	//Monta o comando para abrir a tela de seleção do windows
	cComando += '@echo off' + CRLF
	cComando += 'setlocal' + CRLF
	cComando += 'set ps_cmd=powershell "Add-Type -AssemblyName System.windows.forms|Out-Null;$f=New-Object System.Windows.Forms.OpenFileDialog;$f.Filter=' + "'"+cMascara+"'" + ';$f.showHelp=$true;$f.ShowDialog()|Out-Null;$f.FileName"' + CRLF
	cComando += '' + CRLF
	cComando += 'for /f "delims=" %%I in (' + "'%ps_cmd%'" + ') do set "filename=%%I"' + CRLF
	cComando += '' + CRLF
	cComando += 'if defined filename (' + CRLF
	cComando += '    echo %filename% > '+cArquivo + CRLF
	cComando += ')' + CRLF
	
	//Gravando em um .bat o comando
	MemoWrite(cDir + cNomBat, cComando)
	
	//Executando o comando através do .bat
	WaitRun(cDir+cNomBat, 2)
	
	//Se existe o arquivo
	If File(cDir + cArquivo)
	
		//Pegando o resultado que o usuário escolheu
		cResultado := MemoRead(cDir + cArquivo)
	EndIf
Return cResultado

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/AdvPL.
Caso queira uma customização específica para sua empresa, saiba mais em nossa Loja.

Bom pessoal, por hoje é só.
Abraços e até a próxima.

About Dan_Atilio

Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

8 comentários em “Função para selecionar arquivos via Windows Explorer utilizando AdvPL

  1. Sensacional Atílio, utilizando a funcionalidade nativa do Windows. Utilizo PowerShell para scripts de backup, mas nem pensava em mesclar com ADVPL. Parabéns pelo post cara, de verdade! (Só com muita pesquisa mesmo)

      1. Nunca tinha mexido com batch, nem powershell kkkkk então não sei se está legal, mas funciona kkkk
        O comando ficou assim:
        cComando += ‘@echo off’ + CRLF
        cComando += ‘setlocal’ + CRLF
        cComando += ‘set ps_cmd=powershell “Add-Type -AssemblyName System.windows.forms|Out-Null;$f=New-Object System.Windows.Forms.OpenFileDialog;$f.Multiselect=$true;$f.Filter=’ + “‘”+cMascara+”‘” + ‘;$f.showHelp=$true;$f.ShowDialog()|Out-Null;$f.FileNames”‘ + CRLF
        cComando += ” + CRLF
        cComando += ‘ {} > ‘+cArquivo + CRLF
        cComando += ‘for /f “delims=” %%I in (‘ + “‘%ps_cmd%'” + ‘) do echo “%%I” >> ‘+cArquivo + CRLF
        cComando += ” + CRLF

        ———————————————————————————————
        Dai só removi as aspas e a quebra de linha

        cResultado := STRTRAN(cResultado,'”‘,”)
        cResultado := STRTRAN(cResultado,’ ‘+chr(13)+chr(10),’|’)

        ——————————————————————————————–
        Depois é só usar a função separa para transformar a string em array
        aAnexos := Separa(cResultado,’|’,.f.)

Deixe uma resposta

%d blogueiros gostam disto: