Exibindo imagens através da TBitmap – Maratona AdvPL e TL++ 470

Nesse vídeo demonstraremos a utilização da classe TBitmap, que serve para exibir imagens dentro de uma dialog.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zExe470
Classe para exibir imagens em Dialogs no Protheus
@type Function
@author Atilio
@since 02/04/2023
@see https://tdn.totvs.com/display/tec/TBitmap
@obs 

    Esse artigo foi baseado na função zSlider disponível em - https://terminaldeinformacao.com/2020/08/28/como-fazer-um-slideshow-em-advpl/

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe470()
    Local aArea := GetArea()
    Local lDimPixels := .T.
    Local lCentraliz := .T.
    Local bBlocoIni  := {|| }
    //Fontes
    Local cFontUti    := "Tahoma"
    Local oFontAno    := TFont():New(cFontUti,,-38)
    Local oFontSub    := TFont():New(cFontUti,,-20)
    Local oFontSubN   := TFont():New(cFontUti,,-20,,.T.)
    Local oFontBtn    := TFont():New(cFontUti,,-14)
    Default cDirFiles := "C:\Users\danat\OneDrive\Trabalho\Atilio Sistemas\Workspace_VS\Local\Cursos\Curso_OO\imgs\"
    Private cDirect   := Alltrim(cDirFiles)
    Private aImgs     := {}
    Private nImgAtu   := 0
    //Janela e componentes
    Private oDlgCom
    Private oGetImg
    Private cGetImg := ""
    Private oBmpFoto
    //Tamanho da janela
    Private nJanLarg := 800
    Private nJanAltu := 600

    //Somente se tiver imagens a exibir
    If ! Empty(cDirect) .And. ExistDir(cDirect)
        //Tratativa para adicionar uma barra no final
        If SubStr(cDirect, Len(cDirect), 1) != '\'
            cDirect += "\"
        EndIf
 
        //Carregando as imagens
        FWMsgRun(, {|oSay| fBuscaImg(oSay) }, "Processando", "Buscando imagens da pasta")
 
        //Se tiver imagens
        If Len(aImgs) > 0
            nImgAtu := 1
            cGetImg := cDirect + aImgs[nImgAtu]
 
            //Criando a janela
            oDlgCom := TDialog():New(0, 0, nJanAltu, nJanLarg, "Slideshow", , , , , , /*nCorFundo*/, , , lDimPixels)
                //Labels gerais
                oSayModulo := TSay():New(004, 003, {|| "TI"},                                            oDlgCom, "", oFontAno,  , , , .T., RGB(149, 179, 215), , 200, 30, , , , , , .F., , )
                oSayTitulo := TSay():New(004, 045, {|| "Exemplo de Slideshow"},                          oDlgCom, "", oFontSub,  , , , .T., RGB(031, 073, 125), , 200, 30, , , , , , .F., , )
                oSaySubTit := TSay():New(014, 045, {|| cValToChar(Len(aImgs)) + " imagens encontradas"}, oDlgCom, "", oFontSubN, , , , .T., RGB(031, 073, 125), , 300, 30, , , , , , .F., , )
 
                //Botão de Sair
                oBtnSair := TButton():New(006, (nJanLarg/2-001)-(0052*1), "Sair", oDlgCom, {|| oDlgCom:End()}, 050, 018, , oFontBtn, , lDimPixels)
 
                //Botões de navegação
                oBtnEsq := TButton():New((nJanAltu/4), 003,                     "<-", oDlgCom, {|| fChangeImg(-1)}, 030, 018, , oFontBtn, , lDimPixels)
                oBtnDir := TButton():New((nJanAltu/4), (nJanLarg/2-003)-(0030), "->", oDlgCom, {|| fChangeImg(1)},  030, 018, , oFontBtn, , lDimPixels)
 
                //Get com a informação da imagem atual
                oGetImg  := TGet():New((nJanAltu/2) - 16, 003, {|u| Iif(PCount() > 0 , cGetImg := u, cGetImg)}, oDlgCom, (nJanLarg/2)-3, 013, /*cPict*/, /*bValid*/, /*nClrFore*/, /*nClrBack*/, oFontBtn, , , lDimPixels)
                oGetImg:lReadOnly := .T.
 
                //Imagem atual
                oBmpFoto := TBitmap():New(027, 024, (nJanLarg/2)-42, (nJanAltu/2)-48, /*cResName*/, /*cBmpFile*/, /*lNoBorder*/, oDlgCom, /*bLClicked*/, /*bRClicked*/, /*lScroll*/, /*lStretch*/, /*oCursor*/, /*uParam14*/, /*uParam15*/, /*bWhen*/, lDimPixels, /*bValid*/)
                oBmpFoto:lStretch := .T.
                oBmpFoto:Load(, cGetImg)
                oBmpFoto:Refresh()

            //Ativa e exibe a janela
            oDlgCom:Activate(, , , lCentraliz, , , bBlocoIni)
        Else
            FWAlertError("Não foi encontrado imagens nesse diretório!", "Atenção")
        EndIf
    Else
        FWAlertError("Diretório não existe ou inválido!", "Atenção")
    EndIf
 
    RestArea(aArea)
Return
 
Static Function fBuscaImg(oSay)
    Local aExtensoes := {"jpg", "png", "bmp"}
    Local nExtAtu
    Local aFiles
    Local cCamFull
    Local nFileAtu
 
    //Percorrendo as extensoes
    For nExtAtu := 1 To Len(aExtensoes)
        oSay:SetText("Analisando extensão - " + aExtensoes[nExtAtu])
 
        //Definindo o diretorio full e colocando tudo no array de arquivos
        cCamFull := cDirect + "*." + aExtensoes[nExtAtu]
        aFiles := {}
        aDir(cCamFull, aFiles)
         
        //Percorrendo todos os arquivos e adicionando no nosso array de imagens
        For nFileAtu := 1 To Len(aFiles)
            oSay:SetText("Analisando extensão - " + aExtensoes[nExtAtu] + ", arquivo " + cValToChar(nFileAtu) + " de " + cValToChar(Len(aFiles)))
            aAdd(aImgs, aFiles[nFileAtu])
        Next
    Next
Return
 
Static Function fChangeImg(nNewPos)
    //Decrementa uma imagem
    If nNewPos == -1
        nImgAtu--
 
    //Incrementa uma imagem
    ElseIf nNewPos == 1
        nImgAtu++
    EndIf
 
    //Se a imagem atual passou da ultima, vai para a primeira
    If nImgAtu > Len(aImgs)
        nImgAtu := 1
 
    //Se for menor ou igual a zero, vai para a última
    ElseIf nImgAtu <= 0
        nImgAtu := Len(aImgs)
    EndIf
 
    //Atualiza o get
    cGetImg := cDirect + aImgs[nImgAtu]
    oGetImg:Refresh()
 
    //Atualiza a imagem
    oBmpFoto:Load(, cGetImg)
    oBmpFoto:Refresh()
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação