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)
ERRO-01.jpg
ERRO-02.jpg

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. :))