Nesse vídeo demonstraremos a utilização da classe TGroup, que serve para criar agrupamentos em uma tela.
Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function zExe490
Cria agrupadores em uma Dialog
@type Function
@author Atilio
@since 04/04/2023
@see https://tdn.totvs.com/display/tec/TGroup
@obs
**** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/
User Function zExe490()
Local aArea := FWGetArea()
Local nCorFundo := RGB(238, 238, 238)
Local nJanAltura := 301
Local nJanLargur := 338
Local cJanTitulo := 'Exemplo TGroup'
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 oFontNegrit := TFont():New(cFontNome, , -12, , .T.)
Private oDialogPvt
Private bBlocoIni := {|| /*fSuaFuncao()*/ } //Aqui voce pode acionar funcoes customizadas que irao ser acionadas ao abrir a dialog
//objeto0
Private oSayObj0
Private cSayObj0 := 'Normal'
//objeto1
Private oGetObj1
Private xGetObj1 := sToD("") //Se o get for data para inicilizar use dToS(''), se for numerico inicie com 0
//objeto2
Private oSayObj2
Private cSayObj2 := 'Com ReadOnly'
//objeto3
Private oGetObj3
Private xGetObj3 := Space(10) //Se o get for data para inicilizar use dToS(''), se for numerico inicie com 0
//objeto4
Private oSayObj4
Private cSayObj4 := 'Inativo'
//objeto5
Private oGetObj5
Private xGetObj5 := Space(10) //Se o get for data para inicilizar use dToS(''), se for numerico inicie com 0
//objeto6
Private oSayObj6
Private cSayObj6 := 'PlaceHolder'
//objeto7
Private oGetObj7
Private xGetObj7 := Space(10) //Se o get for data para inicilizar use dToS(''), se for numerico inicie com 0
//objeto8
Private oSayObj8
Private cSayObj8 := 'Com F3'
//objeto9
Private oGetObj9
Private xGetObj9 := Space(10) //Se o get for data para inicilizar use dToS(''), se for numerico inicie com 0
//objeto10
Private oSayObj10
Private cSayObj10 := 'Com Picture'
//objeto11
Private oGetObj11
Private xGetObj11 := 0 //Se o get for data para inicilizar use dToS(''), se for numerico inicie com 0
//objeto12
Private oSayObj12
Private cSayObj12 := 'Com Valid'
//objeto13
Private oGetObj13
Private xGetObj13 := 0 //Se o get for data para inicilizar use dToS(''), se for numerico inicie com 0
//objeto14
Private oBtnObj14
Private cBtnObj14 := 'Button'
Private bBtnObj14 := {|| MsgInfo('Clicou no OK', 'Atenção')}
//Cria a dialog
oDialogPvt := TDialog():New(0, 0, nJanAltura, nJanLargur, cJanTitulo, , , , , , nCorFundo, , , lDimPixels)
//Criando um agrupamento ao redor dos says e gets
nObjLinha := 002
nObjColun := 002
nObjLargu := (nJanLargur / 2) - 002
nObjAltur := (nJanAltura / 2) - 002 - 025
oGrpCampo := TGroup():New(nObjLinha, nObjColun, nObjAltur, nObjLargu, 'Labels e Campos:', oDialogPvt, , , lDimPixels)
oGrpCampo:oFont := oFontNegrit
//objeto0 - usando a classe TSay
nObjLinha := 4 + 10
nObjColun := 4
nObjLargu := 40
nObjAltur := 6
oSayObj0 := TSay():New(nObjLinha, nObjColun, {|| cSayObj0}, oDialogPvt, /*cPicture*/, oFontPadrao, , , , lDimPixels, /*nClrText*/, /*nClrBack*/, nObjLargu, nObjAltur, , , , , , /*lHTML*/)
//objeto1 - usando a classe TGet
nObjLinha := 3 + 10
nObjColun := 49
nObjLargu := 100
nObjAltur := 10
oGetObj1 := TGet():New(nObjLinha, nObjColun, {|u| Iif(PCount() > 0 , xGetObj1 := u, xGetObj1)}, oDialogPvt, nObjLargu, nObjAltur, /*cPict*/, /*bValid*/, /*nClrFore*/, /*nClrBack*/, oFontPadrao, , , lDimPixels)
//oGetObj1:cPlaceHold := 'Digite aqui um texto...' //Texto que sera exibido no campo antes de ter conteudo
//oGetObj1:cF3 := 'Codigo da consulta padrao' //Codigo da consulta padrao / F3 que sera habilitada
//oGetObj1:bValid := {|| fFuncaoVld()} //Funcao para validar o que foi digitado
//oGetObj1:lReadOnly := .T. //Para permitir o usuario clicar mas nao editar o campo
//oGetObj1:lActive := .F. //Para deixar o campo inativo e o usuario nao conseguir nem clicar
//oGetObj1:Picture := '@!' //Mascara / Picture do campo
//objeto2 - usando a classe TSay
nObjLinha := 19 + 10
nObjColun := 4
nObjLargu := 45
nObjAltur := 6
oSayObj2 := TSay():New(nObjLinha, nObjColun, {|| cSayObj2}, oDialogPvt, /*cPicture*/, oFontPadrao, , , , lDimPixels, /*nClrText*/, /*nClrBack*/, nObjLargu, nObjAltur, , , , , , /*lHTML*/)
//objeto3 - usando a classe TGet
nObjLinha := 18 + 10
nObjColun := 49
nObjLargu := 100
nObjAltur := 10
oGetObj3 := TGet():New(nObjLinha, nObjColun, {|u| Iif(PCount() > 0 , xGetObj3 := u, xGetObj3)}, oDialogPvt, nObjLargu, nObjAltur, /*cPict*/, /*bValid*/, /*nClrFore*/, /*nClrBack*/, oFontPadrao, , , lDimPixels)
//oGetObj3:cPlaceHold := 'Digite aqui um texto...' //Texto que sera exibido no campo antes de ter conteudo
//oGetObj3:cF3 := 'Codigo da consulta padrao' //Codigo da consulta padrao / F3 que sera habilitada
//oGetObj3:bValid := {|| fFuncaoVld()} //Funcao para validar o que foi digitado
oGetObj3:lReadOnly := .T. //Para permitir o usuario clicar mas nao editar o campo
//oGetObj3:lActive := .F. //Para deixar o campo inativo e o usuario nao conseguir nem clicar
//oGetObj3:Picture := '@!' //Mascara / Picture do campo
//objeto4 - usando a classe TSay
nObjLinha := 34 + 10
nObjColun := 4
nObjLargu := 45
nObjAltur := 6
oSayObj4 := TSay():New(nObjLinha, nObjColun, {|| cSayObj4}, oDialogPvt, /*cPicture*/, oFontPadrao, , , , lDimPixels, /*nClrText*/, /*nClrBack*/, nObjLargu, nObjAltur, , , , , , /*lHTML*/)
//objeto5 - usando a classe TGet
nObjLinha := 33 + 10
nObjColun := 49
nObjLargu := 100
nObjAltur := 10
oGetObj5 := TGet():New(nObjLinha, nObjColun, {|u| Iif(PCount() > 0 , xGetObj5 := u, xGetObj5)}, oDialogPvt, nObjLargu, nObjAltur, /*cPict*/, /*bValid*/, /*nClrFore*/, /*nClrBack*/, oFontPadrao, , , lDimPixels)
//oGetObj5:cPlaceHold := 'Digite aqui um texto...' //Texto que sera exibido no campo antes de ter conteudo
//oGetObj5:cF3 := 'Codigo da consulta padrao' //Codigo da consulta padrao / F3 que sera habilitada
//oGetObj5:bValid := {|| fFuncaoVld()} //Funcao para validar o que foi digitado
//oGetObj5:lReadOnly := .T. //Para permitir o usuario clicar mas nao editar o campo
oGetObj5:lActive := .F. //Para deixar o campo inativo e o usuario nao conseguir nem clicar
//oGetObj5:Picture := '@!' //Mascara / Picture do campo
//objeto6 - usando a classe TSay
nObjLinha := 49 + 10
nObjColun := 4
nObjLargu := 45
nObjAltur := 6
oSayObj6 := TSay():New(nObjLinha, nObjColun, {|| cSayObj6}, oDialogPvt, /*cPicture*/, oFontPadrao, , , , lDimPixels, /*nClrText*/, /*nClrBack*/, nObjLargu, nObjAltur, , , , , , /*lHTML*/)
//objeto7 - usando a classe TGet
nObjLinha := 48 + 10
nObjColun := 49
nObjLargu := 100
nObjAltur := 10
oGetObj7 := TGet():New(nObjLinha, nObjColun, {|u| Iif(PCount() > 0 , xGetObj7 := u, xGetObj7)}, oDialogPvt, nObjLargu, nObjAltur, /*cPict*/, /*bValid*/, /*nClrFore*/, /*nClrBack*/, oFontPadrao, , , lDimPixels)
oGetObj7:cPlaceHold := 'Digite aqui um texto...' //Texto que sera exibido no campo antes de ter conteudo
//oGetObj7:cF3 := 'Codigo da consulta padrao' //Codigo da consulta padrao / F3 que sera habilitada
//oGetObj7:bValid := {|| fFuncaoVld()} //Funcao para validar o que foi digitado
//oGetObj7:lReadOnly := .T. //Para permitir o usuario clicar mas nao editar o campo
//oGetObj7:lActive := .F. //Para deixar o campo inativo e o usuario nao conseguir nem clicar
//oGetObj7:Picture := '@!' //Mascara / Picture do campo
//objeto8 - usando a classe TSay
nObjLinha := 64 + 10
nObjColun := 4
nObjLargu := 45
nObjAltur := 6
oSayObj8 := TSay():New(nObjLinha, nObjColun, {|| cSayObj8}, oDialogPvt, /*cPicture*/, oFontPadrao, , , , lDimPixels, /*nClrText*/, /*nClrBack*/, nObjLargu, nObjAltur, , , , , , /*lHTML*/)
//objeto9 - usando a classe TGet
nObjLinha := 63 + 10
nObjColun := 49
nObjLargu := 100
nObjAltur := 10
oGetObj9 := TGet():New(nObjLinha, nObjColun, {|u| Iif(PCount() > 0 , xGetObj9 := u, xGetObj9)}, oDialogPvt, nObjLargu, nObjAltur, /*cPict*/, /*bValid*/, /*nClrFore*/, /*nClrBack*/, oFontPadrao, , , lDimPixels, /*uParam15*/, /*uParam16*/, /*bWhen*/, /*uParam18*/, /*uParam19*/, /*bChange*/, /*lReadOnly*/, /*lPassword*/, /*uParam23*/, /*cReadVar*/, /*uParam25*/, /*uParam26*/, /*uParam27*/, .T.)
//oGetObj9:cPlaceHold := 'Digite aqui um texto...' //Texto que sera exibido no campo antes de ter conteudo
oGetObj9:cF3 := 'SB1' //Codigo da consulta padrao / F3 que sera habilitada
//oGetObj9:bValid := {|| fFuncaoVld()} //Funcao para validar o que foi digitado
//oGetObj9:lReadOnly := .T. //Para permitir o usuario clicar mas nao editar o campo
//oGetObj9:lActive := .F. //Para deixar o campo inativo e o usuario nao conseguir nem clicar
//oGetObj9:Picture := '@!' //Mascara / Picture do campo
//objeto10 - usando a classe TSay
nObjLinha := 79 + 10
nObjColun := 4
nObjLargu := 45
nObjAltur := 6
oSayObj10 := TSay():New(nObjLinha, nObjColun, {|| cSayObj10}, oDialogPvt, /*cPicture*/, oFontPadrao, , , , lDimPixels, /*nClrText*/, /*nClrBack*/, nObjLargu, nObjAltur, , , , , , /*lHTML*/)
//objeto11 - usando a classe TGet
nObjLinha := 78 + 10
nObjColun := 49
nObjLargu := 100
nObjAltur := 10
oGetObj11 := TGet():New(nObjLinha, nObjColun, {|u| Iif(PCount() > 0 , xGetObj11 := u, xGetObj11)}, oDialogPvt, nObjLargu, nObjAltur, /*cPict*/, /*bValid*/, /*nClrFore*/, /*nClrBack*/, oFontPadrao, , , lDimPixels)
//oGetObj11:cPlaceHold := 'Digite aqui um texto...' //Texto que sera exibido no campo antes de ter conteudo
//oGetObj11:cF3 := 'Codigo da consulta padrao' //Codigo da consulta padrao / F3 que sera habilitada
//oGetObj11:bValid := {|| fFuncaoVld()} //Funcao para validar o que foi digitado
//oGetObj11:lReadOnly := .T. //Para permitir o usuario clicar mas nao editar o campo
//oGetObj11:lActive := .F. //Para deixar o campo inativo e o usuario nao conseguir nem clicar
oGetObj11:Picture := '@E 999.99' //Mascara / Picture do campo
//objeto12 - usando a classe TSay
nObjLinha := 94 + 10
nObjColun := 4
nObjLargu := 45
nObjAltur := 6
oSayObj12 := TSay():New(nObjLinha, nObjColun, {|| cSayObj12}, oDialogPvt, /*cPicture*/, oFontPadrao, , , , lDimPixels, /*nClrText*/, /*nClrBack*/, nObjLargu, nObjAltur, , , , , , /*lHTML*/)
//objeto13 - usando a classe TGet
nObjLinha := 93 + 10
nObjColun := 49
nObjLargu := 100
nObjAltur := 10
oGetObj13 := TGet():New(nObjLinha, nObjColun, {|u| Iif(PCount() > 0 , xGetObj13 := u, xGetObj13)}, oDialogPvt, nObjLargu, nObjAltur, /*cPict*/, /*bValid*/, /*nClrFore*/, /*nClrBack*/, oFontPadrao, , , lDimPixels)
//oGetObj13:cPlaceHold := 'Digite aqui um texto...' //Texto que sera exibido no campo antes de ter conteudo
//oGetObj13:cF3 := 'Codigo da consulta padrao' //Codigo da consulta padrao / F3 que sera habilitada
oGetObj13:bValid := {|| fValidVlr()} //Funcao para validar o que foi digitado
//oGetObj13:lReadOnly := .T. //Para permitir o usuario clicar mas nao editar o campo
//oGetObj13:lActive := .F. //Para deixar o campo inativo e o usuario nao conseguir nem clicar
oGetObj13:Picture := '@E 999' //Mascara / Picture do campo
//Criando um agrupamento ao redor dos botões e sem texto
nObjLinha := (nJanAltura/2) - 23
nObjColun := 002
nObjLargu := (nJanLargur / 2) - 002
nObjAltur := (nJanAltura / 2) - 002
oGrpBotao := TGroup():New(nObjLinha, nObjColun, nObjAltur, nObjLargu, '', oDialogPvt, , , lDimPixels)
//objeto14 - usando a classe TButton
nObjLinha := (nJanAltura/2) - 20
nObjColun := 12
nObjLargu := (nJanLargur/2) - 24
nObjAltur := 15
oBtnObj14 := TButton():New(nObjLinha, nObjColun, cBtnObj14, oDialogPvt, bBtnObj14, nObjLargu, nObjAltur, , oFontPadrao, , lDimPixels)
//Ativa e exibe a janela
oDialogPvt:Activate(, , , lCentraliz, , , bBlocoIni)
FWRestArea(aArea)
Return
Static Function fValidVlr()
Local aArea := FWGetArea()
Local lRet := .T.
If xGetObj13 > 0
lRet := .T.
Else
lRet := .F.
Alert("Falha na validação")
EndIf
FWRestArea(aArea)
Return lRet
Bom pessoal, por hoje é só.
Abraços e até a próxima.