
Apresentamos a seguir algumas das opções associadas aos controles definidos em Caixas de Diálogo. Veja os tópicos dedicados a cada controle para obter maiores detalhes.
A opção Valid, associada aos controles do tipo [Def]PushButton, ListBox, ComboBox e EditBox, serve para invocar uma função lógica, passando para ela, opcionalmente, como parâmetros, as variáveis associadas aos controles da Caixa de Diálogo ou quaisquer outros itens fora da DialogBox.
O objetivo da função invocada pela cláusula Valid é, obviamente, fazer a validação das informações e processá-las corretamente, retornando ao processamento da Caixa de Diálogo. Se a função acionada retornar um valor lógico verdade ("return (.t.)"), o Quadro de Diálogo será encerrado. Porém, se a função invocada retornar um valor lógico falso ("return(.f.)"), o Quadro de Diálogo permanece aberto e disponível na tela, permitindo, assim, enviar avisos, do tipo MessageBox ou Message na barra de status, para que o usuário tome as devidas providências, por exemplo, corrigir ou completar um dado que foi digitado incorretamente.
A cláusula Valid poderá ser utilizada, também, para executar procedimentos associados a eventos como, por exemplo, acionar um PushButton ou selecionar o item de uma lista.
Exemplo
O exemplo que segue executa a função lógica "mostra_bmp" quando acionados os botões "Imagem1" e "Imagem2", mostrando uma figura para cada botão acionado. Uma Caixa de Mensagem informa o arquivo que contém a imagem a ser mostrada. Compile este exemplo e modifique-o conforme você desejar.
$nolib
prog
func mostra_bmp(l)
set sigquit off
bt=1
varc = ""
Dialog 00,00,40,22
caption "Exemplo do comando Valid"
style WS_OVERLAPPEDWINDOW
image NULL varc 02,01,36,16
DefPushButton "Imagem&1" bt 02,20,10,-12 valid mostra_bmp(varc,bt)
PushButton "Imagem&2" bt 14,20,10,-12 valid mostra_bmp(varc,bt)
PushButton "&Sair" bt 26,20,08,-12 IDCANCEL
EndDialog
quit
func mostra_bmp
parameters varc(c),bt(n)
if bt = 1
varc="\windows\clouds.bmp"
c=MessageBox(varc,"Vou mostrar a imagem em...","O","I")
elseif bt = 2
varc="\windows\forest.bmp"
c=MessageBox(varc,"Vou mostrar a imagem em...","O","I")
else
varc=""
endif
return .t.
A opção when <func> (<p1>, ... <pn>), associada ao comando EditText, permite disponibilizar, condicionalmente, um controle do tipo EditBox, dependendo do valor retornado pela função lógica <func>. Esta opção pode ser utilizada, com proveito, para controle de entrada de dados e preenchimento de formulários eletrônicos.
Exemplo
$nolib
prog
cbnom,cbsex,cbend,cbtel=.f.
func fval(l)
func mbox(l)
varnom,varsex,varend,vartel = ""
botao=1
Dialog 00,00,36,14
style WS_OVERLAPPEDWINDOW
font "Courier New"
ltext "Marque campos a preencher:" NULL 01,00,26,01
checkbox "Nome" cbnom 05,02,10,01
checkbox "Sexo" cbsex 05,03,10,01
checkbox "Endereço" cbend 05,04,10,01
checkbox "Telefone" cbtel 05,05,10,01
Rtext "Nome:" NULL 02,07,10,01
EditText NULL varnom 12,07,20,1 when fval(cbnom)
Rtext "Sexo:" NULL 02,08,10,01
EditText NULL varsex 12,08,01,1 pic "!" when fval(cbsex)
Rtext "Endereco:" NULL 02,09,10,01
EditText NULL varend 12,09,20,1 pic rep("!",40) when fval(cbend)
Rtext "Fone:" NULL 02,10,10,01
EditText NULL vartel 12,10,10,1 when fval(cbtel)
DefPushButton "&OK" botao 12,12,06,-12;
valid mbox(botao,varnom,varsex,varend,vartel)
PushButton "&Reset" botao 20,12,06,-12;
valid mbox(botao,varnom,varsex,varend,vartel)
PushButton "&Quit" NULL 28,12,06,-12 IDCANCEL
EndDialog
if botao = 2
quit
endif
return
func fval
parameters cbx(l)
return cbx
func mbox
parameters botao(n),varnom,varsex,varend,vartel
if botao = 2
varnom,varsex,varend,vartel = ""
ret=MessageBox ("Vou limpar as variáveis ...","","O","I")
RefreshControl (6)
RefreshControl (8)
RefreshControl (10)
RefreshControl (12)
return (.t.)
endif
mens="nome="+varnom+chr(10)+;
"sexo="+varsex+chr(10)+;
"end.="+varend+chr(10)+;
"tel.="+vartel
ret=MessageBox (mens,"Para você ver as variáveis...","O","I")
return (.t.)
Observações
No exemplo do programa acima, são apresentadas Caixas de Verificação, uma para cada campo a ser preenchido. O programa permite preencher apenas aqueles campos cuja CheckBox correspondente foi marcada. A seguir, podemos visualizar a tela do programa:

