
Apresentamos a seguir os comandos e funções freqüentemente utilizados para gerenciar as caixas de Diálogo.
Os comandos EnableControl e EnableControlId habilitam determinados controles (previamente desabilitados) tornando-os disponíveis dentro de uma DialogBox.
Sintaxe
EnableControl (<num>)
EnableControlId (<id>)
Onde:
<num> identifica o controle a ser ativado, ou seja, disponibilizado. Todos os controles recebem um número seqüencial, a partir de 01, na ordem de especificação dentro da Caixa de Diálogo.
<id> especifica o nome atribuído ao controle, pela opção ID <expc>, quando da definição do mesmo dentro de um DialogBox.
Os comandos DisableControl e DisableControlId desativam determinados controles dentro de uma DialogBox. O parâmetro <num> identifica o controle através de um número seqüencial, a partir de 01, na ordem de especificação dentro da Caixa de Diálogo.
Sintaxe
DisableControl (<num>)
DisableControlId (<id>)
Onde:
<num> identifica o controle a ser desativado. Todos os controles recebem um número seqüencial, a partir de 01, na ordem de especificação dentro da Caixa de Diálogo.
<id> especifica o nome atribuído ao controle, pela opção ID <expc>, quando da definição do mesmo dentro de um DialogBox.
Os comandos MoveControl e MoveControlId deslocam o controle identificado pelo número <num> ou pela identificação <id> e o posiciona nas coordenadas especificadas em <xi>,<yi>,<xl>,<yl>.
Sintaxe
MoveControl (<num>,<xi>,<yi>,<xl>,<yl>)
MoveControlId (<id>,<xi>,<yi>,<xl>,<yl>)
Onde:
<num> identifica o controle a ser deslocado. Todos os controles recebem um número seqüencial, a partir de 01, na ordem de especificação dentro da Caixa de Diálogo.
<id> especifica o nome atribuído ao controle, pela opção ID <expc>, quando da definição do mesmo dentro de um DialogBox.
<xi>,<yi>,<xl>,<yl> especificam as coordenadas e os tamanhos para posicionar o controle que está sendo movido de lugar.
Os comandos DeleteControl e DeleteControlId eliminam da tela o controle identificado pelo número <num> ou pela identificação <id>.
Sintaxe
DeleteControl (<num>)
DeleteControlId(<id>)
Onde:
<num> identifica o controle a ser deslocado. Todos os controles recebem um número seqüencial, a partir de 01, na ordem de especificação dentro da Caixa de Diálogo.
<id> especifica o nome atribuído ao controle, pela opção ID <expc>, quando da definição do mesmo dentro de um DialogBox.
O comando RefreshContent exibe na tela o conteúdo atualizado dos vetores que foram associados aos controles ListBox ou ComboBox. Este comando permite repintar na tela o conteúdo dos controles acima referenciados, desde que seus correspondentes vetores sejam previamente preenchidos ou atualizados no programa.
Sintaxe
RefreshContent (<str>)
Onde:
<str> identifica um vetor associado a ListBox ou ComboBox, assim como, também, uma variável associada a controles do tipo EditText, CheckBox, GroupBox e Image. O nome da variável pode ser passado como parâmetro ou a variável pode ser pública.
Os comandos RefreshControl e RefreshControl Id exibem na tela o conteúdo atualizado do controle <num>, contado a partir de 01 dentro de uma DialogBox, ou do controle identificado por <id>. Este comando se aplica a ListBox, EditBox, CheckBox, GroupBox, ComboBox e Image, sendo similar ao comando RefreshContent. Se <num> é igual a –1 (um negativo) todos os controles do diálogo serão refrescados.
Sintaxe
RefreshControl (<num>)
RefreshControlId (<id>)
Onde:
<num> identifica o controle a ser atualizado. Todos os controles recebem um número seqüencial, a partir de 01, na ordem de especificação dentro da Caixa de Diálogo.
<id> especifica o nome atribuído ao controle, pela opção ID <expc>, quando da definição do mesmo dentro de um DialogBox.
Os comandos SelectControl e SelectControlId permitem selecionar, ou seja, marcar como "selected" algum dos itens dos controles ListBox ou ComboBox.
Sintaxe
SelectControl (<num>,<expc>)
SelectControlId (<id>,<expc>)
Onde:
<num> identifica o controle a ser processado. Neste caso, pode ser uma ListBox ou uma ComboBox. Todos os controles recebem um número seqüencial, a partir de 01, na ordem de especificação dentro da Caixa de Diálogo.
<id> especifica o nome atribuído ao controle, pela opção ID <expc>, quando da definição do mesmo dentro de um DialogBox.
<expc> especifica o item a ser marcado como "selected" , dentro dos controles ListBox ou ComboBox especificados em <num>.
Os comandos FocusControl e FocusControlId permitem "focalizar" um controle, ou seja, posicionar nele o cursor dentro de uma janela de diálogo.
Sintaxe
FocusControl (<num>)
FocusControlId (<id>)
Onde:
<num> Identifica o controle a ser processado. Todos os controles recebem um número seqüencial, a partir de 01, na ordem de especificação dentro da Caixa de Diálogo. Se <num> for um número negativo, indica que a mensagem KILLFOCUS, enviada pelo Windows para o programa OpusWin, será ignorada. Veja exemplo a seguir.
<id> especifica o nome atribuído ao controle, pela opção ID <expc>, quando da definição do mesmo dentro de um DialogBox.
A OpusWin considera que a digitação de um campo do tipo EditText foi concluída quando o "foco" sai desse campo, ou seja quando o Windows envia para o programa OpusWin o aviso de ocorrência de KILLFOCUS.
Em certas ocasiões, por exemplo quando foi associada uma função (via comando valid) a um controle EditText, e conveniente ignorar essas mensagens KILLFOCUS que o Windows gera, principalmente quando nada foi digitado no campo EditText. Por esta razão, quando o número do controle especificado em <num> for negativo, o programa OpusWin ignora o evento KILLFOCUS de um EditText.
No exemplo abaixo, quando o cursor sai (KillFocus) do campo "varcep", a função "varcep" será acionada. Se nada for digitado no campo varcep (por exemplo, passando-se o cursor para outro campo ou botão), será disparado pelo Windows o evento KILLFOCUS para o campo varcep. Este evento é recebido e interpretado pelo programa OpusWin. Como o campo varcep não está correto (pois nada foi digitado nessa campo), a mensagem "Cep inválido" seria emitida uma mensagem e o foco será posicionado em outro controle. Caso não fosse codificado o comando FocusControl (-4), o evento KILLFOCUS no campo varcep seria interpretado pelo programa OpusWin e a mensagem "Cep inválido" seria mostrada indefinidamente enquanto o campo CEP não fosse preenchido.
Exemplo
$nolib
prog
vartel = space(15)
varcep = space(10)
bt =1
function fval(l)
Dialog 00,00,79,23
style WS_POPUP DS_MODALFRAME WS_CAPTION WS_SYSMENU
ltext "Digite O Telefone:" NULL 05,05,25,01
EditText NULL vartel 31,05,10,01
ltext "Digite O Cep:" NULL 05,07,25,01
EditText NULL varcep 30,07,05,01 exec fval(varcep)
defpushbutton "&OK" bt 05,20,08,02
PushButton "&Sair" bt 20,20,08,02 IDOK
EndDialog
if bt = 2
return
endif
return
*Funcao Para Validar Numero CEP
func fval
parameters varcep
FocusControl(-4)
if empty (varcep)
m = MessageBox("Cep Invalido")
FocusControl(6)
endif
return .t.
As funções numéricas GetFocusControl() e GetNextFocus() retornam o número do controle, dentro de uma Janela de diálogo, para o qual o foco será transferido. Veja as observações no tópico a seguir.
As funções cadeia GetFocusControlId() e GetNextFocusId() retornam o identificador (nome) do controle, dentro de uma Janela de diálogo, para o qual o foco será transferido.
A OpusWin considera que a digitação de um campo do tipo EditText foi concluída quando o "foco" sai desse campo, ou seja quando o Windows envia para o programa OpusWin o aviso de ocorrência de KILLFOCUS.
Em certas ocasiões, por exemplo quando foi associada uma função (via comando valid) a um controle EditText, e conveniente ignorar essas mensagens KILLFOCUS que o Windows gera, principalmente quando nada foi digitado no campo EditText.
Exemplo
No exemplo abaixo, imaginemos que o usuário acionou o botão Sair. Neste caso, o foco saiu do campo <varcep> e a função <varcep> será acionada. A função associada ao botão Sair verifica que o NextFocus é efetivamente o botão de saída e termina a Janela de diálogo.
Caso não fosse utilizada a função GetNextFocus() , o evento KILLFOCUS no campo <varcep> seria interpretado pelo programa OpusWin e a mensagem "Cep inválido" seria mostrada indefinidamente enquanto o campo CEP não fosse preenchido.
Veja a seguir o código básico do exemplo:
$nolib
prog
vartel = space(15)
varcep = space(10)
bt =1
function fval(l)
Dialog 00,00,79,23
style WS_POPUP DS_MODALFRAME WS_CAPTION WS_SYSMENU
ltext "Digite O Telefone:" NULL 05,05,25,01
EditText NULL vartel 31,05,10,01
ltext "Digite O Cep:" NULL 05,07,25,01
EditText NULL varcep 30,07,05,01 valid fval(varcep)
defpushbutton "&OK" bt 05,20,08,02
PushButton "&Sair" bt 20,20,08,02 IDOK valid fval(varcep)
EndDialog
if bt = 2
return
endif
return
*Funcao Para Validar Numero CEP
func fval
parameters varcep
n = GetFocusControl() && ou n = Get NextFocus()
if n = 6
Cancel Dialog && ou IDCANCEL
endif
if empty (varcep)
m = MessageBox("Cep Invalido")
endif
return .t.
As funções GetControl e GetControlId permitem obter o número ou nome do controle que acionou uma função valid a ele associada.
Sintaxe
<varnum> = GetControl ( )
<varchar> = GetControlId ( )
Onde:
<varnum> identifica uma variável numérica onde será retornado o número relativo do controle que acionou a função corrente através da cláusula valid.
<varchar> identifica uma variável cadeia onde será retornado o nome controle que acionou a função corrente através da cláusula valid.
Geralmente, as funções GetControl( ) e GetControlId() são utilizadas dentro de uma função (acionada por valid) para determinar qual foi o controle que acionou a função corrente. Desta forma, podemos associar a vários controles o mesmo bloco de procedimentos, diferenciando de acordo com o controle específico que acionou esse bloco de procedimentos.
Exemplo
A seguir apresentamos um exemplo que utiliza várias das opções de gerência dinâmica dos controles das Caixas de Diálogo, acima descritos.
$nolib
prog
func fcontrol(l)
declare vetnom[6]=space(10)
vetnom[1]= "Ana"
vetnom[2]= "Beatriz"
vetnom[3]= "Carla"
vetnom[4]= "Denise"
vetnom[5]= "Eliane"
vetnom[6]= "Fábio"
varnom = "Ana"
varnum = 2
bt = 1
varnome= "EditText"
Dialog 00,00,40,16
Font "Times New Roman" 10
caption "Gerenciamento dinâmico da ListBox"
style WS_OVERLAPPEDWINDOW
ltext "ComboBox:" NULL 01,01,10,01
ComboBox vetnom varnom 01,02,10,06 WS_VSCROLL
ltext "ListBox:" NULL 21,01,10,01
ListBox vetnom varnum 21,02,10,06 WS_VSCROLL
ltext "Nome:" NULL 01,10,5,01
EditText NULL varnome 07,10,10,1
DefPushButton "&Refresh" bt 01,12,08,-12 Valid fcontrol(vetnom,bt)
PushButton "&Enable" NULL 11,12,08,-12 Valid fcontrol(vetnom,bt)
PushButton "&Disable" NULL 21,12,08,-12 Valid fcontrol(vetnom,bt)
PushButton "&Move" NULL 01,14,08,-12 Valid fcontrol(vetnom,bt)
PushButton "&Delete" NULL 11,14,08,-12 Valid fcontrol(vetnom,bt)
PushButton "&Select" NULL 21,14,08,-12 Valid fcontrol(vetnom,bt)
PushButton "Sa&i" NULL 31,14,08,-12 IDCANCEL
EndDialog
if bt = 6
quit
endif
Return
func fcontrol
parameters vetnom[],bt(n)
if bt = 1
vetnom[6]="Pepe"
RefreshControl(2)
RefreshContent(vetnom) && Altera o ListBox e ComboBox
elseif bt = 2
EnableControl(5)
EnableControl(6)
elseif bt = 3
DisableControl(5)
DisableControl(6)
elseif bt = 4
MoveControl(5,14,08,05,01)
MoveControl(6,14,09,10,01)
elseif bt = 5
DeleteControl(5)
DeleteControl(6)
else
SelectControl(2,"Carla")
SelectControl(4,"Denise")
endif
return(.t.)
Observação
Veja a tela produzida pelo exemplo acima:
Os comandos InitControl e InitControlId servem para inicializar o limite máximo de uma Barra de progressão ou Histograma. Esta função recebe como parâmetros o número (<num>) ou nome (<id>) do controle ProgressBar ou Histogram assim como o limite superior desse controle ProgressBar ou Histogram
Sintaxe
InitControl <num>,<lim>)
InitControlId (<id>,<lim>)
Onde:
<num> identifica o número do controle do tipo ProgressBar ou Histogram, cujo limite superior deseja ser "resetado" ou inicializado.
<id> especifica nome do controle do tipo ProgressBar ou Histogram, cujo limite superior deseja ser "resetado" ou inicializado.
<lim> especifica o valor do limite superior de uma Barra de Progressão de um Histograma.
As funções lógicas Chexw, Chexmw e Chexmew permitem validar, mostrar e editar itens EditText dentro de uma janela de diálogo. Possuem as mesmas características e regras de utilização das funções Chex, Chexm e Chexme (da linguagem OPUS). Veja Manual da OPUS para maiores detalhes.
A função Chexw( ) pode ser chamada para validar um campo do tipo EditText.
Sintaxe
CHEXW (<chave>,<exp>)
Exemplo
EditText NULL v1 1,1,10,2 valid chexw("NOME_p",v1)
A função Chexmw( ) pode ser chamada para validar um campo do tipo EditText, colocando o valor de outro item num campo do tipo VarText.
Sintaxe
CHEXMW (<chave>,<exp>,<item>,<vartext>)
Exemplo
EditText NULL v1 1,1,10,2 valid chexmw("NOME_p",v1, "IDADE",v2)
VarText NULL v2 1,4,5,2
A função Chexmew( ) pode ser chamada para validar um campo do tipo EditText, colocando o valor de outro item num campo do tipo VarText, editado conforme uma máscara especificada.
Sintaxe
CHEXMEW (<chave>,<exp>,<item>,<vartext>,<mask>)
Exemplo
EditText NULL v1 1,1,10,2 valid chexmew("NOME_p",v1, "IDADE",v2,"XXX.XX")
VarText NULL v2 1,4,5,2
Os comandos PrintControl e PrintControlId servem para imprimir um arquivo visualizado através do controle RichEdit, especificando:
Sintaxe
PrintControlId (<id>,<orien>)
Exemplo
…
Dialog …
…
RichEdit NULL arq 5,5,40,20 ID("xxx")
…
PushButton "Imprime" NULL 5,26,7,2 valid(f1)
…
Func f1
PrintControlId ("xxx","PT")
return .t.
