Página 2 de 2

Enviado: 14 Set 2007 09:28
por Stanis Luksys
Maligno escreveu:Pra mim, lógica adequada é aquela que resolve o problema conforme o contexto que se apresenta, resguardadas as limitações de viabilidade, sejam elas relacionadas ao tempo disponível ou mesmo à perícia técnica.
Até concordo maligno, eu só quis mostrar que criar e depois excluir o campo era menos lógico do que somente adicionar se fosse necessário.

No caso, a mudança de cor eu não concordei, até por que o objeto continua existindo e se for pressionada alguma tecla de movimentação, o campo, mesmo invisível, pode ganhar foco.

Mas se resolver pra ele, tá bão...

Enviado: 14 Set 2007 09:39
por Maligno
Stanis Luksys escreveu:Até concordo maligno, eu só quis mostrar que criar e depois excluir o campo era menos lógico do que somente adicionar se fosse necessário.
Adicionar somente se necessário? Mas se o usuário ficar brincando de apertar botão? Vai ter que incluir, excluir, incluir, excluir. Se você tem a inclusão, precisa estar preparado pra contrapartida.
No caso, a mudança de cor eu não concordei, até por que o objeto continua existindo e se for pressionada alguma tecla de movimentação, o campo, mesmo invisível, pode ganhar foco.
Você diz isso por quê não testou o código que postei. O campo some e não ganha foco mais.

Enviado: 14 Set 2007 10:44
por Stanis Luksys
Bom, eu particularemente, como já disse, adicionaria o objeto de acordo com a condição. Neste caso, muitas vezes nem sequer seria necessário. Evidente que deve ter a contraparida de ser excluído. Eu não disse que não, eu apenas disse que é mais lógico criar se precisar, e não excluir se precisar...

Agora se o fulano quer ficar brincando de apertar botão, compra um video-game né :))

Enviado: 14 Set 2007 10:49
por Maligno
Agora se o fulano quer ficar brincando de apertar botão, compra um video-game né :))
Ah, mas parece que você não conhece usuário. Além do que, ele PODE ficar brincando de passear pelos campos o quanto quiser. É a NOSSA obrigação prever que ele poderá fazer isso.
Inclusive, na minha fase de testes, uma das coisas que mais faço é tentar ferrar o sistema de alguma maneira. Se eu conseguir, é porque não trabalhei direito. Corrijo. Se eu não conseguir, o usuário também não conseguirá. Só aí eu fico tranqüilo.

Enviado: 14 Set 2007 10:56
por Stanis Luksys
Maligno escreveu:Ah, mas parece que você não conhece usuário. Além do que, ele PODE ficar brincando de passear pelos campos o quanto quiser. É a NOSSA obrigação prever que ele poderá fazer isso.
Vale lembrar que mesmo que ele fizesse isso, na solução que eu sugeri, nada haveria de errado. Nenhum problema ocorreria no sistema, apenas uma inclusão e exclusão de um item em uma matriz, o que em nada é grave.
Maligno escreveu:Inclusive, na minha fase de testes, uma das coisas que mais faço é tentar ferrar o sistema de alguma maneira.
Eu deixo outros testarem, porque geralmente quem programou já está viciado na solução ideal e passa por cima de problemas de lógica.

Enviado: 14 Set 2007 11:03
por Maligno
Vale lembrar que mesmo que ele fizesse isso, na solução que eu sugeri, nada haveria de errado. Nenhum problema ocorreria no sistema, apenas uma inclusão e exclusão de um item em uma matriz, o que em nada é grave.
Claro que não. É só uma questão de facilidade de implementação.
Eu deixo outros testarem, porque geralmente quem programou já está viciado na solução ideal e passa por cima de problemas de lógica.
Isso nunca me aconteceu.

Re: Como usar IF...ENDIF nos comandos GET e SAY?

Enviado: 05 Jan 2008 07:54
por rangelssilva
Bom Dia, Amigos clipeiros.....
Preciso de algo similar ao mostrado abaixo.....

Ex:

@ 10,10 say"codigo" get codigo
@ 11, 10 say"pais" get pais
read

