Botão X do oDlg

Acredito que não exista uma forma de substituir a ação do botão fechar. Ele simplesmente executa o método End() da MsDialog, fechando a janela.

O que você pode fazer é inibir a exibição do botão fechar e criar um botão fechar customizado, podendo fazer algumas verificações antes de fechar a tela.

Exemplo:


Private oDlg

// o style DS_MODALFRAME inibe a exibição do botão X/fechar
Define MsDialog oDlg Title '' From 001, 001 To 140, 380 Pixel Style DS_MODALFRAME

    TButton():New(040, 075, 'Fechar', oDlg, { || FechaDialog() }, 040, 014, , , , .T., , '', , , , .F.)

    // impede o usuário de fechar a janela ao apertar o Esc
    oDlg:lEscClose := .F.

Activate MsDialog oDlg Centered

Dentro da função FechaDialog, chamado no botão Fechar, você pode criar sua lógica e então finalizar a tela.

Exemplo:


Static Function FechaDialog

    // crio minha lógica antes de fechar a janela

    // fecho a janela
    oDlg:End()

Return