Página 1 de 1

Função alert que funcione em win 2000 2 nos outros tb

Enviado: 20 Dez 2005 09:48
por Paulao
Pessoal estou tendo problemas com a funcao alert() do clipper que em computadores com win 2000, xp tb acredito, aparece no rodape da tela (não no meio), penso que é pq o 2000 é 50 linhas, alguem ja modificou a funcão alert para nã dar este problema

Grande abraço

Enviado: 20 Dez 2005 10:06
por Daniel
Paulao eu uso esta.

Código: Selecionar todos

#Include "inkey.ch"
*******************************************************************
FUNCTION Alert1( cMessage, aChoices, nTopRow, cColor, lBell, nTime )
*******************************************************************
LOCAL;
n,;
nCol,;
nRow,;
cScreen,;
nPromLeft,;
nBoxLeft,;
nBoxRight,;
nMsgLen,;
nBoxLen    := 0,;
nPromLen   := 0,;
cOldColor  := SETCOLOR(),;
cOldWrap   := SET( 35, "ON" ),;
lOldCenter := SET( 37, .F. ),;
lOldBlink  := SETBLINK(.F.),;
aMessage   := {},;
bPgUp      := SETKEY(K_PGUP, {||NIL} ),;
bPgDn      := SETKEY(K_PGDN, {||NIL} ),;
nChoice    := 0,;
lVertical  := (.F.),;
nBoxWidth  := 0,;
nMaxBottom,;
cCur

IF aChoices==NIL
   // force "OK" if no choices are passed
   aChoices:={}
   AADD(aChoices,IF(nTime==NIL,"OK","<Esc>"))
END

// set length of prompt line
AEVAL( aChoices, {|aArray| nPromLen += LEN(aArray)+2 })

// load message array
WHILE ";" $ cMessage
   // test for multiple line message
   AADD(aMessage, SUBSTR(cMessage,1,AT(";",cMessage)-1 ) )
   cMessage := STUFF(cMessage,1,AT(";",cMessage), "" )
END
IF "" != cMessage
   // add remaining message string to array
   AADD(aMessage,cMessage)
END
nMsgLen := LEN(aMessage)

// determine box length based on largest message line
AEVAL( aMessage, {|aArray| nBoxLen := MAX(nBoxLen,LEN(aArray)+4) })

nPromLen  += ( (LEN(aChoices)+1) * 2 )
cColor    := IIF( ISCOLOR(), IIF( cColor == NIL,"W+/R+,N/W",cColor),"N/W,W+/N")
lBell     := IIF( lBell == NIL, .F., lBell )
nTopRow   := IIF( nTopRow == NIL, 10, nTopRow )

// test for the larger of box length vs. length of prompt line
nBoxWidth := IIF( nBoxLen > nPromLen, nBoxLen, nPromLen + 4 )
lVertical := ( MAXCOL() - nBoxWidth ) / 2 < 0

IF lVertical
   nBoxWidth:=nBoxLen
   AEVAL( aChoices, {|aArray| nBoxWidth := MAX( nBoxWidth,LEN(aArray)) })
   nBoxLeft  := ( MAXCOL() - nBoxWidth ) / 2
   nBoxRight := nBoxLeft + nBoxWidth + 2
   nPromLeft := nBoxLeft
ELSE
   nBoxLeft  := ( MAXCOL() - nBoxWidth ) / 2
   nBoxRight := nBoxLeft + nBoxWidth
   nPromLeft := ( ( MAXCOL()-nPromLen ) / 2)
END

// save the original screen
DISPBEGIN()

SETCOLOR( cColor )
// display Alert box

nMaxBottom := nTopRow+nMsgLen+IF(lVertical,LEN(aChoices)+1,2)+1
IF nMaxBottom > MAXROW()-1
   nTopRow -= nMaxBottom - MAXROW()
   nMaxBottom := MAXROW()
END

cScreen:=SAVESCREEN(nTopRow, nBoxLeft, nMaxBottom, nBoxRight+1)
@ nTopRow, nBoxLeft, nMaxBottom, nBoxRight+1 BOX "ÚÄ¿³ÙÄÀ³ "

FOR n:=1 TO nMsgLen
   @ nTopRow+n,nBoxLeft+1 SAY PADC( aMessage[n], nBoxWidth, SPACE(1) )
NEXT

nCol       := nPromLeft + IF(lVertical,1,3 )
cOldWrap   := SET( 35, "ON" )
lOldCenter := SET( 37, .F. )