@ 10,10 say"codigo" get codigo
@ 11, 10 say"serie" get serie
read


Na verdade após o codigo ser analisado o sistema deve escolher o segundo get sendo país ou série..... Se o codigo digitado anteriormente começar com "P" ele faz a primeira opção. Caso comece com "c" ele faz a segunda.....Se o usuário digitar P e depois perceber que deveria ser C ao redigitar os dados o sistema coloca a opção correta.. Não sei se ficou claro, mas o Get/Read deve ser dinâmico... È possível fazer isto....???

Tentei fazer de diversas formas....
Agradeço a ajuda....

clodoaldomonteiro escreveu:Olá amigos!

Estou tentando mostrar um comando SAY e GET na tela, dependendo da informação de um campo anteriormente preenchido. Sei que o comando WHEN que usamos com o GET pode pular um campo se uma informação anterior foi preenchida incorretamente, mas eu queria excluir da tela as informações do SAY e do GET.

Ex:
mcampo1:='1' //Este campo deve conter 1-Legislativo ou 2-Executivo
mcampo2:=0
DO WHILE .t.
@ 01,00 SAY 'Tipo de poder:'
@ 01,16 GET mcampo1 VALI mcampo1 $ '12'
IF mcampo1='1'
@ 02,00 SAY 'Valor da RCL:'
@ 02,16 GET mcampo2 PICT '@E 999,999.99 'VALI mcampo2 > 0
ENDIF
READ
...
...
...
EXIT
ENDDO
... se eu mudar o valor de mcampo1 para '2', ainda assim é mostrado o SAY e o GET
Enquanto o comando WHEN serve somente para pular o campo GET e ainda assim mostra o comando SAY e o GET.

Desde já, agradeço a ajuda.

Enviado: 05 Jan 2008 11:34
por Maligno
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.

Como usar IF...ENDIF nos comandos GET e SAY?

Enviado: 28 Abr 2015 22:05
por JoséQuintas
Voltando ao primeiro caso do say/get:
Ao meu ver, mostrar não é problema, e sim permitir digitação.
Então poderia simplificar assim:

Código: Selecionar todos

@ 5, 5 SAY "Primeiro ou Segundo:" GET nCodigo PICTURE "9" RANGE 1,2
@ 6, 5 SAY "Primeiro..............:"  GET cPrimeiro WHEN nCodigo == 1
@ 7, 5 SAY "Segundo..............:" GET cSegundo WHEN nCodigo == 2
READ

Como usar IF...ENDIF nos comandos GET e SAY?

Enviado: 02 Jun 2015 05:46
por clodoaldomonteiro
Quintas,

A minha intenção na época era poder navegar entre os GETs que são finalizados por um READ, é claro, e que o usuário pudesse getar um campo1 com uma informação X e este campo1 influenciasse no GET de um campo10 mas a frente, mas se o usuário retornasse a este campo1 o informasse Y pudesse mudar a disposição dos GETs e não precisasse mais getar esse campo10, por exemplo.

É um dos limites da programação do Clipper que se processa os GETs depois do READ, mas aí, não se pode voltar com a seta para cima, teria-se que fazer uma programação mais elaborada. Coisa que no Delphi e outras linguagens mais novas isto é mais intuitivo.

Como usar IF...ENDIF nos comandos GET e SAY?

Enviado: 02 Jun 2015 09:59
por JoséQuintas
Duas variações no GET:

Código: Selecionar todos

   LOCAL GetList := {}
   @ 1, 0 GET a VALID OutroGet()
   @ 2, 0 GET B
DO WHILE .T.
   READ SAVE
   IF Confirma()
       EXIT
   ENDIF
ENDDO
CLEAR GETS


FUNCTION OutroGet()
   LOCAL GetList := {}
   SAVE SCREEN
   @ 3, 0 GET C
   READ
    RESTORE SCREEN
   RETURN .T.
Apenas exemplos usando o sistema de GETS padrão.
Fora isso, pode criar o seu próprio.

Como usar IF...ENDIF nos comandos GET e SAY?

