Exemplo MVC ADVPL ViewDef botão ao lado de um campo

Olá, tenho uma tela em MCV que eu gostari de adiionar um botão no lugar de um campo, alguém possui algum exemplo?

Acredito que preciso fazer isso na ViewDef do probrama.

Obrigaod,

Olá!

Você pode dividir na ViewDef sua estrturura de cabeçalho por exemplo entre direita e esquerda e na estrutura da direita você iria adicionar um objeto externo com a função AddOtherObject chamando um programa que colocaria o botão com a função desejada.

Criando ViewDef:


/*/{Protheus.doc} ViewDef
INTERFACE GRÁFICA
@type Static function
@version 
@author Maike
@since 25/06/2019
@return Objeto, modelo que será visualizado
/*/
Static Function ViewDef()
    // INSTANCIA A VIEW
    Local oView := FwFormView():New()

    // INSTANCIA AS SUBVIEWS
    Local oStruZB1 := FwFormStruct(2, "ZB1")
    Local oStruZB2 := FwFormStruct(2, "ZB2")
    Local oStruZB3 := FwFormStruct(2, "ZB3")

    // RECEBE O MODELO DE DADOS
    Local oModel     := FwLoadModel("CTBOV01")
    Local oStTotZB2 := FWCalcStruct(oModel:GetModel('ZB2CALC'))
    Local oStTotZB3 := FWCalcStruct(oModel:GetModel('ZB3CALC'))

    // INDICA O MODELO DA VIEW
    oView:SetModel(oModel)

    // CRIA ESTRUTURA VISUAL DE CAMPOS
    oView:AddField("VIEW_ZB1", oStruZB1, "ZB1MASTER")
    oView:AddGrid("VIEW_ZB2", oStruZB2, "ZB2DETAIL")
    oView:AddGrid("VIEW_ZB3", oStruZB3, "ZB3DETAIL")
    oView:AddField('VIEW_TOT_ZB2', oStTotZB2,'ZB2CALC')
    oView:AddField('VIEW_TOT_ZB3', oStTotZB3,'ZB3CALC')

    // CRIA BOXES HORIZONTAIS
    oView:CreateHorizontalBox("CABECALHO", 14)
    oView:CreateHorizontalBox("MACHO", 25)
    oView:CreateHorizontalBox("MACHOTOTAL", 18)
    oView:CreateHorizontalBox("FEMEA", 25)
    oView:CreateHorizontalBox("FEMEATOTAL", 18)
    oView:CreateVerticalBox( 'CABESQ', 92, 'CABECALHO' )
    oView:CreateVerticalBox( 'CABDIR', 8, 'CABECALHO' )

    // RELACIONA OS BOXES COM AS ESTRUTURAS VISUAIS
    oView:SetOwnerView("VIEW_ZB1", "CABESQ")
    oView:SetOwnerView("VIEW_ZB2", "MACHO")
    oView:SetOwnerView('VIEW_TOT_ZB2','MACHOTOTAL')
    oView:SetOwnerView("VIEW_ZB3", "FEMEA")
    oView:SetOwnerView('VIEW_TOT_ZB3','FEMEATOTAL')

    // DEFINE AUTO-INCREMENTO AO CAMPO
    //oView:AddIncrementField("VIEW_ZB2", "ZB2_PRODUT")

    // Acrescenta um objeto externo ao View do MVC
    oView:AddOtherObject("VIEW_CAB", {|oPanel| CABEXT(oPanel)})

    oView:SetCloseOnOk( { || .T. })  //Fecha a Tela ao confirmar

    // Associa ao box que ira exibir os outros objetos
    oView:SetOwnerView('VIEW_CAB','CABDIR')

    // DEFINE OS TÍTULOS DAS SUBVIEWS
    oView:EnableTitleView("VIEW_ZB2","Macho")
    oView:EnableTitleView("VIEW_ZB3","Femea")
Return (oView)

Aqui você cria o botão:


Static Function CABEXT(oPanel)

    Local oView      := FWViewActive()
    Local oModel      := FWModelActive()
    Local oFont8N     := TFONT():New("ARIAL",08,-11,,.T.,,,,.T.,.F.) ///Fonte 8 Negrito

    if oModel:GetOperation() > 1
        SetKey(VK_F5, {|| IncGrid(1)})
    Endif

    SX3->(DbSetOrder(2))

    if ValType(oScrSco) == "U"
        oScrSco:= TScrollBox():Create(oPanel,01,01,oPanel:nClientHeight - 40,oPanel:nClientWidth / 2,.F.,.T.,.F.)
        oScrSco:Align := CONTROL_ALIGN_ALLCLIENT
    Endif

    oPanel1 := oPanel
    oView:Refresh()

    oBtn  := TButton():New( 007, 007, "Calcular(F5)",oScrSco,{||IncGrid(1)}, 40,30,,,.F.,.T.,.F.,,.F.,,,.F. )

    //Cria CSS Defualt para os Botoes
    cCSSBtn1 := " QPushButton {"
    cCSSBtn1 += " background-color: rgb(255, 40, 20);"
    cCSSBtn1 += " border-style: outset; "
    cCSSBtn1 += " border-width: 1px;"
    cCSSBtn1 += " border-color: black;"
    cCSSBtn1 += " border-radius: 10px;"
    cCSSBtn1 += " font-weight: bold;"
    cCSSBtn1 += " }"

    oBtn:setCSS(cCSSBtn1)
    oBtn:Refresh()

Return

Ignora as ZB2 e ZB3 para facilitar seu entendimento, mas dessa forma você consegue montar um botão separado

Bah! Muito obrigado, vou testar.

Sem problemas, caso seja isso ai deixa o feedback para o pessoal e na resposta! Abraço!