// Display the prompt line
nRow:=ROW()+2
FOR n:=1 TO LEN( aChoices )
   IF lVertical
      IF nTime==NIL
         @ nRow+n-1, nCol PROMPT SPACE(1)+aChoices[n]+SPACE(1)
      ELSE
         @ nRow+n-1, nCol SAY SPACE(1)+aChoices[n]+SPACE(1)
      END
   ELSE
      IF nTime==NIL
         @ nRow, nCol PROMPT SPACE(1)+aChoices[n]+SPACE(1)
      ELSE
         @ nRow, nCol SAY SPACE(1)+aChoices[n]+SPACE(1)
      END
      nCol += LEN(aChoices[n])+4
   END
NEXT
DISPEND()

IF lBell
   // sound bell
   TONE(499,2)
   TONE(299,1)
ENDIF
IF nTime == NIL
   MENU TO nChoice
ELSE
   nCur:=SETCURSOR(0)
   INKEY( nTime )
   //KEYBOARD CHR(K_ESC)
   //MENU TO nChoice
   SETCURSOR(nCur)
   *ClearBuffer()
END
// restore some settings here
SET( 35, cOldWrap )
SET( 37, lOldCenter )
SETBLINK( lOldBlink )
RESTSCREEN(nTopRow, nBoxLeft, nMaxBottom, nBoxRight+1,cScreen)
SETCOLOR( cOldColor )
SETKEY(K_PGUP, bPgUp )
SETKEY(K_PGDN, bPgDn )

RETURN IF( (LASTKEY()=K_ESC.OR.LASTKEY()=K_PGUP.OR.LASTKEY()=K_PGDN),0,nChoice)


Enviado: 20 Dez 2005 15:23
por janio
Tem essa outra também!

Código: Selecionar todos

******************************************************** 
*ALERTA("Texto Centralizado na Linha Escolhida !",05)
*ALERTA("Um Texto Menor !",10)
*ALERTA(" Data Atual.: "+ DTOC(DATE()) + " ",12)
*ALERTA(" Final da fun‡„o ! ",12)

FUNCTION ALERTA
   PARAMETERS TEXTO,LIN
   SAVE SCREEN TO TELANT2
   CORANT=SETCOLOR()
   CURSTAT=SETCURSOR()
   SETCURSOR(0)
   SET CURSOR OFF
   IF LEN(TEXTO) < 14
      TAMMOLD = 16
   ELSE
      TAMMOLD = LEN(TEXTO)+2
   ENDIF
   IF LIN > 22
      LIN = 22
   ENDIF
   SET COLOR TO
   @LIN+1, ((80-LEN(TEXTO))/2) CLEAR TO LIN+3, (((80-LEN(TEXTO))/2)+TAMMOLD+1)
   SETCOLOR("W+/R")
   @LIN,(((80-LEN(TEXTO))/2)-1) CLEAR TO LIN+2, ((((80-LEN(TEXTO))/2)-1)+TAMMOLD+1)
   @LIN,(((80-LEN(TEXTO))/2)-1) TO LIN+2, ((((80-LEN(TEXTO))/2)-1)+TAMMOLD+1) //DOUBLE
*   SETCOLOR("W*+/R")
   SETCOLOR("W+/R")
   @LIN+1,(((80-LEN(TEXTO))/2)+1) SAY TEXTO
   INKEY(05)
   RESTORE SCREEN FROM TELANT2
   SETCOLOR(CORANT)
   SET CURSOR ON
   SETCURSOR(CURSTAT)
   RETURN NIL

RETURN NIL
Janio

Enviado: 21 Dez 2005 21:08
por Stanis Luksys
Isso acontece alguma vezes (nao sei se é o seu caso) por que foi definido o SET MESSAGE TO 23
...

Alias se você não usa mensagens coloca uma outra linha, por que o padrão é 23 mesmo...

No meu programa tinha isso e eu mudei pra 10 e funcionou normal o alert...

Mas nunca se sabe, XP é XP né ??

Enviado: 22 Dez 2005 11:34
por Hasse
Eu uso a função ALERT em WIN 95, WIN 98 e XP e nunca tive
qualquer problema do tipo relatado.

Eu não uso SET MESSAGE TO..., então é provável que o
problema resida alí.

Hasse.

Enviado: 23 Dez 2005 08:38
por vagucs
A rotina alert se centraliza na tela de acordo com as coordenadas, se nao estiver usando toda a área visível da tela e vc estiver com o modo 50 linhas, use o comando MODE 80,25 para usar o padrão normal.