Preciso da ajuda de vocês com um erro de array, que não consegui entender. O erro é:
Código: Selecionar todos
Error BASE/1132 Erro de limite: acesso de array.Como peguei essa função de alguém, e não a entendo bem, já que não sei lidar bem com vetor, não consigo saber a origem do erro.
Minha função está assim (o erro está dando na primeira linha da função implist8, abaixo):
Código: Selecionar todos
function imprlist
do while .t.
clear
set devi to screen
tmax=300
nprn=0
aPrn := Win_PrinterList( .t., .f. )
aPNomes := {}
escimpr()
do case
case nprn=len(aprn)+1
@ 15,5 say "Será salvo o arquivo LISTCOM.TXT na pasta CRIANCAS do"
@ 16,5 say "teu computador; abra-o no Bloco de Notas e imprima."
tone(261.7,3)
inkey(1)
wait ""
inkey(5)
set device to print
set printer to listcom.txt
set device to screen
case nprn=len(aprn)+2
confnimpr="N"
clear
@ 5,5 say "Tem certeza que não vai imprimir a lista?"get confnimpr pict "@!"
tone(261.7,3)
wait ""
read
if confnimpr#"S"
loop
else
exit
endif
otherwise
cls
@ 5,5 say "Confira se a impressora está ligada e com papel rascunho; o programa"
@ 7,5 say "irá imprimir diretamente; tecle ENTER quando estiver pronta."
tone(261.7,3)
wait ""
cInicio := "substr(texto,1,72)" // "substr(produto,1,50) + space(3) + alltrim(str(prmaximo)) + space(1) + substr(unidade,1,16)"
cCampos := "substr(texto,73,72)" //"substr(produto,51,50) + space(3) + substr(unidade,17,20)" // "DTOC(data) + Space(2) + hora + Space(2) + tarefa"
cFinal := "substr(texto,145)"
cCriterio := "Recno() >= nrc"
if alias()#"LISTCOM"
usebase("listcom")
endif
Go nrc // apenas para esse exemplo
implist8() // ( cCampos, cCriterio )
endcase
clear
confimpr="N"
@ 15,5 say "Atenção: só é pra confirmar depois de terminar de imprimir"
inkey(3)
@ 5,5 say "Imprimiu a lista?"get confimpr pict "@!"
inkey(5)
read
if confimpr="S"
exit
endif
enddo
return
function escimpr
Local i, oPrn, nMaxLen := 0
If Empty( aPrn )
Hb_Alert( "Nenhuma impressora Instalada" )
Return Nil
Endif
For i=1 To Len( aPrn )
AaDd( aPNomes , aPrn[i,1] )
nMaxLen := If( Len( aPrn[i,1] ) > nMaxLen, Len( aPrn[i,1] ), nMaxLen )
Next
if upper(procname(1))="IMPRLIST"
AaDd ( aPNomes , "Imprimir manualmente" )
AaDd ( aPNomes , "Não imprimir" )
endif
Clear Screen
nPrn := AChoice( 3, 5, 13, 65, aPNomes, .T., Nil , aPNomes )
If nPrn = 0
Return Nil
Endi
return
FUNCTION Implist8
oPrn:=Win_Prn():new( aPNomes[nPrn] )
If !oPrn :Create()
Hb_alert("Nao foi criado o documento de Impressao")
Return nil
ElseIf !oPrn :StartDoc("Imprimindo Documento")
Hb_alert("Erro na Impressora")
Return nil
EndIf
oPrn:SetFont('Times New',16, 0,.F.,.T.,.F.)
nlnh=1
nrpg=1
oPrn:NewLine()
While &cCriterio. .And. !Eof()
nlnh++
oPrn:NewLine()
oPrn:NewLine()
oPrn:TextOut(&cInicio. )
oPrn:SetFont('Times New',16, 0,.F.,.F.,.F.)
if !empty(&cCampos)
nlnh++
oPrn:NewLine()
oPrn:NewLine()
if at(" ",&cCampos)=1
oPrn:TextOut(" "+&cCampos. )
else
oPrn:TextOut(" "+&cCampos. )
endif
endif
if !empty(&cFinal)
nlnh++
oPrn:NewLine()
oPrn:NewLine()
if at(" ",&cFinal)=1
oPrn:TextOut(" "+&cFinal. )
else
oPrn:TextOut(" "+&cFinal. )
endif
endif
If nlnh>28
nlnh=0
oPrn:NewLine()
oPrn:NewLine()
oPrn:NewLine()
oPrn:TextOut(" Página "+alltrim(str(nrpg)))
oPrn:NewLine()
nrpg++
oPrn:NewPage()
Endi
Skip
Endd
if nrpg>0
do while nlnh<27
oPrn:NewLine()
nlnh++
enddo
oPrn:NewLine()
oPrn:NewLine()
oPrn:TextOut(" Página "+alltrim(str(nrpg)))
endif
oPrn:EndDoc()
oPrn:Destroy()
Return Nil
por Rochinha: Trecho de codigo foi re-identado para melhor leitura do codigo. Os espaços entre linhas continam os mesmos.