Enviado: 02 Jun 2015 10:25
por JoséQuintas
Um teste que fiz nos tempos do Clipper pra usar TABs.
Não cheguei a deixar pronto pra uso.
Talvez seja por aí, apenas pra exemplo.

Toda tela é um único GET, onde os GETS estão distribuídos pelas TABs, e pode ser usado o mouse pra "passear" pelas TABs durante o GET.
**O GET não se limita ao primeiro campo, tem um pouco em cada tab.
tabget.png
tabget.png (7.9 KiB) Exibido 2277 vezes
INKEY.zip
(322.56 KiB) Baixado 96 vezes

Como usar IF...ENDIF nos comandos GET e SAY?

Enviado: 02 Jun 2015 10:31
por JoséQuintas
O fonte do programa principal:

Código: Selecionar todos

#include "inkey.ch"
#include "tabget.ch"

procedure Main

readexit(.t.)
AltD(.t.)
Set( _SET_EVENTMASK, 159 ) // INKEY_ALL - INKEY_MOVE + HB_INKEY_GTEVENT )
set color to w/b, n/w,,,w/b
set scoreboard off
set status off
clear
lCancel := .f.
label0 = "MINHOCA"
text0  = "TATU"

TabBegin(5,5,20,70)
@ 0, 0 TABSAY Label0 "Teste"
@ 0, 10 TABGET Text0 "000002"

NewTab("Dados")
     @ 0, 0  TABSAY Label1 "Codigo"
     @ 0, 10 TABGET Text1  "000001" ;
        picture "@K 999999" valid Val(Text1)>0
     @ 1, 0  TABSAY Label2 "Nome"
     @ 1, 10 TABGET Text2 "NOMENOMENOME" ;
        picture "@!"
NewTab("Financeiro")
     @ 5, 10 TABSAY Label3 "Endereco"
     @ 5, 20 TABGET Text3 "ENDERECOENDERECO" picture "@!"
     @ 6, 10 TABSAY Label4 "Cidade"
     @ 6, 20 TABGET Text4 "CIDADECIDADE" picture "@!"
NewTab("Cobranca")
// @ 6, 20 TABCMD lCancel ;
//         CAPTION "&Cancel" ;
//        STATE { || OlaMundo() }
     @ 7, 10 TABSAY Label5 "UF"
     @ 7, 20 TABGET Text5 "SP" picture "@!A"
     @ 8, 10 TABSAY Label6 "CEP"
     @ 8, 20 TABGET Text6 "03676080" picture "@R 99999-999"
NewTab("Entrega")
   @ 5, 10 TABSAY Label7 "Codigo"
   @ 5, 20 TABGET Text7 "000005"
NewTab("Obs")
   @ 6, 10 TABSAY Label8 "minhoca"
   @ 6, 20 TABGET Text8 "tatu"
// NewTab()
//     @ 3, 10 TABMEMO Memo1 "teste"
TabEdit(.t.)
ReadTabs()

clear
? text0
? label0
? label6

function OlaMundo()
   @ 23, 0 say "Ola Mundo"
   inkey(0)
   Scroll(23,0,23,79,0)
return NIL

Como usar IF...ENDIF nos comandos GET e SAY?

Enviado: 02 Jun 2015 11:03
por JoséQuintas
Revi o texto.
Uma coisa mais simples para o seu caso: coloque o texto do SAY em uma varável e faça GET WHEN .F.

Código: Selecionar todos

// cTexto = 'pais"
cTexto := "Pais"
@ 1, 0 SAY "Codigo" GET nCodigo VALID ReturnValue( .T., cTexto := iif( nCodigo == 1, "Pais ", "Serie" ) )
// @ 2, 0 SAY cTexto WHEN .F.
@ 2, 0 GET cTexto WHEN .F.
//@ 2, Col() + 2 GET cTexto
@ 2, Col() + 2 GET cValue
READ

FUNCTION ReturnValue( xValue, a, b, c, d, e, f )
   RETURN xValue
Nota: postado 02/05, corrigido 16/07. Mantive a parte original errada com //