Achoice() no Xharbour: "Erro de Limite: acesso de array"

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Achoice() no Xharbour: "Erro de Limite: acesso de array"

Mensagem 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
lugab
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

Achoice() no Xharbour: "Erro de Limite: acesso de array"

Mensagem 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
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Achoice() no Xharbour: "Erro de Limite: acesso de array"

Mensagem 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 ?:
lugab
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Achoice() no Xharbour: "Erro de Limite: acesso de array"

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Achoice() no Xharbour: "Erro de Limite: acesso de array"

Mensagem por lugab »

Não, Quintas, o <esc> ta funcionando.

É quando eles teclam <seta direita> ou <seta esquerda> que da o erro
lugab
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Achoice() no Xharbour: "Erro de Limite: acesso de array"

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1309
Registrado em: 06 Jul 2004 00:44
Contato:

Achoice() no Xharbour: "Erro de Limite: acesso de array"

Mensagem 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
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Achoice() no Xharbour: "Erro de Limite: acesso de array"

Mensagem por lugab »

Caramba, que fartura...

As dicas do Quiintas e do Andril funcionaram uma belezura...

Obrigado aos dois e ao Daniel também. :))
lugab
Responder