Página 1 de 1

Erro no Achoice

Enviado: 22 Jun 2016 17:37
por tonicm
Ao apagar a última linha de um array dá-me o seguinte erro:
Error BASE/1132 Bound error: array access

Já baixei o achoice.prg e fiz debug, e na parte do SWITCH nUserFunc o programa entra sempre na opção AC_REDRAW, seja qual for o valor de nUserFunc.
https://github.com/harbour/core/blob/ma ... choice.prg

Tenho a versão hb34 e já testei no windows XP e no 10.
Anexo um pequeno exemplo.
Alguém consegue testar?

Código: Selecionar todos

/*-------------------------------------*/
PROCEDURE MAIN()
   PUBLIC ARRCNT:=2
   PUBLIC SHOW:={"FIRST","SECOND"}
   
   CLEAR
   SET COLOR TO "W+"
   DO WHILE LastKey()<>13 .AND. LastKey()<>27
      AChoice(0,0,24,79,SHOW,,"choiven",ARRCNT)
   ENDDO
   QUIT
RETURN


/*-------------------------------------*/
FUNCTION choiven(choimod,choipos,choilin)
   PRIVATE OLDROW, OLDCOL, RETORN
   RETORN=2
   IF choimod=3
      OLDROW=Row()
      OLDCOL=Col()
      IF LastKey()=27
         RETORN=0
      ENDIF
      IF LastKey()=7
         IF Len(SHOW)=1
            @ 24, 0 SAY "Only one line. Cannot delete."
            Inkey(1)
            @ 24, 0 SAY Space(80) COLOR "N/N"
         ELSE
            IF CHOIPOS=1
               CLEAR
            ENDIF
            ADel(SHOW,CHOIPOS)
            ASize(SHOW,Len(SHOW)-1)
            CHOIPOS--
            ARRCNT--
         ENDIF
         SETLASTKEY(0)
         RETORN=0
         //RETORN=2  //não refresca o ecrã
      ENDIF
      SetPRC(OLDROW,OLDCOL)
   ENDIF
RETURN RETORN

Erro no Achoice

Enviado: 23 Jun 2016 08:21
por asimoes
Olá

tenta usar:

Código: Selecionar todos

IF Len(show) > 0
   hb_ADel( show, choicepos, .T. )
ELSE
   keyboard chr(27)
   RETURN 0
ENDIF
comenta ASize(SHOW,Len(SHOW)-1)

Erro no Achoice

Enviado: 23 Jun 2016 09:23
por JoséQuintas
Tente alterar a variável de posicionamento pra variável -1

Erro no Achoice

Enviado: 23 Jun 2016 10:17
por tonicm
Obrigado pelas sugestões, mas não resolveram o erro.

Erro no Achoice

Enviado: 23 Jun 2016 10:21
por JoséQuintas
Então é obrigar a sair do achoice e remontar com o array modificado.
Tudo indica que o achoice continua trabalhando com o tamanho de array original.

Erro no Achoice

Enviado: 23 Jun 2016 12:37
por Daniel
Tente assim

Código: Selecionar todos

/*-------------------------------------*/
#Include 'Achoice.ch'   //<------------Incluir
PROCEDURE MAIN()
   PUBLIC ARRCNT:= 3
   PUBLIC SHOW:= {"FIRST","SECOND","TRE"}

   CLEAR
   SET COLOR TO "W+"
   DO WHILE LastKey()<>13 .AND. LastKey()<>27
      AChoice(0,0,24,79,SHOW,,"choiven",ARRCNT)
   ENDDO
   QUIT
RETURN

/*-------------------------------------*/
FUNCTION choiven(choimod,choipos,choilin)
   PRIVATE OLDROW, OLDCOL, RETORN,  acItems
   RETORN=2
   IF choimod=3
      OLDROW=Row()
      OLDCOL=Col()
      IF LastKey()=27
         RETORN=0
      ENDIF
      IF LastKey()=7
         IF Len(SHOW)=1
            @ 24, 0 SAY "Only one line. Cannot delete."
            Inkey(1)
            @ 24, 0 SAY Space(80) COLOR "N/N"
         ELSE
            //IF CHOIPOS = 1  <-------------Tirar
               CLEAR
            //ENDIF    <-------------Tirar
            ADel(SHOW,CHOIPOS)
            ASize(SHOW,Len(SHOW)-1)
            CHOIPOS--
            ARRCNT--
            RETURN AC_GOTO   // <--------------Incluir
         ENDIF
         SETLASTKEY(0)
         //RETORN=2  //não refresca o ecrã
      ENDIF
      SetPRC(OLDROW,OLDCOL)
   ENDIF