sábado, 22 de setembro de 2007

O poder da IntelliSense

Uma das grandes evoluções das linguagens de programação orientada a objeto foi o uso de Intellisense, fazendo com que os programadores digitem cada vez menos códigos, reduzindo o tempo gasto e erros de digitação.


















O Visual FoxPro possui recursos de Intellisense muito poderosos, onde você pode criar os seus próprios scripts, de acordo com a sua forma de trabalhar, com as suas próprias funções.



















Listar funções presentes no SET PROCEDURE


Como exemplo, eu criei um script de IntelliSense dinâmico, onde é listado todas as funções e parâmetros do seu aplicativo.

Agredecimentos aos colaboradores:
Thiago Takehana
Carlos Jr.
Fabiano Costa (post: Totalmente Intellisense)


Nota: O código só funciona para Procedures e Functions listadas em um Prg. Só são listados os parâmetros onde estes são definidos no formato:

PROC MinhaProc
LPARAMETER tcPara, tcPara2

PROC MinhaProc

PARAMETER tcPara, tcPara2



Para você criar este script, na Janela de Comando do Fox, digite o seguite código:

USE (_FOXCODE) ALIAS FOXCODE
SELE FOXCODE
APPEND BLANK
BROWSE


Com o cursor aberto no registro em branco, digite os campos com os seguintes valores:
TYPE = F
ABBREV = ZPROC
EXPANDED =
ZPROC
CMD = {}
CASE = C
SAVE = F
UNIQUEID = [coloque uma key que nunca tenha sido usada em outro script]


Agora, cole este código no campo DATA do cursor:

LPARAMETER oFoxCode
*ESTE SCRIPT RETORNA TODAS AS FUNÇÕES
*DOS PRGs QUE ESTÃO ASSOCIADOS AO SET PROCEDURE
*CRIADO POR PAULO HENRIQUE DE ALMEIDA (CASÃO), FOXBRASIL

LOCAL oFoxScript
IF NOT FILE(_CODESENSE)
RETURN ""
ENDIF
SET PROCEDURE TO (_CODESENSE) ADDITIVE
oFoxScript= CreateObject("FoxCodeScript")
=oFoxScript.Start(m.oFoxCode)

IF ATC(_CODESENSE,SET("PROC"))#0
RELEASE PROCEDURE (_CODESENSE)
ENDIF

LOCAL lcfxtoollib, lnWinHdl, laEnv, lcStr, lnLines, i, lcLine, lcDefDesc, laLines, lcLastWord, lcSaveStr
lcfxtoollib = SYS(2004)+"FOXTOOLS.FLL"
IF NOT FILE(lcfxtoollib)
RETURN .F.
ENDIF
SET LIBRARY TO (m.lcfxtoollib) ADDITIVE

lnWinHdl = _WONTOP()
_wselect(lnWinHdl)

DIMENSION laEnv[25]
_EdGetEnv(lnWinHdl ,@laEnv)
lcStr = _EDGETSTR(lnWinHdl , 0, laEnv[17])
lcSaveStr = lcStr
GetIncludeDefs(lcStr, oFoxScript.oFoxCode)

IF NOT EMPTY(oFoxScript.oFoxcode.Items[1])
DIMENSION laLines[1]
lnLines = ALINES(laLines,lcSaveStr )
lcLastWord = ALLTRIM(GETWORDNUM( laLines[ALEN(laLines)] , GETWORDCOUNT(laLines[ALEN(laLines)] )))
lcLastWord=LEFT(lcLastWord, LEN(lcLastWord) - LEN('ZPROC '))
oFoxScript.ReplaceWord(lcLastWord)

* POSICIONANDO NO ESPAÇO EXTRA
IF ASC(RIGHT(oFoxScript.oFoxCode.FullLine,1))=32
_EDSETPOS(lnWinHdl, _EDGETPOS(lnWinHdl) - 1)
ENDIF

oFoxScript.oFoxCode.ValueType = "L"
ENDIF

RETURN ""

