Hoje trago para vocês como criar um “Slideshow de imagens” em AdvPL.
Me perguntaram uma vez se era possível fazer com o AdvPL puro (sem utilizar javascript ou outras integrações), e sim é possível.
Para fazer isso, temos que ter uma pasta com a lista de imagens, e a partir disso, ao iniciar a nossa função, percorremos todos os arquivos do tipo imagem da pasta e armazenamos em um Array (no caso você pode também armazenar em uma tabela temporária).
A partir disso, teremos uma dialog com a foto, e dois botões de controle, ao clicar para direita, incrementamos uma posição do array, e ao clicar para esquerda, decrementamos uma posição.
Caso passe dos limites do array, nós zeramos as posições. Abaixo um print da tela desenvolvida:
E abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "Totvs.ch"
/*/{Protheus.doc} User Function zSlider
Exemplo de Slideshow em AdvPL
@type Function
@author Atilio
@since 21/06/2020
@version version
@param cDirFile, Character, Diretorio com arquivos que serao carregados
@example u_zSlider("C:\Users\daniel.atilio\Desktop\imagens")
/*/
User Function zSlider(cDirFiles)
Local aArea := GetArea()
//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 := ""
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
DEFINE MSDIALOG oDlgCom TITLE "Slideshow" FROM 000, 000 TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
//Labels gerais
@ 004, 003 SAY "TI" SIZE 200, 030 FONT oFontAno OF oDlgCom COLORS RGB(149,179,215) PIXEL
@ 004, 040 SAY "Exemplo de Slideshow" SIZE 200, 030 FONT oFontSub OF oDlgCom COLORS RGB(031,073,125) PIXEL
@ 014, 040 SAY cValToChar(Len(aImgs)) + " imagens encontradas" SIZE 200, 030 FONT oFontSubN OF oDlgCom COLORS RGB(031,073,125) PIXEL
//Botão de Sair
@ 006, (nJanLarg/2-001)-(0052*01) BUTTON oBtnSai PROMPT "Sair" SIZE 050, 018 OF oDlgCom ACTION (oDlgCom:End()) FONT oFontBtn PIXEL
//Botões de navegação
@ (nJanAltu/4), 003 BUTTON oBtnEsq PROMPT "<-" SIZE 030, 018 OF oDlgCom ACTION (fChangeImg(-1)) FONT oFontBtn PIXEL
@ (nJanAltu/4), (nJanLarg/2-003)-(0030) BUTTON oBtnDir PROMPT "->" SIZE 030, 018 OF oDlgCom ACTION (fChangeImg(1)) FONT oFontBtn PIXEL
//Get com a informação da imagem atual
@ (nJanAltu/2) - 16, 003 MSGET oGetImg VAR cGetImg SIZE (nJanLarg/2)-3, 013 OF oDlgForm COLORS 0, 16777215 READONLY PIXEL
//Imagem atual
@ 027, 024 BITMAP oBmpFoto SIZE (nJanLarg/2)-42, (nJanAltu/2)-48 OF oDlgForm ADJUST PIXEL
oBmpFoto:Load(, cGetImg)
oBmpFoto:Refresh()
ACTIVATE MsDialog oDlgCom CENTERED
Else
MsgStop("Não foi encontrado imagens nesse diretório!", "Atenção")
EndIf
Else
MsgStop("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.
