Como interromper o achoice quando delete for pressionado

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

rangelssilva
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 27 Jul 2007 15:24
Localização: São Paulo - SP

Como interromper o achoice quando delete for pressionado

Mensagem por rangelssilva »

Bom Dia, Amigos Clipeiros....


Programao em clipper a um certo tempo , mas ultimamente ao executar um achoice obtive o seguinte

problema....

Tenho um achoice abaixo que mostra um popup com o codigo , nome e e-mail de clientes.... Até ai

tudo normal....


Do while lastkey()<>27
Registro=achoice(5,7,23,79,clientes,lastkey()<>27,1,ULTPOS)

if lastkey()=7 //delete


comandos....

endif



Enddo




Tenho o seguinte problema no código acima, quando o lastkey()=7

ele não sai do achoice e parece que nenhuma tecla foi pressionada....
se eu substituir com lastkey()=13 (Enter) , o clipper executa normalmente,,,...

O problema é que preciso que este evento seja executado quando o delete é pressionado....

Teve mais um detalhe que descobri.. qu eo lastkey funciona somente para estados de espera com

wait, read, get, inkey.....

Alguem poderia me ajudar a resolver o problema acima...

Obrigado programadores...
:'(
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Teve mais um detalhe que descobri.. qu eo lastkey funciona somente para estados de espera com
A função LastKey() retorna o código da última tecla processada pela função InKey().

Nunca usei AChoice na vida toda. :)
Portanto, vou dar um "chute". O teste abaixo não daria certo?

Código: Selecionar todos

while LastKey() != 27 .and.;
      LastKey() !=  7
   Registro := AChoice(5,7,23,79                           ,;
                       clientes                            ,;
                       LastKey() != 27 .and. LastKey() != 7,;
                       1                                   ,;
                       ULTPOS)

   if LastKey() = 7 //delete 
      comandos.... 
   end
end
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

- O achoice permite a vc colocar uma função de usuário.

Do NG:

ACHOICE(<nTop>, <nLeft>, <nBottom>, <nRight>,
<acMenuItems>,
[<alSelectableItems> | <lSelectableItems>],
[<cUserFunction>],
[<nInitialItem>],
[<nWindowRow>]) --> nPosition

#include "achoice.ch"
#include "inkey.ch"

PROCEDURE Main()

LOCAL acMenuItems, cUserFunction, nRetVal, nKey, nPos

acMenuItems := {"Add", "Edit", "Delete", "Update"}

CLS

nPos := ACHOICE( 10, 10, 13, 15, acMenuItems, .T., "cUserFunction" )
DO CASE
CASE nPos == 1
// Put ADD routine here
CASE nPos == 2
// Put EDIT routine here
CASE nPos == 3
// Put DELETE routine here
CASE nPos ==4
// Put UPDATE routine here
END

RETURN


FUNCTION cUserFunction( nMode, nCurElement, nRowPos )
LOCAL nRetVal := AC_CONT // Default, Continue
LOCAL nKey := LASTKEY()

DO CASE
// After all pending keys are processed, display message
CASE nMode == AC_IDLE
DO CASE
CASE nCurElement == 1
@ 22, 5 SAY " Adding "
CASE nCurElement == 2
@ 22, 5 SAY " Editing "
CASE nCurElement == 3
@ 22, 5 SAY " Deleting "
CASE nCurElement == 4
@ 22, 5 SAY " Updating "
END

nRetVal := AC_CONT // Continue ACHOICE()

CASE nMode == AC_HITTOP // Attempt to go past Top
TONE( 100, 3 )
CASE nMode == AC_HITBOTTOM // Attempt to go past
// Bottom
TONE( 100, 3 )

CASE nMode == AC_EXCEPT // Key Exception
DO CASE
CASE nKey == K_RETURN // If RETURN key, select
nRetVal := AC_SELECT
CASE nKey == K_ESC // If ESCAPE key, abort
nRetVal := AC_ABORT
OTHERWISE
nRetVal := AC_GOTO // Otherwise, go to item
END
END

RETURN(nRetVal)
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

Mensagem por ANDRIL »

Ola pessoal,
Do while lastkey()<>27
Registro=achoice(5,7,23,79,clientes,lastkey()<>27,1,ULTPOS)

if lastkey()=7 //delete


comandos....

endif
talvez vc tenha q criar uma funcao para realizar o que deseja.

a sintexe desse achoice parece nao estar certa, veja


FUNCTION contro1_udf
PARAMETERS modo, num_sel, posicao
do case
case lastkey()=13.or.lastkey()=7
return 1

case lastkey()=27
return 0

otherwise
return 2
endcase

seu codigo ficaria assim:

do while lastkey()<>27
registro=ACHOICE(5,7,23,79,clientes,"","contro1_udf",ULTPOS,"")

if lastkey()=7
//--codigo p exclusao
endif
enddo
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
rangelssilva
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 27 Jul 2007 15:24
Localização: São Paulo - SP

Obrigado pela dica.....

Mensagem por rangelssilva »

Tentei executar dessa forma mas não funcionou, mas ao executar da maneira que o Andril colocou , funcionou perfeitamente....


Obrigado por ajudar....
:))
rangelssilva
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 27 Jul 2007 15:24
Localização: São Paulo - SP

Obrigado pela dica...

Mensagem por rangelssilva »

Tentei executar dessa forma mas não funcionou, mas ao seguir as dicas do Andrill funcionou....

Vou continuar a programar usando achoice....
:))
rangelssilva
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 27 Jul 2007 15:24
Localização: São Paulo - SP

Mensagem por rangelssilva »

Obrigado pela ajuda amigos clipeiros.....

Utilizei as linha de raciocínio postada pelo Andril e funcionou perfeitamente....

Agora está 10.....
:))
Responder