Prompt / MENUTO turbinado

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

evolver
Membro Master
Membro Master
Mensagens: 189
Registrado em: 28 Ago 2004 01:02
Localização: Cruz Alta - RS
Contato:

Prompt / MENUTO turbinado

Mensagem por evolver »

Bem segue aqui o código usado para gerar o prompt/menuto turbinado é uma versão antiga minha mas já dá pro pessoal brincar.

Código: Selecionar todos

********************************************************************************
*                                                                              *
*  PROMSYS.PRG  VERSAO 4.0                                                     *
*  NOVO SISTEMA CONTROLADOR DE MENUS DESENVOLVIDO GERAۂO CLIPPER              *
*                                                                              *
*  ALEM DAS MELHORIAS ANTERIORES FOI ADICIONADO UM PARSER PARA O CARACTER ^    *
*  QUE QUANDO COLOCADO DENTRO DO CAMPO DO PROMPT ELE FAZ COM QUE A PROXIMA     *
*  LETRA SEJA INTERPRETADA E DESTACADA DO RESTO DO CAMPO. O NOVO SISTEMA NAO   *
*  IMPEDE O USO PADRAO DO PROMPT DO CLIPPER ALEM DE MISTURAR ENTRE O PROMPT    *
*  PADRAO E O NOVO CONTROLE.                                                   *
*                                                                              *
********************************************************************************
#include "inkey.ch"
#include "set.ch"
#include "common.ch"

static Static1:= {}
static Static2:=""
static Static3:=""
static PRrow  := 0
static PRcol  := 0
static MPRrow := 0
static MPRcol := 0
static MExit  :=.f.

procedure __ATPROMPT(Arg1, Arg2, Arg3, Arg4)
Local Local1,Local2,Local3,Local4,Local5
if (Local1:=at("^",Arg3)) # 0
    Local2:=substr(Arg3,Local1+1,1)
    Arg3=strtran(Arg3,"^",,,1)
else
    Local2:=left(alltrim(Arg3),1)
endif
if Static2==""
    Local3:=setcolor()
    Static2:=Left(Local3,rat(",",Local3)-1)
    Static2:=Right(Static2,len(Static2)-rat(",",Static2))
    Static3:=Right(Local3,len(Local3)-rat(",",Local3))
endif
AAdd(Static1, {Arg1, Arg2, Arg3, Arg4, Local1, Local2})
@ Arg1, Arg2 say Arg3
if Local1 # 0
    @ Arg1, Arg2+Local1-1 say Local2 color Static2
endif
return

function __MENUTO(Arg1, Arg2)

local Local1 , Local2 , Local3 , Local4 , Local5 , Local6 , Local7
local Local8 , Local9 , Local10, Local11, Local12, Local13, Local14
local Local15, Local16, Local17, Local18, Local19, Local20, Local21
local Local22, Local23, Local24
Local13:= Static1
Local14:= Set(_SET_MESSAGE)
Local15:= Set(_SET_MCENTER)
Local16:= readvar(Upper(Arg2))
Static1:= {}
Local11:= errorblock({|_1| break(_1)})
Local21:=.t.
begin sequence
Local2:= eval(Arg1)
Local12:= .F.
recover
Local12:= .T.
end sequence
errorblock(Local11)
if (Local12)
    __qqpub(Arg2)
endif
if (ValType(Local2) != "N" .OR. Local2 < 1)
    Local2:= 1
endif
if (Local2 > Len(Local13))
    Local2:= Len(Local13)
endif
if (Set(_SET_INTENSITY))
    Local8:= setcursor(0)
