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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 1298
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