Hoje trago uma dica para deixar grids com MsNewGetDados “mais bonitinhas” rs.
Antes de começarmos o artigo, pessoal a classe MsNewGetDados foi descontinuada, não recomendo criar rotinas do zero com ela, para isso tente usar por exemplo a FwBrowse e/ou MVC, nesse link tem exemplos – Migrando do MSNewGetDados para FWBrowse e MVC.
Porém, como existem inúmeros fontes legados e antigos para manutenção, às vezes não temos tempo de tirar de uma classe e colocar em outra, então o artigo de hoje foi pensando nisso.
As versões mais novas do Protheus, utilizam CSS para os componentes gráficos, então o que eu fiz para descobrir em como aumentar a fonte, foi utilizar o método GetCSS() em uma FWBrowse, copiar o conteúdo e achar os pontos de alteração.
A partir disso, usei o método SetCSS() na grid criada com MsNewGetDados, informando QHeaderView (para deixar o cabeçalho negrito) e QTableView (para aumentar a fonte).
Abaixo um print do antes:
Abaixo um print do depois:
E abaixo o código de exemplo desenvolvido:
//Bibliotecas
#Include "Protheus.ch"
#Include "TopConn.ch"
//Legendas
Static oBmpVerde := LoadBitmap( GetResources(), "BR_VERDE")
Static oBmpVermelho := LoadBitmap( GetResources(), "BR_VERMELHO")
Static oBmpPreto := LoadBitmap( GetResources(), "BR_PRETO")
/*/{Protheus.doc} zMsNew
Função para ver os grupos de produto
@author Atilio
@since 24/05/2021
@version 1.0
@type function
@obs Exemplo baseado no link https://terminaldeinformacao.com/knowledgebase/msnewgetdados/
O ideal é fazer grids com FWBrowse, porém se precisar adaptar algum fonte legado,
pode-se basear no exemplo abaixo
Ah, se você quiser copiar o CSS de outro componente, use o método GetCSS() e salve em um txt
Depois copie esse txt e coloque no SetCSS do seu componente
/*/
User Function zMsNew()
Local aArea := GetArea()
//Objetos da Janela
Private oDlgPvt
Private oMsGetSBM
Private aHeadSBM := {}
Private aColsSBM := {}
Private oBtnSalv
Private oBtnFech
Private oBtnLege
//Tamanho da Janela
Private nJanLarg := 700
Private nJanAltu := 500
//Fontes
Private cFontUti := "Tahoma"
Private oFontAno := TFont():New(cFontUti,,-38)
Private oFontSub := TFont():New(cFontUti,,-20)
Private oFontSubN := TFont():New(cFontUti,,-20,,.T.)
Private oFontBtn := TFont():New(cFontUti,,-14)
//Criando o cabeçalho da Grid
// Título Campo Máscara Tamanho Decimal Valid Usado Tipo F3 Combo
aAdd(aHeadSBM, {"", "XX_COR", "@BMP", 002, 0, ".F.", " ", "C", "", "V", "", "", "", "V"})
aAdd(aHeadSBM, {"Código", "BM_GRUPO", "", TamSX3("BM_GRUPO")[01], 0, ".T.", ".T.", "C", "", ""} )
aAdd(aHeadSBM, {"Descrição", "BM_DESC", "", TamSX3("BM_DESC")[01], 0, "NaoVazio()", ".T.", "C", "", ""} )
aAdd(aHeadSBM, {"Status Grupo", "BM_STATUS", "", TamSX3("BM_STATUS")[01], 0, "PERTENCE('1234')", ".T.", "C", "", "1=Novo;2=Remanufaturado;3=Reciclado;4=Usado"} )
aAdd(aHeadSBM, {"Procedencia", "BM_PROORI", "", TamSX3("BM_PROORI")[01], 0, "Pertence('01')", ".T.", "C", "", "1=Original;0=Nao Original"} )
aAdd(aHeadSBM, {"Total de Produtos", "XX_TOTAL", "@E 999,999,999,999,999,999", 018, 0, ".T.", ".T.", "N", "", ""} )
aAdd(aHeadSBM, {"SBM Recno", "XX_RECNO", "@E 999,999,999,999,999,999", 018, 0, ".T.", ".T.", "N", "", ""} )
Processa({|| fCarAcols()}, "Processando")
//Criação da tela com os dados que serão informados
DEFINE MSDIALOG oDlgPvt TITLE "Grupos de Produto" FROM 000, 000 TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
//Labels gerais
@ 004, 003 SAY "TST" SIZE 200, 030 FONT oFontAno OF oDlgPvt COLORS RGB(149,179,215) PIXEL
@ 004, 050 SAY "Listagem de" SIZE 200, 030 FONT oFontSub OF oDlgPvt COLORS RGB(031,073,125) PIXEL
@ 014, 050 SAY "Grupos de Produtos" SIZE 200, 030 FONT oFontSubN OF oDlgPvt COLORS RGB(031,073,125) PIXEL
//Botões
@ 006, (nJanLarg/2-001)-(0052*01) BUTTON oBtnFech PROMPT "Fechar" SIZE 050, 018 OF oDlgPvt ACTION (oDlgPvt:End()) FONT oFontBtn PIXEL
@ 006, (nJanLarg/2-001)-(0052*02) BUTTON oBtnLege PROMPT "Legenda" SIZE 050, 018 OF oDlgPvt ACTION (fLegenda()) FONT oFontBtn PIXEL
@ 006, (nJanLarg/2-001)-(0052*03) BUTTON oBtnSalv PROMPT "Salvar" SIZE 050, 018 OF oDlgPvt ACTION (fSalvar()) FONT oFontBtn PIXEL
//Grid dos grupos
oMsGetSBM := MsNewGetDados():New( 029,; //nTop - Linha Inicial
003,; //nLeft - Coluna Inicial
(nJanAltu/2)-3,; //nBottom - Linha Final
(nJanLarg/2)-3,; //nRight - Coluna Final
GD_INSERT + GD_UPDATE + GD_DELETE,; //nStyle - Estilos para edição da Grid (GD_INSERT = Inclusão de Linha; GD_UPDATE = Alteração de Linhas; GD_DELETE = Exclusão de Linhas)
"AllwaysTrue()",; //cLinhaOk - Validação da linha
,; //cTudoOk - Validação de todas as linhas
"",; //cIniCpos - Função para inicialização de campos
,; //aAlter - Colunas que podem ser alteradas
,; //nFreeze - Número da coluna que será congelada
9999,; //nMax - Máximo de Linhas
,; //cFieldOK - Validação da coluna
,; //cSuperDel - Validação ao apertar '+'
,; //cDelOk - Validação na exclusão da linha
oDlgPvt,; //oWnd - Janela que é a dona da grid
aHeadSBM,; //aHeader - Cabeçalho da Grid
aColsSBM) //aCols - Dados da Grid
oMsGetSBM:oBrowse:SetCSS(;
"QHeaderView::Section {font-weight: bold;} " +; //Cabeçallho
"QTableView { font-size: 14px; } "; //Grid
)
ACTIVATE MSDIALOG oDlgPvt CENTERED
RestArea(aArea)
Return
/*------------------------------------------------*
| Func.: fCarAcols |
| Desc.: Função que carrega o aCols |
*------------------------------------------------*/
Static Function fCarAcols()
Local aArea := GetArea()
Local cQry := ""
Local nAtual := 0
Local nTotal := 0
Local oBmpAux
//Seleciona dados do documento de entrada
cQry := " SELECT " + CRLF
cQry += " BM_GRUPO, " + CRLF
cQry += " BM_DESC, " + CRLF
cQry += " BM_STATUS, " + CRLF
cQry += " BM_PROORI, " + CRLF
cQry += " ( " + CRLF
cQry += " SELECT " + CRLF
cQry += " COUNT(*) " + CRLF
cQry += " FROM " + CRLF
cQry += " " + RetSQLName('SB1') + " SB1 " + CRLF
cQry += " WHERE " + CRLF
cQry += " B1_FILIAL = '" + FWxFilial('SB1') + "' " + CRLF
cQry += " AND B1_GRUPO = BM_GRUPO " + CRLF
cQry += " AND B1_MSBLQL != '1' " + CRLF
cQry += " AND SB1.D_E_L_E_T_ = ' ' " + CRLF
cQry += " ) AS TOT_PROD, " + CRLF
cQry += " SBM.R_E_C_N_O_ AS SBMREC " + CRLF
cQry += " FROM " + CRLF
cQry += " " + RetSQLName('SBM') + " SBM " + CRLF
cQry += " WHERE " + CRLF
cQry += " BM_FILIAL = '" + FWxFilial('SBM') + "' " + CRLF
cQry += " AND SBM.D_E_L_E_T_ = ' ' " + CRLF
cQry += " ORDER BY " + CRLF
cQry += " BM_GRUPO " + CRLF
TCQuery cQry New Alias "QRY_SBM"
//Setando o tamanho da régua
Count To nTotal
ProcRegua(nTotal)
//Enquanto houver dados
QRY_SBM->(DbGoTop())
While ! QRY_SBM->(EoF())
//Atualizar régua de processamento
nAtual++
IncProc("Adicionando " + Alltrim(QRY_SBM->BM_GRUPO) + " (" + cValToChar(nAtual) + " de " + cValToChar(nTotal) + ")...")
//Definindo a legenda padrão como preto
oBmpAux := oBmpPreto
//Se for Original será verde
If QRY_SBM->BM_PROORI == '1'
oBmpAux := oBmpVerde
//Senão, se for Não Original, será vermelho
ElseIf QRY_SBM->BM_PROORI == '0'
oBmpAux := oBmpVermelho
EndIf
//Adiciona o item no aCols
aAdd(aColsSBM, { ;
oBmpAux,;
QRY_SBM->BM_GRUPO,;
QRY_SBM->BM_DESC,;
QRY_SBM->BM_STATUS,;
QRY_SBM->BM_PROORI,;
QRY_SBM->TOT_PROD,;
QRY_SBM->SBMREC,;
.F.;
})
QRY_SBM->(DbSkip())
EndDo
QRY_SBM->(DbCloseArea())
RestArea(aArea)
Return
/*--------------------------------------------------------*
| Func.: fLegenda |
| Desc.: Função que mostra uma descrição das legendas |
*--------------------------------------------------------*/
Static Function fLegenda()
Local aLegenda := {}
aAdd(aLegenda, {"BR_PRETO", "Sem Classificação"})
aAdd(aLegenda, {"BR_VERDE", "Original"})
aAdd(aLegenda, {"BR_VERMELHO", "Não Original"})
BrwLegenda("Grupo de Produtos", "Legenda", aLegenda)
Return
/*--------------------------------------------------------*
| Func.: fSalvar |
| Desc.: Função que percorre as linhas e faz a gravação |
*--------------------------------------------------------*/
Static Function fSalvar()
Local aColsAux := oMsGetSBM:aCols
Local nPosCod := aScan(aHeadSBM, {|x| Alltrim(x[2]) == "BM_GRUPO"})
Local nPosDes := aScan(aHeadSBM, {|x| Alltrim(x[2]) == "BM_DESC"})
Local nPosSta := aScan(aHeadSBM, {|x| Alltrim(x[2]) == "BM_STATUS"})
Local nPosPro := aScan(aHeadSBM, {|x| Alltrim(x[2]) == "BM_PROORI"})
Local nPosTot := aScan(aHeadSBM, {|x| Alltrim(x[2]) == "XX_TOTAL"})
Local nPosRec := aScan(aHeadSBM, {|x| Alltrim(x[2]) == "XX_RECNO"})
Local nPosDel := Len(aHeadSBM) + 1
Local nLinha := 0
DbSelectArea('SBM')
//Percorrendo todas as linhas
For nLinha := 1 To Len(aColsAux)
//Posiciona no registro
If aColsAux[nLinha][nPosRec] != 0
SBM->(DbGoTo(aColsAux[nLinha][nPosRec]))
EndIf
//Se a linha estiver excluída
If aColsAux[nLinha][nPosDel]
//Se não for uma linha nova
If aColsAux[nLinha][nPosRec] != 0
//Se não tiver produtos, ai prossegue com exclusão
If aColsAux[nLinha][nPosTot] == 0
RecLock("SBM", .F.)
DbDelete()
SBM->(MsUnlock())
EndIf
EndIf
//Se a linha for incluída
ElseIf aColsAux[nLinha][nPosRec] == 0
RecLock('SBM', .T.)
SBM->BM_GRUPO := aColsAux[nLinha][nPosCod]
SBM->BM_DESC := aColsAux[nLinha][nPosDes]
SBM->BM_STATUS := aColsAux[nLinha][nPosSta]
SBM->BM_PROORI := aColsAux[nLinha][nPosPro]
SBM->(MsUnlock())
//Senão, será alteração
Else
RecLock('SBM', .F.)
SBM->BM_DESC := aColsAux[nLinha][nPosDes]
SBM->BM_STATUS := aColsAux[nLinha][nPosSta]
SBM->BM_PROORI := aColsAux[nLinha][nPosPro]
SBM->(MsUnlock())
EndIf
Next
MsgInfo("Manipulações finalizadas!", "Atenção")
oDlgPvt:End()
Return
Update 2023:
Criamos uma função, chamada zCSSGrid, onde você pode acionar diretamente após criar sua grid, da seguinte forma:
oSuaGrid:oBrowse:SetCSS(u_zCSSGrid())
Abaixo o código fonte completo da zCSSGrid:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function zCSSGrid
Altera o tamanho do texto usado nas grids antigas (MsNewGetDados e MsSelect)
@type Function
@author Atilio
@since 18/08/2021
@version version
@param nTamFonte, Numeric, Tamanho da fonte em pixels na grid
@example
/*/
User Function zCSSGrid(nTamFonte)
Local cCSSGrid := ""
Default nTamFonte := 14
cCSSGrid += "QHeaderView::section {" + CRLF
cCSSGrid += " background-color: #6E7D81;" + CRLF
cCSSGrid += " border: 1px solid #646769;" + CRLF
cCSSGrid += " border-bottom-color: #4B4B4B;" + CRLF
cCSSGrid += " border-right-color: #3F4548;" + CRLF
cCSSGrid += " border-left-color: #90989D;" + CRLF
cCSSGrid += " color: #FFFFFF;" + CRLF
cCSSGrid += " font-family: arial;" + CRLF
cCSSGrid += " height: 27px;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QHeaderView::section:pressed {" + CRLF
cCSSGrid += " background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #485154, stop: 1 #6D7C80);" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QTableView {" + CRLF
cCSSGrid += " selection-background-color: #1C9DBD;" + CRLF
cCSSGrid += " selection-color: #FFFFFF;" + CRLF
cCSSGrid += " alternate-background-color: #B2CBE7;" + CRLF
cCSSGrid += " background: #FFFFFF;" + CRLF
cCSSGrid += " color: #000000;" + CRLF
cCSSGrid += " font-size: " + cValToChar(nTamFonte) + "px;" + CRLF
//cCSSGrid += " border: 1px solid #C5C9CA;" + CRLF
//cCSSGrid += " border-top: 0px;" + CRLF
//cCSSGrid += " border-left: 0px;" + CRLF
//cCSSGrid += " border-right: 0px;" + CRLF
cCSSGrid += " border: none;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar:horizontal {" + CRLF
cCSSGrid += " background-color: #F2F2F2;" + CRLF
cCSSGrid += " border: 1px solid #C5C9CA;" + CRLF
cCSSGrid += " margin: 0 15px 0px 16px;" + CRLF
cCSSGrid += " max-height: 16px;" + CRLF
cCSSGrid += " min-height: 16px;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::add-page:horizontal," + CRLF
cCSSGrid += "QScrollBar::sub-page:horizontal {" + CRLF
cCSSGrid += " background: #F2F2F2;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::handle:horizontal {" + CRLF
cCSSGrid += " background-color: #B2B2B2;" + CRLF
cCSSGrid += " border: 3px solid #F2F2F2;" + CRLF
cCSSGrid += " border-radius: 7px;" + CRLF
cCSSGrid += " min-width: 20px;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::add-line:horizontal {" + CRLF
cCSSGrid += " border-image: url(rpo:fwskin_scroll_hrz_btn_rgt_nml.png) 2 2 2 2 stretch;" + CRLF
cCSSGrid += " border: 1px solid black;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::add-line:horizontal:pressed {" + CRLF
cCSSGrid += " border-image: url(rpo:fwskin_scroll_hrz_btn_rgt_nml.png) 2 2 2 2 stretch;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::add-line:horizontal {" + CRLF
cCSSGrid += " border-top-width: 2px;" + CRLF
cCSSGrid += " border-right-width: 2px;" + CRLF
cCSSGrid += " border-bottom-width: 2px;" + CRLF
cCSSGrid += " border-left-width: 2px;" + CRLF
cCSSGrid += " width: 13px;" + CRLF
cCSSGrid += " subcontrol-position: right;" + CRLF
cCSSGrid += " subcontrol-origin: margin;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::sub-line:horizontal {" + CRLF
cCSSGrid += " border-image: url(rpo:fwskin_scroll_hrz_btn_lft_nml.png) 2 2 2 2 stretch;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::sub-line:horizontal:pressed {" + CRLF
cCSSGrid += " border-image: url(rpo:fwskin_scroll_hrz_btn_lft_nml.png) 2 2 2 2 stretch;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::sub-line:horizontal {" + CRLF
cCSSGrid += " border-top-width: 2px;" + CRLF
cCSSGrid += " border-right-width: 2px;" + CRLF
cCSSGrid += " border-bottom-width: 2px;" + CRLF
cCSSGrid += " border-left-width: 2px;" + CRLF
cCSSGrid += " width: 13px;" + CRLF
cCSSGrid += " subcontrol-position: left;" + CRLF
cCSSGrid += " subcontrol-origin: margin;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar:vertical {" + CRLF
cCSSGrid += " background-color: #F2F2F2;" + CRLF
cCSSGrid += " border-top-width: 0px;" + CRLF
cCSSGrid += " border-right-width: 0px;" + CRLF
cCSSGrid += " border-bottom-width: 0px;" + CRLF
cCSSGrid += " border-left-width: 0px;" + CRLF
cCSSGrid += " margin: 15px 0px 16px 0px;" + CRLF
cCSSGrid += " max-width: 16px;" + CRLF
cCSSGrid += " min-width: 16px;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::add-page:vertical," + CRLF
cCSSGrid += "QScrollBar::sub-page:vertical {" + CRLF
cCSSGrid += " background: #F2F2F2;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::handle:vertical {" + CRLF
cCSSGrid += " background-color: #B2B2B2;" + CRLF
cCSSGrid += " border: 3px solid #F2F2F2;" + CRLF
cCSSGrid += " border-radius: 7px;" + CRLF
cCSSGrid += " min-height: 20px;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::add-line:vertical {" + CRLF
cCSSGrid += " border-image: url(rpo:fwskin_scroll_vrt_btn_btm_nml.png) 2 2 2 2 stretch;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::add-line:vertical:pressed {" + CRLF
cCSSGrid += " border-image: url(rpo:fwskin_scroll_vrt_btn_btm_nml.png) 2 2 2 2 stretch;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::add-line:vertical {" + CRLF
cCSSGrid += " border-top-width: 2px;" + CRLF
cCSSGrid += " border-right-width: 2px;" + CRLF
cCSSGrid += " border-bottom-width: 2px;" + CRLF
cCSSGrid += " border-left-width: 2px;" + CRLF
cCSSGrid += " height: 13px;" + CRLF
cCSSGrid += " subcontrol-position: bottom;" + CRLF
cCSSGrid += " subcontrol-origin: margin;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::sub-line:vertical {" + CRLF
cCSSGrid += " border-image: url(rpo:fwskin_scroll_vrt_btn_top_nml.png) 2 2 2 2 stretch;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::sub-line:vertical:pressed {" + CRLF
cCSSGrid += " border-image: url(rpo:fwskin_scroll_vrt_btn_top_nml.png) 2 2 2 2 stretch;" + CRLF
cCSSGrid += "}" + CRLF
cCSSGrid += "" + CRLF
cCSSGrid += "QScrollBar::sub-line:vertical {" + CRLF
cCSSGrid += " border-top-width: 2px;" + CRLF
cCSSGrid += " border-right-width: 2px;" + CRLF
cCSSGrid += " border-bottom-width: 2px;" + CRLF
cCSSGrid += " border-left-width: 2px;" + CRLF
cCSSGrid += " height: 13px;" + CRLF
cCSSGrid += " subcontrol-position: top;" + CRLF
cCSSGrid += " subcontrol-origin: margin;" + CRLF
cCSSGrid += "}" + CRLF
Return cCSSGrid
Bom pessoal, por hoje é só.
Abraços e até a próxima.


Bom dia Dan,
Ótimo post.
Opa, obrigado pelo feedback Wanderson.
Grande abraço.