No vídeo de hoje, vamos demonstrar em como salvar um png com o código QRCode gerado pela classe FWQRCode.
A dúvida de hoje, nos perguntaram, se seria possível salvar o código exibido através da classe FWQRCode.
Pensando nisso, montamos esse exemplo, onde vamos demonstrar em como acessar os atributos cDirName e cPngFile, e salvar utilizando a cópia da imagem com __CopyFile.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas #Include 'TOTVS.ch' /*/{Protheus.doc} User Function zVid0138 Função que gera um QRCode em tela @type Function @author Atilio @since 25/03/2024 @see https://tdn.totvs.com/display/public/framework/FwQrCode @obs **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao **** /*/ User Function zVid0138() Local aArea := FWGetArea() Local nCorFundo := RGB(238, 238, 238) Local nJanAltura := 311 Local nJanLargur := 358 Local cJanTitulo := 'Exemplo FWQrCode' Local lDimPixels := .T. Local lCentraliz := .T. Local nObjLinha := 0 Local nObjColun := 0 Local nObjLargu := 0 Local nObjAltur := 0 Private cFontNome := 'Tahoma' Private oFontPadrao := TFont():New(cFontNome, , -12) Private oDialogPvt Private bBlocoIni := {|| /*fSuaFuncao()*/ } //Aqui voce pode acionar funcoes customizadas que irao ser acionadas ao abrir a dialog //objeto1 Private oSayInsira Private cSayInsira := 'Insira o Texto:' //objeto2 Private oGetTexto Private cGetTexto := "https://terminaldeinformacao.com" + Space(200) //objeto 3 Private oQrCode //objeto4 Private oBtnAtu Private cBtnAtu := 'Atualizar' Private bBtnAtu := {|| fAtualiza()} //objeto5 Private oBtnSal Private cBtnSal := 'Salvar' Private bBtnSal := {|| fSalva()} //Cria a dialog oDialogPvt := TDialog():New(0, 0, nJanAltura, nJanLargur, cJanTitulo, , , , , , nCorFundo, , , lDimPixels) //objeto1 - usando a classe TSay nObjLinha := 4 nObjColun := 4 nObjLargu := 70 nObjAltur := 6 oSayInsira := TSay():New(nObjLinha, nObjColun, {|| cSayInsira}, oDialogPvt, /*cPicture*/, oFontPadrao, , , , lDimPixels, /*nClrText*/, /*nClrBack*/, nObjLargu, nObjAltur, , , , , , /*lHTML*/) //objeto2 - usando a classe TGet nObjLinha := 3 nObjColun := 64 nObjLargu := 110 nObjAltur := 10 oGetTexto := TGet():New(nObjLinha, nObjColun, {|u| Iif(PCount() > 0 , cGetTexto := u, cGetTexto)}, oDialogPvt, nObjLargu, nObjAltur, /*cPict*/, /*bValid*/, /*nClrFore*/, /*nClrBack*/, oFontPadrao, , , lDimPixels) //objeto3 - usando a classe FWQRCode nObjLinha := 19 nObjColun := 44 nObjLargu := 180 nObjAltur := 180 oQrCode := FwQrCode():New({nObjLinha, nObjColun, nObjLargu, nObjAltur}, oDialogPvt, cGetTexto) //objeto4 - usando a classe TButton nObjLinha := 116 nObjColun := 2 nObjLargu := (nJanLargur/2) - 2 nObjAltur := 15 oBtnAtu := TButton():New(nObjLinha, nObjColun, cBtnAtu, oDialogPvt, bBtnAtu, nObjLargu, nObjAltur, , oFontPadrao, , lDimPixels) //objeto5 - usando a classe TButton nObjLinha := 135 nObjColun := 2 nObjLargu := (nJanLargur/2) - 2 nObjAltur := 15 oBtnSal := TButton():New(nObjLinha, nObjColun, cBtnSal, oDialogPvt, bBtnSal, nObjLargu, nObjAltur, , oFontPadrao, , lDimPixels) //Ativa e exibe a janela oDialogPvt:Activate(, , , lCentraliz, , , bBlocoIni) FWRestArea(aArea) Return Static Function fAtualiza() //Somente se houver texto, irá atualizar na tela If ! Empty(cGetTexto) oQrCode:SetCodeBar(cGetTexto) oQrCode:Refresh() EndIf Return Static Function fSalva() Local cArquivoQR := oQrCode:cDirName + oQrCode:cPngFile + ".png" Local cTipArq := 'Arquivos imagem (*.png)' Local cTitulo := 'Gravação de arquivo' Local cDirIni := GetTempPath() Local lSalvar := .T. Local cArqSel := '' //Aciona a tela para gravar o arquivo cArqSel := tFileDialog(; cTipArq,; // Filtragem de tipos de arquivos que serão selecionados cTitulo,; // Título da Janela para seleção dos arquivos ,; // Compatibilidade cDirIni,; // Diretório inicial da busca de arquivos lSalvar,; // Se for .T., será uma Save Dialog, senão será Open Dialog ; // Se não passar parâmetro, irá pegar apenas 1 arquivo; Se for informado GETF_MULTISELECT será possível pegar mais de 1 arquivo; Se for informado GETF_RETDIRECTORY será possível selecionar o diretório ) //Efetua a gravação do arquivo If ! Empty(cArqSel) __CopyFile(cArquivoQR, cArqSel) EndIf Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.