Olá. Estou com uma dúvida referente ao objeto TRadMenu, o radio button, preciso limpar a opção selecionada caso um outro campo do formulário seja alterado, a variável de controle já está sendo alterada e está correto, porém o objeto visual não limpa a marcação de forma alguma. Alguém sabe como faz pra limpar o radio button sem que seja necessário destruir o objeto e instanciar novamente? Até implementei essa solução destruindo o objeto e criando novamente mas é uma gambiarra bem feia rsrsrs.
Raphael,
Via métodos convencionais, não é possível remover a seleção do TRadMenu, até porque a ideia é sempre ter algo selecionado.
Talvez deixar o componente inativo (Disable) seja uma melhor alternativa, assim fica evidente ao usuário que ele não deve selecionar nada naquele componente.
Caso queira remover a seleção sem recriar o componente, é possível fazer isso ao atribuir um valor a propriedade aItems do componente, exemplo:
#include "protheus.ch"
//-------------------------------------------------------------------
/*/{Protheus.doc} u_myRadMenu
Exemplo de TRadMenu
@author Daniel Mendes
@since 12/06/2021
@version 1.0
/*/
//-------------------------------------------------------------------
function u_myRadMenu()
local oDlg as object
local nRadio as numeric
local aItems as array
local oRadio as object
local oBtn as object
oDlg = TDialog():New( 0, 0, 400, 400, "Exemplo TRadMenu",,,.F.,,,,,,.T.,,,,, )
nRadio := 1
aItems := {'Item01','Item02','Item03','Item04','Item05'}
oRadio := TRadMenu():New (05,05,aItems,,oDlg,,,,,,,,100,12,,,,.T.)
oRadio:bSetGet := {|u|Iif (PCount()==0,nRadio,nRadio:=u)}
oBtn := TButton():New(55, 05, "Desmarcar TRadMenu",oDlg,{||oRadio:aItems := aClone(oRadio:aItems), nRadio := 0}, 60,10,,,.F.,.T.,.F.,,.F.,,,.F. )
oDlg:Activate(,,,.T.,,,,,)
return
Veja que o botão possui um bloco de código que pega os itens do componente e atribui novamente, via aClone, isso já faz o componente perder a seleção, também deixei o nRadio igual a zero para que ter um melhor controle sobre a variável de seleção, mas não é necessário.
Documentação:
Olá Daniel.
Concordo com você sobre a ideia do radio é sempre ter uma opção marcada, porém as vezes tem a necessidade de limpar a opção para forçar o usuário e escolher novamente, que é o meu caso, o rádio é preenchido com base em um registro posicionado mas caso tenha alguma mudança nos dados no formulário diretamente, o usuário terá que revisar a escolha do radio, daria pra fazer essa solução aqui com um combobox tb, mas visualmente o radio é mais simples para o usuário final rsrs.
Vou testar essa questão do aItens, acho que é melhor que destruir o objeto e criar novamente.
Obrigado.
Olá Raphael, você também poderia (se for o caso) implementar uma lógica usando a propriedade bChange (bChange - TOTVSTEC - TDN). Assim, quando for necessário forçar que o conteúdo seja selecionado você valida com uma mensagem forçando a seleção novamente.
Olá Gabriel, resolvi o problema com o procedimento que o Daniel mandou, alimentando o array do objeto com ele mesmo e ele limpa a tela, meu problema era só visual, já tinha uma validação na variável que impedia o usuário de sair da tela sem marcar novamente o radio, porém visualmente ele já estava marcado, o que poderia causar confusão na cabeça do usuário. Agradeço a ajuda.