PROCEDURE GetIncludeDefs(tcStr, toFoxCode)
LOCAL lcStr1, lnLines, i, lcLine, lcDefDesc, laLines, lnALen, lcDefWord, lcIncludeFile, lcStr2, lnLINATU, llTRAVADO, lcSETPROC,lcFILE

llTRAVADO=.F.

lnLINATU=0
IF EMPTY(tcStr)
RETURN ENDIF

IF EMPTY(SET("Procedure"))
RETURN ENDIF
lcStr1=''

lcSETPROC = ','+ALLTRIM(UPPER(SET("Procedure")))+','
lcSETPROC = STRTRAN(lcSETPROC,'.FXP','.PRG')
FOR i=1 TO OCCURS(',',lcSETPROC)
lcFILE = STREXTRACT(lcSETPROC,',',',' , i)
IF NOT FILE(lcFILE)
LOOP
ENDIF
lcStr1=lcStr1+FILETOSTR(lcFILE)+CHR(13)+CHR(10)
ENDFOR

IF EMPTY(lcStr1)
RETURN ENDIF

DIMENSION laLines[1]
lnLines = ALINES(laLines,lcStr1)

FOR i = 1 TO lnLines

lcLine = laLines[m.i]
lcLine = STRTRAN(lcLine,CHR(9),' ')
lcLine = ALLTRIM(lcLine)
IF UPPER(LEFT(lcLine,4))='DEFI'
llTRAVADO=.T.
ENDIF
IF UPPER(LEFT(lcLine,4))='ENDD'
llTRAVADO=.F.
ENDIF

IF llTRAVADO
LOOP

ENDIF

IF NOT ( UPPER(LEFT(lcLine,4)) $ "PROC,FUNC,PARA,LPAR" )
LOOP
ENDIF

IF UPPER(LEFT(lcLine,4)) $ "PROC,FUNC"
lnALen = ALEN(toFoxCode.Items,1)
IF NOT EMPTY(toFoxCode.Items[1])
DIMENSION toFoxCode.Items[lnALen+1,2]
lnALen = ALEN(toFoxCode.Items,1)

ENDIF
lcDefWord = GETWORDNUM(lcLine, 2)
toFoxCode.Items[lnALen, 1] = lcDefWord
lnLINATU=lnAlen
ENDIF

IF UPPER(LEFT(lcLine,4)) $ "PARA,LPAR" and lnLINATU>0
lcDefWord = STREXTRACT(lcLINE,' ','')
toFoxCode.Items[lnLINATU, 2] = lcDefWord
IF EMPTY(toFoxCode.Items[lnLINATU, 1])
toFoxCode.Items[lnLINATU, 1]='(VAZIO)'
ENDIF
ENDIF
ENDFOR
ENDPROC




Feito isto, agora é só digitar 'ZPROC(' em qualquer lugar que seu Fox vai exibir uma intellisense dinâmica das Procedures.


Espero que seja útil!

4 Comentários:

Às 24 de setembro de 2007 às 05:51 , Blogger Saulo Morais Lara disse...

Parabens pela postagem paulinho.
Uma dica. Depois vc poderia receber materiais de outros foxers tbm. q acha?
[]'s

 
Às 24 de setembro de 2007 às 05:55 , Anonymous Anônimo disse...

Ficou bom hein!!!
Vai virar uma referencia =D
parabens ...

Que isto ajude a varias pessoas...
menos eu que qro ficar sempre sempre com o meu .Net =P
Bjs...

 
Às 24 de setembro de 2007 às 12:55 , Anonymous Anônimo disse...

Grande sacada Paulinho!

Parabéns!

[]s
Cláudio Maesi

 
Às 25 de setembro de 2007 às 07:50 , Anonymous Anônimo disse...

Sensacional !
Sem dúvida, um ótimo script. Você inclusive poderia adicioná-lo à página de scropts de Intelisense no www.fox.wikis.com

Parabéns e obrigado pela iniciativa.
Seu blog é muito bemvindo !

Abraços

 

Postar um comentário

Assinar Postar comentários [Atom]

<< Página inicial