Você já precisou alinhar algum conteúdo em uma coluna usando a classe FWBrowse com FWBrwColumn? Saiba como fazer no artigo de hoje.
Na FWBrwColumn, nós temos um atributo chamado nAlign, que é bem interessante para modificarmos o alinhamento padrão de uma coluna.
Basicamente ele recebe 3 valores sendo:
- Valor 0 – Centralizado
- Valor 1 – Esquerda
- Valor 2 – Direita
Dito isso, como nós podemos fazer as tratativas no nosso fonte? Nesse caso, nossa lógica ficou assim:
- Na Criação das colunas (FWBrwColumn), criamos um array
- Nesse array, na posição 8 nós passamos qual é o alinhamento (0 ou 1 ou 2 conforme descrição acima)
- Ai no for que vai adicionando as colunas, nós setamos no nAlign
No nosso exemplo, nós vamos alinhar a esquerda as colunas Código e Descrição. Já com alinhamento a direita vão ser as colunas de Quantidade e Emissão. E por último, a coluna de Observação será Centralizada. Abaixo um print de exemplo:
E abaixo o código fonte do exemplo:
#Include "Totvs.ch"
/*/{Protheus.doc} User Function zBrwAlign
Função que demonstra como mudar o alinhamento de uma coluna
@type Function
@author Atilio
@since 31/10/2023
@version version
/*/
User Function zBrwAlign()
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)
//Janela e componentes
Private oDlgGrp
Private oPanGrid
Private oGetGrid
Private aColunas := {}
Private cAliasTab := "TMPSBM"
//Tamanho da janela
Private aTamanho := MsAdvSize()
Private nJanLarg := aTamanho[5]
Private nJanAltu := aTamanho[6]
//Cria a temporária
oTempTable := FWTemporaryTable():New(cAliasTab)
//Adiciona no array das colunas as que serão incluidas (Nome do Campo, Tipo do Campo, Tamanho, Decimais)
aFields := {}
aAdd(aFields, {"XXCODIGO", "C", 6, 0})
aAdd(aFields, {"XXDESCRI", "C", 30, 0})
aAdd(aFields, {"XXQUANTI", "N", 9, 2})
aAdd(aFields, {"XXEMISSA", "D", 8, 0})
aAdd(aFields, {"XXOBSERV", "C", 40, 0})
//Define as colunas usadas, adiciona indice e cria a temporaria no banco
oTempTable:SetFields( aFields )
oTempTable:AddIndex("1", {"XXCODIGO"} )
oTempTable:Create()
//Monta o cabecalho
fMontaHead()
//Montando os dados, eles devem ser montados antes de ser criado o FWBrowse
FWMsgRun(, {|oSay| fMontDados(oSay) }, "Processando", "Buscando grupos")
//Criando a janela
DEFINE MSDIALOG oDlgGrp TITLE "Dados" FROM 000, 000 TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
//Labels gerais
@ 004, 003 SAY "FAT" SIZE 200, 030 FONT oFontAno OF oDlgGrp COLORS RGB(149,179,215) PIXEL
@ 004, 050 SAY "Listagem Genérica de" SIZE 200, 030 FONT oFontSub OF oDlgGrp COLORS RGB(031,073,125) PIXEL
@ 014, 050 SAY "Dados Temporários" SIZE 200, 030 FONT oFontSubN OF oDlgGrp COLORS RGB(031,073,125) PIXEL
//Botões
@ 006, (nJanLarg/2-001)-(0052*01) BUTTON oBtnFech PROMPT "Fechar" SIZE 050, 018 OF oDlgGrp ACTION (oDlgGrp:End()) FONT oFontBtn PIXEL
//Dados
@ 024, 003 GROUP oGrpDad TO (nJanAltu/2-003), (nJanLarg/2-003) PROMPT "Browse" OF oDlgGrp COLOR 0, 16777215 PIXEL
oGrpDad:oFont := oFontBtn
oPanGrid := tPanel():New(033, 006, "", oDlgGrp, , , , RGB(000,000,000), RGB(254,254,254), (nJanLarg/2 - 13), (nJanAltu/2 - 45))
oGetGrid := FWBrowse():New()
oGetGrid:DisableFilter()
oGetGrid:DisableConfig()
oGetGrid:DisableReport()
oGetGrid:DisableSeek()
oGetGrid:DisableSaveConfig()
oGetGrid:SetFontBrowse(oFontBtn)
oGetGrid:SetAlias(cAliasTab)
oGetGrid:SetDataTable()
oGetGrid:SetEditCell(.T., {|| .T.})
oGetGrid:lHeaderClick := .F.
oGetGrid:AddLegend(cAliasTab + "->XXQUANTI == 0", "YELLOW", "Quantidade zerada")
oGetGrid:AddLegend(cAliasTab + "->XXQUANTI < 0", "RED", "Quantidade menor que zero")
oGetGrid:AddLegend(cAliasTab + "->XXQUANTI > 0", "GREEN", "Quantidade maior que zero")
oGetGrid:SetColumns(aColunas)
oGetGrid:SetOwner(oPanGrid)
oGetGrid:Activate()
ACTIVATE MsDialog oDlgGrp CENTERED
//Deleta a temporaria
oTempTable:Delete()
RestArea(aArea)
Return
Static Function fMontaHead()
Local nAtual
Local aHeadAux := {}
//Adicionando colunas
//[1] - Campo da Temporaria
//[2] - Titulo
//[3] - Tipo
//[4] - Tamanho
//[5] - Decimais
//[6] - Máscara
//[7] - Editável? .T. = sim, .F. = não
//[8] - Alinhamento sendo 0=Centralizado (textos);1=Esquerda; 2=Direita
aAdd(aHeadAux, {"XXCODIGO", "Código", "C", 6, 0, "", .F., 1})
aAdd(aHeadAux, {"XXDESCRI", "Descricao", "C", 30, 0, "", .F., 1})
aAdd(aHeadAux, {"XXQUANTI", "Quantidade", "N", 9, 2, "@E 999,999.99", .T., 2})
aAdd(aHeadAux, {"XXEMISSA", "Emissão", "D", 8, 0, "", .T., 2})
aAdd(aHeadAux, {"XXOBSERV", "Observação", "C", 40, 0, "", .T., 0})
//Percorrendo e criando as colunas
For nAtual := 1 To Len(aHeadAux)
oColumn := FWBrwColumn():New()
oColumn:SetData(&("{|| " + cAliasTab + "->" + aHeadAux[nAtual][1] +"}"))
oColumn:SetTitle(aHeadAux[nAtual][2])
oColumn:SetType(aHeadAux[nAtual][3])
oColumn:SetSize(aHeadAux[nAtual][4])
oColumn:SetDecimal(aHeadAux[nAtual][5])
oColumn:SetPicture(aHeadAux[nAtual][6])
oColumn:nAlign := aHeadAux[nAtual][8]
//Se for ser possível ter o duplo clique
If aHeadAux[nAtual][7]
oColumn:SetEdit(.T.)
oColumn:SetReadVar(aHeadAux[nAtual][1])
//oColumn:SetValid({|| fSuaValid()})
EndIf
aAdd(aColunas, oColumn)
Next
Return
Static Function fMontDados(oSay)
Local aArea := GetArea()
Local nAtual := 0
Local nTotal := 50
Local dDtRef := Date()
Local cCodAtu := "000000"
Local cDescri := ""
Local nQuanti := 0
Local dEmissa := sToD("")
//Faz um laço de repetição
For nAtual := 1 To nTotal
//Muda a mensagem na regua
nAtual++
oSay:SetText("Adicionando registro " + cValToChar(nAtual) + " de " + cValToChar(nTotal) + "...")
//Pega as variáveis que vão ser gravadas
cCodAtu := Soma1(cCodAtu)
cDescri := "[" + Time() + "] Teste - " + cCodAtu
nQuanti := Randomize(-5, 5)
dEmissa := DaySub(dDtRef, nAtual)
//Insere os dados na temporária
RecLock(cAliasTab, .T.)
(cAliasTab)->XXCODIGO := cCodAtu
(cAliasTab)->XXDESCRI := cDescri
(cAliasTab)->XXQUANTI := nQuanti
(cAliasTab)->XXEMISSA := dEmissa
(cAliasTab)->XXOBSERV := ""
(cAliasTab)->(MsUnlock())
Next
RestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
