Página 1 de 1
Achoice() no Xharbour: "Erro de Limite: acesso de array"
Enviado: 08 Mar 2017 15:56
por lugab
Olá, pessoal...
Ao usar a função Achoice() no Xharbour, em vez de fazer o esperado que é "seta pra cima" ou "seta pra baixo", o usuário (claro) usou "seta pra esquerda" e "seta pra direita" e aí deu o erro: "Erro de Limite: acesso de array"
Como impedir isso, evitar q ele use as setas erradas ou simplesmente: como evitar a ocorrência desse erro ?
Grato
Código: Selecionar todos
Public nPrn:= 1
Public aPrn:= GetPrinters()
nPrn:=ACHOICE(12,11,16,69, aPrn,.T.,,nPrn)
Achoice() no Xharbour: "Erro de Limite: acesso de array"
Enviado: 08 Mar 2017 16:45
por Daniel
Voce pode usar uma função para isso
Código: Selecionar todos
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
ENDCASE
RETURN
FUNCTION cUserFunction( nMode, nCurElement, nRowPos )
LOCAL nRetVal := AC_CONT // Default, Continue
LOCAL nKey := LASTKEY()
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
ENDCASE
ENDCASE
RETURN nRetVal
Achoice() no Xharbour: "Erro de Limite: acesso de array"
Enviado: 08 Mar 2017 17:36
por lugab
Legal, Daniel. gostei de saber disso, mas a questão que trato nesse post é outra...
O Achoice() está preparado pra receber <esc>,<enter> ,<seta abaixo> e <seta acima> porém, as vezes, os usuários usam <seta a direita"> e <seta a esquerda> e isso está provocando o erro citado acima e cancelamento do programa...
O que eu quero é prever e evitar esse cancelamento qdo o usuário teclar errado de novo, entendeu

Achoice() no Xharbour: "Erro de Limite: acesso de array"
Enviado: 08 Mar 2017 18:26
por JoséQuintas
Provavelmente é o ESC.
Esqueceu de tratar quando o usuário quer abandonar a impressão e tecla ESC.
Retorna com zero, e não dá pra selecionar nenhuma impressora.
Achoice() no Xharbour: "Erro de Limite: acesso de array"
Enviado: 08 Mar 2017 18:52
por lugab
Não, Quintas, o <esc> ta funcionando.
É quando eles teclam <seta direita> ou <seta esquerda> que da o erro
Achoice() no Xharbour: "Erro de Limite: acesso de array"
Enviado: 08 Mar 2017 19:51
por JoséQuintas
Crie sua própria rotina pra isso, crie uma rotina intermediária, ou desative as teclas.
Por exemplo:
Código: Selecionar todos
FUNCTION MyAchoice( ... )
LOCAL xReturn
SetasOn()
xReturn := Achoice( ... )
SetasOff()
RETURN xReturn
FUNCTION SetasOn()
SET KEY K_RIGHT TO DisableKey
SET KEY K_LEFT TO DisableKey
RETURN NIL
FUNCTION SetaOff()
SET KEY K_RIGHT TO
SET KEY K_LEFT TO
RETURN NIL
FUNCTION DisableKey()
KEYBOARD Chr(255)
Inkey(0)
RETURN NIL
Nota: No Harbour, usar "..." pra especificar parâmetros é válido.
Achoice() no Xharbour: "Erro de Limite: acesso de array"
Enviado: 08 Mar 2017 20:11
por ANDRIL
Olá! Tenta assim:
Código: Selecionar todos
nPrn:=ACHOICE(12,11,16,69, aPrn,.T.,"MYACHOICEUDF",nPrn)
Código: Selecionar todos
function MYACHOICEUDF()
PARAMETERS modo, num_sel, posicao
if lastkey()=13
return 1
elseif lastkey()=27
return 0
elseif modo=1 .or. modo=2
tone(1000,1)
return 2
else
return 2
endif
Achoice() no Xharbour: "Erro de Limite: acesso de array"
Enviado: 09 Mar 2017 00:46
por lugab
Caramba, que fartura...
As dicas do Quiintas e do Andril funcionaram uma belezura...
Obrigado aos dois e ao Daniel também.

)