endif
Local7:= .F.
Local6:= ""
Local9:= Local18:= Local19:= Local20:= 0
MPRrow:=-1
MPRcol:=-1
do while (Local2 != 0)
    Local1:= Local13[Local2]
    if (Set(_SET_INTENSITY))
        colorselec(1)
    endif
    @ Local1[1], Local1[2] say Local1[3]
    PRrow:=row()
    PRcol:=col()
    if Local1[5] # 0
        @ Local1[1], Local1[2]+Local1[5]-1 say Local1[6] color Static3
    endif
    if (Set(_SET_INTENSITY))
        colorselec(0)
    endif
    if (Local14 != 0)
        if (!Empty(Local6))
            @ Local14, Local9 say Space(Len(Local6))
        endif
        Local6:= Local1[4]
        if (ISBLOCK(Local6))
            Local6:= eval(Local6)
        elseif (ValType(Local6) == "U")
            Local6:= ""
        endif
        if (Local15)
            Local9:= Int((MaxCol() - Len(Local6)) / 2)
        endif
        @ Local14, Local9 say Local6
        SetPos(Local1[1], Local1[2])
    endif
    if (Local7)
        exit
    endif
    Local21:=.f.
    Local5:= 0
    do while (Local5 == 0)
        Local5:= InKey()
        if ((Local10:= SetKey(Local5)) != Nil)
            eval(Arg1, Local2)
            eval(Local10, procname(1), procline(1), Upper(Arg2))
            Local2:= eval(Arg1)
            Local5:= 0
        endif
    enddo
    if (Local2 > Len(Local13))
        Local2:= Len(Local13)
    endif
    do case
    case Local21
        Local24:=.f.
        for Local22 = 1 to len(Local13)
            if Local19=Local13[Local22,1]
                Local23:=Local13[Local22,2]+len(Local13[Local22,3])-1
                if Local20>=Local13[Local22,2] .and. Local20 <=Local23
                    Local2:=Local22
                    keyboard chr(K_ENTER)
                    Local24:=.t.
                    exit
                endif
            endif
        next
        if MExit
            if ! Local24
                MPRrow:=Local19
                MPRcol:=Local20
                Keyboard chr(K_ESC)
            endif
        endif
    case Local5 == K_UP .OR. Local5 == K_LEFT
        if (--Local2 < 1)
            Local2:= iif(Set(_SET_WRAP), Len(Local13), 1)
        endif
    case Local5 == K_DOWN .OR. Local5 == K_RIGHT
        if (++Local2 > Len(Local13))
            Local2:= iif(Set(_SET_WRAP), 1, Len(Local13))
        endif
    case Local5 == K_HOME
        Local2:= 1
    case Local5 == K_END
        Local2:= Len(Local13)
    case Local5 == K_PGUP
        Local7:= .T.
    case Local5 == K_PGDN
        Local7:= .T.
    case Local5 == K_ENTER
        Local7:= .T.
    case Local5 == K_ESC
        Local2:= 0
    otherwise
        Local4:= Upper(Chr(Local5))
        Local3:= ascan(Local13, {|_1| Local4 == Upper(_1[6])})
        if (Local3 != 0)
            Local2:= Local3
            Local7:= .T.
        endif
    endcase
    if (Local2 != 0)
        @ Local1[1], Local1[2] say Local1[3]
        if Local1[5] # 0
            @ Local1[1], Local1[2]+Local1[5]-1 say Local1[6] color Static2
        endif
    endif
enddo
setcursor(Local8)
eval(Arg1, Local2)
if (Local12)
    release (Arg2)
endif
if (!Empty(Local16))
    readvar(Local16)
endif
SetPos(MaxRow() - 1, 0)
Static2:=""
Static3:=""
return Local2

function PRrow()
return PRrow

function PRcol()
return PRcol

function MReturn(permissao)
if valtype(permissao)="L"
    if permissao
        MExit=.t.
        return Nil
    else
        MExit=.f.
        return Nil
    endif
else
    return {MPRrow,MPRcol}
endif
return Nil
Eu descompilei o prompt/menuto do clipper e alterei ele de modo a produzir as melhorias citadas em outro tópico. bom divertimento e não esqueçam meus 10cents,
Editado pela última vez por evolver em 24 Fev 2005 17:48, em um total de 1 vez.
Sergio "Evolver" Fagundes

CURVE-SE DIANTE DE MIM SER INSIGNIFICANTE, POIS EU SOU ROOT
Só respondo em PVT perguntas relativas ao que eu faço. Qualquer outra dúvida favor postar no fórum.
Peço aos veteranos que antes de responder a uma pergunta repetida dêem uma pesquisada e instruam a quem perguntou a fazer o mesmo.
Responder