Note que o que você precisa só é possível de ser feito alterando a matriz da lista GET diretamente. Isso, claro, demanda algum conhecimento de como as coisas funcionam. Então, vou mostrar o código primeiro, para comentar depois.
Código: Selecionar todos
function Main()
priva cCodigo := "P"
priva cPais := Space(20)
priva cSerie := Space(10)
set confirm on
clear
@ 10,10 say "Codigo:" get cCodigo picture "!" valid Ajuste()
@ 11,10 say "Pais..:" get cPais picture "@!"
READ
//-----------------------------------------------------------
function Ajuste()
local oGet := GetList[2]
local nLen := 1+20
*
if !cCodigo $ "PS"
cCodigo := if(oGet:Name="cPais","P","S")
Tone(100,1)
return .f.
end
*
if cCodigo = "P"
@ 11,10 say "Pais..:" + Space(nLen)
oGet:Name := "cPais"
oGet:Block := {|x|if(x=nil, cPais, cPais := x)}
else
@ 11,10 say "Serie.:" + Space(nLen)
oGet:Name := "cSerie"
oGet:Block := {|x|if(x=nil, cSerie, cSerie := x)}
end
oGet:Display()
return .t.
Existem apenas duas linhas de GET para manipular três variáveis. A primeira é o código, que vai definir qual a segunda variável será utilizada. O segundo campo é o mesmo para duas variáveis distintas: país ou série. Então, o jeito é dinamicamente alterar a matriz GET para que o segundo campo tenha sua geometria modificada para comportar a variável definida pelo valor da variável cCodigo.
O primeiro passo, como você pode ver em Ajuste(), é atualizar o SAY. Ele faz parte do comando que define a linha do campo. Mas não faz parte do GET propriamente. Se você ver o PPO, perceberá que um @...SAY...GET resulta numa coletânea de comandos. O SAY é um deles. Mas é separado e por isso, precisa ser tratado separadamente. Aí é fácil. Mas note que eu tomei o cuidado de também ajustar a extensão da variável GET. cPais e cSerie têm tamanhos diferentes. Como as variáveis em si serão reapresentadas por uma função do GET não faz mal algum limpar momentâneamente os espaços do vídeo onde elas residirão. Sem esse cuidado, ao mudar para cSerie, que é menor em extensão, ficará um "lixo" residual da variável cPais, que é maior. Por isso acrescentei Space(nLen) na reapresentação do SAY, sendo nLen o valor do espaço da maior variável (cPais) acrescido do espaço intermediário, que existe entre o SAY e o campo GET propriamente.
No passo seguinte, ajustei o campo GET. Isso eu fiz de forma bem básica. São vários ítens de controle que podem ser reajustados, conforme sua necessidade. Para o caso que se apresenta, só precisei modificar dois parâmetros para cumprir a tarefa. O primeiro é o nome da variável. O sub-sistema GET dispõe da função ReadVar(), que fornece a você, para um propósito específico qualquer, o nome da variável (não é o conteúdo). O segundo parâmetro é o bloco de código que permite acessar o conteúdo da variável. O sub-sistema GET utiliza esse bloco internamente para respaldar a execução das funções VarGet() e VarSet(), que são as funções que normalmente utilizamos para ler ou alterar o conteúdo de um campo GET.
O passo final é a re-apresentação do campo GET, devidamente modificado, através da função Display().
Faça algumas experiências, modificando alguns parâmetros para ver que bixo dá. Assim você consegue se familiarizar mais facilmente com o sub-sistema GET e começa a entender melhor como tudo funciona. A arquitetura desse sub-sistema é das mais pobres possíveis. Mas até que dá espaço para criar coisas bem interessantes. Se quiser se aprofundar nisso, é aconselhável uma boa leitura do seu fonte, que está no arquivo GETSYS.PRG, no diretório SOURCES da sua instalação do Clipper.