Editor de Codigo con syntaxis coloreada interperte y texto i

Editor de Codigo con syntaxis coloreada interperte y texto i

Postby Vladimir Zorrilla » Wed Jun 18, 2008 10:29 pm

Estimados Amigos se puede hacer con fw un editor con texto inteligente
interprete y syntaxis coloreada .

Estoy desarrollandolo pero tengo los siguientes problemas

- El backspace no borra

- El scroll horizontal no funciona

- El pintado de el texto en verde e comentario cuando se hace pagina arriba abajo pinta todo


Me gustaria que el interprete fuera el de xharbour no tengo ni idea
de como enlazarlo aqui

- Como le pongo el texto inteligente que me permita mostrar un tooltip
con


El editor es una funcion

ScriptEdit(cFileName,UNO,DOS)

He aqui el codigo




#include "FiveWin.ch"

/// VISUAL EDITOR E INTERPRETE DE CODIGO
/* LIMITACIONES DEL INTERPRETE
- NO SOPORTA LOOP
- NO SOPORTA Local tc:=gsbus(_VG("PRO_2140"),'CAM'+xcod(),2) SE CONFUNDE SACA 3 VARIABLES


- NO SOPORTA SEPARADOR ; EN LINEAS
- NO FUNCIONA EL HSCROLL

- LOS ENDIF TIENE QUE ESTAR ESCRITOS COMPLETOS O SIN O SE CONFUNDEN CON ENDD
- NO SOPORTA COMANDOS DEBEN ESTAR PREPROCESADOS excperto los de flujo

IF
ELSE
ENDIF
IF ANIDADOS

DO CASE
CASE
OTHERWISE
ENDDO

WHILE

ENDDO

WHILE ANIDADOS

FOR I=1 TO 20

NEXT I

- TAMPOCO FUNCIONA CORTAR COPIAR PEGAR
- LAS VARIABLES STATIC

- CUANDO SE DECLARA VARIABLES Y SE LE ASIGNA
FUNCIONES CON SEPARADORES DE ,FALLA
Local factor:=DAMEFACTO(VZ("A->FCH_PRELIQ"),mon)

HOLA := NO ATRACA DEBE ESTRA JUNTO HOLA:=NO
LAS FUNCINOES NO PUEDEN DEVOLVER NADA NI SE LEES ASIGNA NADA TAMPOCO
no se puede declrar el mismo nombre de variable en dos funcinoes urge
cambiar la forma de manehar las var no pueden ser publicas debe
*/
/// ESTA MEJOR QUE EL TXTTEDIT DESCARTADO POR NO TENER VSCROLL
// Y NO PUEDO MODIFICAR EL PINTADO DE LINEAS

#define RELEASE_VER "Version 1.0"
#define EXE_VER "Editor "

REQUEST DBFNTX //,COMIX
REQUEST dbSelectArea, dbUseArea, dbCloseArea, dbSetIndex, dbAppend, __dbPack,;
__dbZap, dbunlock, dbunlockall, dbcommitAll, dbGoto, dbGotop, dbGoBottom,;
dbSkip, dbSeek, __dbContinue, __dbLocate, dbClearFilter,;
dbSetFilter, dbDelete, dbRecall, __dbCreate, __dbCopyXStruct, ;
__dbCopyStruct, __dbDelim, __dbSDF, __dbCopy, __dbApp, __dbSort,;
__dbTotal, __dbUpdate, __dbJoin, DbEval, __dblist, dbCloseAll, Set,;
dbClearIndex, ordCondset, ordcreate, dbCreateIndex, ordDestroy,;
ordlistrebuild, ordlistclear, ordlistadd, ordsetfocus, fieldput,;
fieldget, __SetCentury, Alert, Lfn2Sfn, Sfn2Lfn

REQUEST descend,alltrim,strtran,transform,padr,padl,padc
REQUEST IsAlpha, IsDigit, IsLower, IsUpper
REQUEST left, rat, right
REQUEST cursorarrow, cursorwait
REQUEST TDatabase
REQUEST SndPlaysound, nSerialHD

MEMVAR odlge
STATIC oSub1,oSub2
STATIC oDlg, oMemo, oMru, oChg, cText, cFile,eltexto,v150000,aUserFunc,aFuncLin,oUserCBX,;
lChanged, lNeedCmp, lPreProc, cIncPath,cUNO,cDOS,aVariables,aValores,Trace,Textacum,lNoCortar,tempo,UNASOLAVEZ,esunasolavez

//----------------------------------------------------------------------------//

FUNCTION ScriptEdit(cFileName,UNO,DOS)

LOCAL oFont, oIcon, oRow, oCol, odlgeFont,cIniFile,eFont
PUBLIC odlge
cUNO :=UNO
cDOS :=DOS
cFile := cFileName
cText := "" //MemoRead(cFile)
cIncPath := GetEnv("INCLUDE")
lchanged := .f.
lNeedCmp := .t.
lPreProc := .f.
v150000:=10
cIniFile := TakeOffExt(GetModuleFileName(GetInstance()))+".ini"
esunasolavez:=.T.

DEFINE FONT eFont NAME GetSysFont() SIZE 0,-12
DEFINE FONT oFont NAME "Fixedsys" SIZE 0,-10 //-18
//DEFINE FONT oFont NAME "Tahoma" SIZE 0,-12 //-18
DEFINE WINDOW odlge FROM 20,0 TO 27,80 ;
TITLE EXE_VER ;
MENU SetMenu(cIniFile)

SET MESSAGE OF odlge TO EXE_VER+ " "+RELEASE_VER + " Interprete de codigo " ;
FONT eFont

DEFINE MSGITEM oRow OF odlge:oMsgBar PROMPT "Row: 0" SIZE 70 ACTION oMemo:DlgGoLine()

DEFINE MSGITEM oCol OF odlge:oMsgBar PROMPT "Col: 0" SIZE 70

oMemo = TTxtEdit():New( 0, 0, 0, 0, odlge )
oMemo:SetFont( oFont )
odlge:oClient:= oMemo // to give it focus allways
oMemo:cFileName = cFileName
SetBar()
GetWinCoors(odlge, cIniFile)
SetWindowPos( oDlgE:hWnd, -1, 0, 0, 0, 0, 3 )

if File( cFileName )
oMemo:Load( cFileName )
odlge:SetText(EXE_VER+": "+cFileName)
aUserFunc:=dameaUserFunc()
oUserCbx:SetItems(aUserFunc)
IF LEN(aUserFunc)>0
oUserCbx:VarPut( aUserFunc[1] )
ENDIF
oMru:Save(lower(cFileName))
lNeedCmp := .t.
endif
oMemo:AdjClient()
oMemo:bChange = { |nKey| ChkMemo(nKey,oMemo), oRow:SetText( "Row: " + ;
LTrim( Str( oMemo:nLine ) ) ),;
oCol:SetText( "Col: " + ;
LTrim( Str( oMemo:nLineCol ) ) ) }
Eval( oMemo:bChange )

ACTIVATE WINDOW odlge ON INIT ( busca2Script(UNO,DOS)) ;
VALID (IIf(oMemo:lChanged .and. ;
MsgYesNo("Source code has changed, Save changes?",;
"Script Source code"),;
SaveFile(), ),;
SetWinCoors(odlge, cIniFile),;
oDlg == Nil)


RETURN nil


//27/06/2005
//----------------------------------------------------------------------------//

STATIC FUNCTION ChkMemo(nKey,oMemo)

/*
if Valtype(nKey) == "N" .and. nKey == 9
InsText(" ")
endif
*/

if oMemo:lChanged
if esunasolavez
DEFINE MSGITEM oChg OF odlge:oMsgBar PROMPT "Changed" SIZE 70 ;
COLOR CLR_WHITE, CLR_HRED
esunasolavez:=.F.
endif

endif

RETURN nil


//----------------------------------------------------------------------------//
//27/06/2005
STATIC FUNCTION SaveFile(lSaveAs) //ok

Local cScrFile

DEFAULT lSaveAs := .f.

if Empty(cFile) .or. lSaveAs
cScrFile := cGetFile("Clipper file (*.prg) |*.prg|","Program File Save", 1, cFile,.t.)
else
cScrFile := cFile
endif

if !Empty(cScrFile)
cFile := cScrFile
oMemo:SaveToFile(cFile)
esunasolavez:=.t.
oMemo:SetFocus()
odlge:SetText(EXE_VER+": "+upper(cFile))
oMru:Save(lower(cFile))
lChanged := .f.
if oChg != nil
odlge:oMsgBar:DelItem(oChg)
oChg := NIL
Endif
endif

RETURN NIL


//----------------------------------------------------------------------------//
//27/06/2005
STATIC FUNCTION OpenFile(cNewFile) //OK

Local cScrFile

if cNewFile != Nil
cScrFile := cNewFile
else
cScrFile:=cGetFile("Program | *.prg |"+"All files |*.*|","Vas a Editar que programa","*.prg",rclipper()+"\program")
endif

if !Empty(cScrFile)
cFile := cScrFile
oMemo:cFileName = cFile
if File( cFile )
oMemo:SetText( memoread( cFile ) )
endif
oMemo:AdjClient()
Eval( oMemo:bChange )

odlge:SetText(EXE_VER+": "+cFile)
aUserFunc:=dameaUserFunc()
oUserCbx:SetItems(aUserFunc)
IF LEN(aUserFunc)>0
oUserCbx:VarPut( aUserFunc[1] )
ENDIF
oMru:Save(lower(cScrFile))
lNeedCmp := .t.
endif

RETURN NIL

//27/06/2005
STATIC FUNCTION buscaScript(modo)
Local nFor,cLine,cText:=space(200)
Local nLines := len(oMemo:aLines)
If MsgGet("Busca","Texto",@cText)
cText:=alltrim(UPPE(cText)) ;nFor := 1
eltexto:=cText
// ?"cual es el maldito texto",eltexto,cText
WHILE nFor<=nLines
cLine := oMemo:aLines[nFor]
//?cLine
IF AT(cText,UPPE(cLine))>0
oMemo:GoLine( nFor )
retu .t.
ENDIF
nFor++
ENDDO // nFor
ENDIF
MsgAlert(cText,"No se encontro")
retu .t.

//27/06/2005
STATIC FUNCTION Sigebuscando(dire)
Local cLine,nLines:=len(oMemo:aLines),nFor
//?"que vale el texto",elTexto,valtype(elTexto),"nFor",nFor,"dire",dire,"nlines",nLines,nFor<=nLines
If empty(eltexto);retu .t.;end
eltexto:=alltrim(eltexto)
If dire=1
nFor:=oMemo:nLine()+1
WHILE nFor<=nLines
cLine := oMemo:aLines[nFor]
IF AT(uppe(elTexto),UPPE(cLine))>0
oDlgE:SetFocus()
oMemo:GoLine( nFor )
retu .t.
ENDIF
nFor++
ENDDO // nFor
else
nFor:=oMemo:nLine()-1
WHILE nFor>0
cLine := oMemo:aLines[nFor]
//oDlgE:SetText( ltrim(str(nFor))+" "+If(AT(uppe(elTexto),UPPE(cLine))=0,"Buscando ","Encontrando ")+uppe(elTexto)+" en "+UPPE(cLine) )
IF AT(uppe(elTexto),UPPE(cLine))>0
oMemo:GoLine( nFor )
//MsgRun( "Encontrado "+uppe(elTexto),"Linea "+ltrim(str(nFor)) )
retu .t.
ENDIF
nFor--
ENDDO // nFor
endif
MsgAlert(elTexto,"No hay mas coincidencias con ")
retu .t.

// 27/06/2005
FUNCTION busca2Script(UNO,DOS)
local hWnd := GetActiveWindow()
Local nFor:=1,cLine
Local nLines
IF VALTYPE(UNO)="U";retu .t.;endif
IF VALTYPE(oMemo)="U";retu .t.;endif
nLines:=len(oMemo:aLines)
WHILE nFor<=nLines
cLine := allTrim(oMemo:aLines[nFor])
IF AT(UNO,UPPE(cLine))>0 .OR. AT(DOS,UPPE(cLine))>0
//SetWindowText(hWnd, "Ubicando "+UNO+" en la linea "+ltrim(str(nFor)) )
oMemo:GoLine( nFor )
retu .t.
ENDIF
nFor++
ENDDO // nFor
retu .t.

//27/06/2005
Static Func CompileScript
Local nomprog,nobj
Local rharbour:="c:\x\bin\harbour"
Local rinclude:="c:\x\include"
Local rbcc32:="c:\x\bin\bcc32"
Local bat:=''
If empty(cFile);retu .t.;endif
//MSGALERT(cFile)
cFile:=ALLTRIM(cfile)
nomprog:=SUBS(cfile,RAT("\",cfile)+1)
nomprog:=SUBS(nomprog,1,AT(".PRG",uppe(nomprog))-1)
//MSGALERT(nomprog,"NOMPROG")
nobj:=nomprog+".obj"
bat+=Rharbour+' '+Rclipper()+'program\'+nomprog+'.prg /n /i'+rinclude+' /oc:\'+CURDIR()+'\obj32\'+nomprog+'.c /p >resu.txt'+chr(13)
MEMOWRIT("corre.bat",bat)
waitrun("corre.bat")
vztext("resu.txt")
WAITRUN( Rbcc32+' -M -c -O2 -I'+rinclude+' -tW -oc:\'+curDIR()+'\obj32\'+nomprog+'.obj c:\'+curdir()+'\obj32\'+nomprog+'.c + >>resu.txt' )
retu nil

//------------------------------------------------------------------------//
//27/06/2005
STATIC FUNCTION SetMenu(cIniFile)

LOCAL oMenu, oItem

MENU omenu
MENUITEM "&File"
MENU
MENUITEM "&Open" ACTION OpenFile()
MENUITEM "&Save" ACTION SaveFile()
MENUITEM "Save &as ..." ACTION SaveFile(.t.)
SEPARATOR
MENUITEM "&End" ACTION odlge:End()
MRU oMru FILENAME cIniFile ;
SECTION "Last files" ;
ACTION OpenFile(cMruItem) ;
SIZE 9
ENDMENU
MENUITEM "&Edit"
MENU
MENUITEM "&Cut" ACTION oMemo:Cut()
MENUITEM "C&opy" ACTION oMemo:Copy()
MENUITEM "&Paste" ACTION oMemo:Paste()
MENUITEM "&Redo" ACTION oMemo:Redo(),oMemo:Sefocus()
MENUITEM "&Undo" ACTION oMemo:Undo(),oMemo:Sefocus()
SEPARATOR

ENDMENU
MENUITEM "&Search"
MENU
MENUITEM "&Find ... " ACTION buscaScript(0)
MENUITEM "Find next " ACTION sigebuscando(1)
MENUITEM "Find previous" ACTION sigebuscando(2)
ENDMENU
MENUITEM "&Program"
MENU
MENUITEM "&Compile " ACTION CompileScript()
/*
MENUITEM "&Interprete " ACTION ejecutafile(1) ;
WHEN !Empty(cText) .and. oDlg == Nil
MENUITEM "Step &by Step" ACTION ejecutafile() ;
WHEN !Empty(cText) .and. oDlg == Nil
*/
MENUITEM "&Ventana Comandos " ACTION vtnacmd()
MENUITEM "&Verify Step &by Step " ACTION vzText("TRACE.TXT")
MENUITEM "&Ajustar tiempo de espera interprete" ACTION MsgGet("Tiempo","Espera",@v150000 )
MENUITEM oSub1 PROMPT "Mostrar despues de vzcommit" ACTION oSub1:SetCheck( ! oSub1:lChecked ) CHECKED
MENUITEM oSub2 PROMPT "Mostrar despues de vzdbseek" ACTION oSub2:SetCheck( ! oSub2:lChecked ) CHECKED

ENDMENU
MENUITEM "&SQL"
MENU
MENUITEM "Verify &INSERT UPDATE Y SELECT" ACTION vzText("HISTORY.TXT")
ENDMENU
ENDMENU

RETURN oMenu

//------------------------------------------------------------------------//
//27/06/2005
STATIC FUNCTION SetBar()

LOCAL oBar, oCursor,cCombo,oCbx,avzs,UserFunc,oBtn

DEFINE CURSOR oCursor HAND

DEFINE BUTTONBAR oBar SIZE 26, 26 3D OF odlge

DEFINE BUTTON NAME "OPEN" OF oBar NOBORDER ;
TOOLTIP "Open source file" ;
ACTION OpenFile()

DEFINE BUTTON NAME "SAVE" OF oBar NOBORDER;
TOOLTIP "Save source file" ;
ACTION SaveFile()

DEFINE BUTTON oBtn NAME "TABLES" OF oBar NOBORDER;
TOOLTIP "Ver tablas activas" ;
ACTION verTablesActiv(oBtn)

DEFINE BUTTON NAME "CUT" OF oBar NOBORDER GROUP;
TOOLTIP "Cut to Clipboard" ;
ACTION (oMemo:Cut())

DEFINE BUTTON NAME "COPY" OF oBar NOBORDER;
TOOLTIP "Copy to Clipboard" ;
ACTION (oMemo:Copy())

DEFINE BUTTON NAME "PASTE" OF oBar NOBORDER;
TOOLTIP "Paste from Clipboard" ;
ACTION (oMemo:Paste())

DEFINE BUTTON NAME "compile" OF oBar NOBORDER GROUP ;
TOOLTIP "Compile program " ;
ACTION CompileScript()

DEFINE BUTTON NAME "search" OF oBar NOBORDER GROUP ;
TOOLTIP "Find " ;
ACTION buscaScript(0)

DEFINE BUTTON NAME "search1" OF oBar NOBORDER GROUP ;
TOOLTIP "Find next " ;
ACTION sigebuscando(1)

DEFINE BUTTON NAME "search2" OF oBar NOBORDER GROUP ;
TOOLTIP "Find previous " ;
ACTION sigebuscando(2)


DEFINE BUTTON NAME "golin" OF oBar NOBORDER GROUP ;
TOOLTIP "Go to Line" ;
ACTION vealalinea()

DEFINE BUTTON NAME "PLAY" OF oBar NOBORDER;
TOOLTIP "Ventana de comandos" ;
ACTION vtnacmd()

DEFINE BUTTON NAME "SCRIPT" OF oBar NOBORDER;
TOOLTIP "Interprete paso a paso" ;
ACTION vtnaint(UserFunc)

DEFINE BUTTON NAME "mas" OF oBar NOBORDER;
TOOLTIP "Mas veloc. Interprete" ;
ACTION v150000-=10

DEFINE BUTTON NAME "menos" OF oBar NOBORDER;
TOOLTIP "Menos Veloc Interprete" ;
ACTION v150000+=10

DEFINE BUTTON NAME "STOP" OF oBar NOBORDER;
TOOLTIP "Detener Interprete " ;
ACTION lNoCortar:=.f.

oBar:bRClicked := {|| NIL }

Aeval(oBar:aControls, {|oCtl| oCtl:oCursor := oCursor})
avzs:=dameavzs()
aUserFunc:=dameaUserFunc()
if len(aUserFunc)>0;UserFunc:=aUserFunc[1];end
@ 0,65 COMBOBOX oUserCBX Var UserFunc ITEMS aUserFunc SIZE 140,500 OF oBar ON CHANGE veaestafunc(UserFunc)
cCombo:="VZ"
@ 0,82 COMBOBOX oCBX Var cCombo ITEMS avzs SIZE 150,400 OF oBar ON CHANGE cargavzs(cCombo)

RETURN NIL


//----------------------------------------------------------------------------//
//27/06/2005

#define WM_PASTE 770 // 0x302

STATIC FUNCTION InsText(cTxt)

LOCAL oclp

DEFINE CLIPBOARD oClp OF oMemo FORMAT TEXT

oClp:SetText(cTxt)
oMemo:SendMsg( WM_PASTE )
Eval( oMemo:bSetGet, cText )
oMemo:SetFocus()
oClp:End()

RETURN NIL


//--------------------------------------------------------------------------//
#define HWND_TOPMOST -1
#define SWAP_NOSIZE 1
#define SWAP_NOMOVE 2
#define RT_DIALOG 5

//------------------------------------------------------------------------//

//-------------------------------------------------------------------------//
#define ST_NORMAL 0
#define ST_ICONIZED 1
#define ST_ZOOMED 2
//27/06/2005
STATIC FUNCTION GetWinCoors(odlge,cIniFile)

LOCAL oIni
LOCAL nRow, nCol, nWidth, nHeight, nState

nRow := odlge:nTop
nCol := odlge:nLeft
nWidth := odlge:nRight-odlge:nLeft
nHeight := odlge:nBottom-odlge:nTop

IF IsIconic( odlge:hWnd )
nState := ST_ICONIZED
ELSEIF IsZoomed(odlge:hWnd)
nState := ST_ZOOMED
ELSE
nState := ST_NORMAL
ENDIF

INI oIni FILE cIniFile

GET nRow SECTION "Coordenadas" ;
ENTRY "Fila" DEFAULT nRow OF oIni

GET nCol SECTION "Coordenadas" ;
ENTRY "Columna" DEFAULT nCol OF oIni

GET nWidth SECTION "Coordenadas" ;
ENTRY "Ancho" DEFAULT nWidth OF oIni

GET nHeight SECTION "Coordenadas" ;
ENTRY "Alto" DEFAULT nHeight OF oIni

GET nState SECTION "Coordenadas" ;
ENTRY "Modo" DEFAULT nState OF oIni

GET cIncPath SECTION "Pre-processor" ;
ENTRY "IncludePath" DEFAULT cIncPath OF oIni

ENDINI

IF nRow == 0 .AND. nCol == 0
WndCenter(odlge:hWnd)
ELSE
odlge:Move(nRow, nCol, nWidth, nHeight)
ENDIF

IF nState == ST_ICONIZED
//odlge:Minimize()
ELSEIF nState == ST_ZOOMED
//odlge:Maximize()
ENDIF

odlge:CoorsUpdate()

RETURN NIL

//-------------------------------------------------------------------------//
//27/06/2005
STATIC FUNCTION SetWinCoors(odlge,cIniFile)

LOCAL oIni
LOCAL nRow, nCol, nWidth, nHeight, nState

odlge:CoorsUpdate()

nRow := odlge:nTop
nCol := odlge:nLeft
nWidth := odlge:nRight-odlge:nLeft
nHeight := odlge:nBottom-odlge:nTop

IF IsIconic( odlge:hWnd )
nState := ST_ICONIZED
RETU NIL
ELSEIF IsZoomed(odlge:hWnd)
nState := ST_ZOOMED
RETU NIL
ELSE
nState := ST_NORMAL
ENDIF

INI oIni FILE cIniFile

SET SECTION "Coordenadas" ;
ENTRY "Fila" TO nRow OF oIni

SET SECTION "Coordenadas" ;
ENTRY "Columna" TO nCol OF oIni

SET SECTION "Coordenadas" ;
ENTRY "Ancho" TO nWidth OF oIni

SET SECTION "Coordenadas" ;
ENTRY "Alto" TO nHeight OF oIni

SET SECTION "Coordenadas" ;
ENTRY "Modo" TO nState OF oIni

SET SECTION "Pre-processor" ;
ENTRY "IncludePath" TO cIncPath OF oIni

ENDINI

RETURN NIL


//-------------------------------------------------------------------------//
//27/06/2005
STATIC FUNCTION TakeOffExt(cFile)

local nAt := At(".", cFile)

if nAt > 0
cFile := Left(cFile, nAt-1)
endif

RETURN cFile

//-------------------------------------------------------------------------//
//27/06/2005
//-------------------------------------------------------------------------//

FUNCTION MsgArray( aArray, cMsg )

LOCAL cText := ""

DEFAULT cMsg := ""

Aeval(aArray, {|v,e| cText += Str(e,3) + ": "+cValToChar(v)+CRLF})

MsgInfo(cText, cMsg)

RETURN NIL


//27/06/2005


FUNCTION ejecutaFile(n,inilinea,pcfunc)
Local _nFor:=1,nFor,cLine,dato,resuwhile:=.f.,x,y,aParam,cParam,nwvar,VALOnwvar:=SPACE(100)
Local tLine:="",kwhile:=0
Local nLines := len(oMemo:aLines),resucond:=.T.,lacond
Local aLinWhile := {},variable,valor,j,nextLine,kmasWhile:=0
Local aLinBloq:={},ubi,knFor,kif,BLOQUEAYA //arreglo de lineas bloqueadas para las estructuras IF ELSE ENDIF
Local kuserFunc:=0,aLinUserFunc:={},velin,nwcLine,nAt,resucase,EVALUACASE
aVariables:={} ; aValores:={} ;Trace:="" ;Textacum:=""
lNoCortar:=.t.

If !empty(pcfunc)
cUNO:="FUNC "+ALLTRIM(oPPE(pcfunc))
cDOS:="FUNCTION "+ALLTRIM(oPPE(pcfunc))
endif
WHILE _nFor<=nLines
cLine := oMemo:aLines[_nFor] ;tLine += cLine
IF AT(cUNO,UPPE(cLine))>0 .OR. AT(cDOS,UPPE(cLine))>0
EXIT
retu .t.
ENDIF
_nFor++
ENDDO // nFor
_nFor++
IF _nFor<=nLines ;nFor:=_nFor
if (x:=at("(",cLine))>0 .and. (y:=at(")",cLine))>0 // hay parametros
cParam:=subs(cLine,x+1,y-x-1)
If !empty(cParam)
aParam:=llenarray(cParam,0)
For j=1 to len(aParam) ;nwVar:=aParam[j]
PUBLIC &nwVar
aadd(aVariables,nwVar)
MsgGet("Parametro ",nwVar ,@VALOnwvar)
VALOnwvar:=alltrim(VALOnwvar)
if vcerror(VALOnwvar)
&nwVar:=&VALOnwvar
else
&nwVar:=VALOnwvar
endif
next j
endif
endif

while nFor<=nLines .and. lNoCortar;cLine := allTrim(oMemo:alines[nFor])
//?ascan(aLinBloq,nfor),cLine,uppe(subs(cLine,1,7))="DO CASE" .AND. ascan(aLinBloq,nfor)=0

FOR2WHILE(@cLine) // TRANSFORMA EL FOR EN WHILE
NEXT2ENDDO(@cLine) // INCREMENTA LA VAR DEL FOR Y GENERA EL ENDDO
// Si la linea ANTERIOR ha sido bloquead liberarla de arreglo por que ya fue ejecutada
// INDAGAR SI LA PROXIMA LINEA ES UN WHILE
IF ascan(aLinBloq,nfor+1)=0
If nFor+1<=len(oMemo:alines)
nextLine := allTrim(oMemo:alines[ nFor+1])
else
nextLine :=space(200)
Endif

if uppe(subs(nextLine,1,5))="WHILE" .OR. uppe(subs(nextLine,1,4))="FOR "
// primero hay que ver si la linea actual es un if
if uppe(subs(cLine,1,2))="IF";lacond:=ALLTRIM(subs(cLine,3))
if vcerror(lacond); resucond:=&lacond;end
if resucond // buscar el else y bloquear todas sus lineas hasta llegar al endif
kwhile++
endif
else
kwhile++
endif
//?"incrementado kwhile",kwhile
endif
ENDIF
//VeraLinBloq(aLinBloq,nFor)
IF nFor>1
if (ubi:=ascan(aLinBloq,nFor-1))>0
ADEL(aLinBloq,ubi );aSize(aLinBloq, len(aLinBloq)-1)
endif
Endif
//cLine := Trim(oMemo:alines[ nFor])
tLine += cLine
//cLine := alltrim(cLine)
if empty(cLine);nFor++;loop;end
if uppe(subs(cLine,1,4))=="ELSE"; nfor++;loop;endif
//?"descartando es endif",uppe(subs(cLine,1,5)),uppe(subs(cLine,1,5))=="ENDIF"
if uppe(subs(cLine,1,5))=="ENDIF"
nfor++;loop
endif
// ?"nFor",nFor,"cLine",cLine,"aLinbloq",VeraLinBloq(aLinBloq)

if subs(uppe(cLINE),1,4)="EXIT"
if ascan(aLinBloq,nfor)=0
While nFor<=nLines;cLine :=allTrim(oMemo:alines[ nFor] )
if uppe(subs(cLine,1,4))=="ENDD";kwhile--;exit;endif
nFor++
Enddo
loop
endif
Endif

if subs(uppe(cLINE),1,4)="RETU"
if ascan(aLinBloq,nfor)=0
if kuserFunc=0;exit
else; nFor:=aLinUserFunc[kuserFunc]+1
ADEL(aLinUserFunc,kuserFunc )
aSize(aLinUserFunc, len(aLinUserFunc)-1)
kuserFunc--
loop
endif
endif
// if resucond;exit;end
else
//if puntoycoma(cLine,@nFor,nLines,n);loop;end
if ignorar(cLine,@nFor,nLines);loop;end
acomodar(@cLine)
if (uppe(subs(cLine,1,5))="WHILE" .OR. uppe(subs(cLine,1,4))="FOR ") .AND. ascan(aLinBloq,nfor)=0
if ascan(aLinWhile,nFor)=0
aadd( aLinWhile,nfor )
endif
lacond:=ALLTRIM(subs(cLine,6))
if nFor>=val(inilinea);MsgcLine( cLine,nFor,N );end
if vcerror(lacond); resuwhile:=&lacond;end
// ?"Resultado de while condicion ",resuwhile
if resuwhile
else ;nFor++
kmasWhile:=0
while nFor<=nLines;cLine :=allTrim(oMemo:alines[ nFor])
//?"DESCARTE",nFor,cLine,uppe(subs(cLine,1,4)),uppe(subs(cLine,1,4))=="ENDD"
if (uppe(subs(cLine,1,4))=="ENDD" .or. uppe(subs(cLine,1,5))="NEXT ") .and. kmasWhile=0
ADEL(aLinWhile,kwhile )
aSize(aLinWhile, len(aLinWhile)-1)
//veraLinWhile(aLinWhile)
kwhile--
exit
end
if uppe(subs(cLine,1,5))=="WHILE" .OR. uppe(subs(cLine,1,4))=="FOR ";kmasWhile++;endif
if uppe(subs(cLine,1,4))=="ENDD" .OR. uppe(subs(cLine,1,5))="NEXT ";kmasWhile--;endif
nFor++
enddo
endif
nFor++;LOOP
elseif (uppe(subs(cLine,1,4))="ENDD" .OR. uppe(subs(cLine,1,5))="NEXT ") .AND. ascan(aLinBloq,nfor)=0
//?"EN EL ENDD kwhile",kwhile,veraLinWhile(aLinWhile,1)
IF kwhile>0
nfor:=aLinWhile[kwhile]
ELSE
nfor++
ENDIF
loop
elseif uppe(subs(cLine,1,9))=="OTHERWISE" .AND. ascan(aLinBloq,nfor)=0
nfor++
LOOP
elseif uppe(subs(cLine,1,4))="CASE" .AND. ascan(aLinBloq,nfor)=0
nfor++
LOOP
elseif uppe(subs(cLine,1,7))="DO CASE" .AND. ascan(aLinBloq,nfor)=0
knFor:=nfor+1;EVALUACASE:=.T.
while knFor<=nLines;nwcLine :=allTrim(oMemo:alines[knFor])
if uppe(subs(nwcLine,1,7))=="ENDCASE" ;EXIT;END
IF EVALUACASE //1234567890
if uppe(subs(nwcLine,1,4))=="CASE" .OR. uppe(subs(NWcLine,1,9))=="OTHERWISE"
IF uppe(subs(NWcLine,1,9))="OTHERWISE"
resucase:=.T.
ELSE
CONDCASE:=ALLTRIM(SUBS(nwcLine,5))
IF (NAT:=AT("/",CONDCASE))>0; CONDCASE:=SUBS(CONDCASE,1,NAT-1); ENDIF
//?"CONDCASE",CONDCASE
resucase:=&CONDCASE
ENDIF
?"resucase ",resucase,nwcLine
if resucase //RECORRE TODO EL SGMTI DE COIGO Q DEBE EJECUTARSE PARA EVITAR QUE SE BLOQUEE
knFor++
while knFor<=nLines;nwcLine :=allTrim(oMemo:alines[knFor])
if uppe(subs(nwcLine,1,7))=="ENDCASE" .or. uppe(subs(nwcLine,1,4))=="CASE" .OR. uppe(subs(nwcLine,1,9))=="OTHERWISE"
EXIT
ENDIF
knFor++
enddo
EVALUACASE:=.F. // NO EVALUES MAS CASES
endif
endif //BLOQUEAR LINEAS DEL ELSE
ENDIF
aadd(aLinBloq,knFor)
knFor++
enddo
nfor++
LOOP
elseif uppe(subs(cLine,1,7))="ENDCASE" .AND. ascan(aLinBloq,nfor)=0
nfor++
LOOP

elseif uppe(subs(cLine,1,2))="IF" .AND. ascan(aLinBloq,nfor)=0
lacond:=ALLTRIM(subs(cLine,3))
if nFor>=val(inilinea);MsgcLine( cLine,nFor,N );end
if vcerror(lacond)
lacond:=ACURSOR2FLDGET(lacond)
//MSGALERT(lacond,"lacond")
resucond:=&lacond
end
if resucond // buscar el else y bloquear todas sus lineas hasta llegar al endif
knFor:=nfor+1 ; kif:=0 ;BLOQUEAYA:=.F.
while knFor<=nLines;cLine :=allTrim(oMemo:alines[knFor])
if uppe(subs(cLine,1,5))=="ENDIF" .and. kif=0;EXIT;END
if uppe(subs(cLine,1,4))=="ELSE" .and. kif=0;BLOQUEAYA:=.T.;endif //BLOQUEAR LINEAS DEL ELSE
IF BLOQUEAYA ; aadd(aLinBloq,knFor) ; Endif
if uppe(subs(cLine,1,2))=="IF";kif++;endif
if uppe(subs(cLine,1,5))=="ENDIF" ;kif--;endif
knFor++
enddo
else // bloquear todas las lineas del if hasta llegar al else o endif y altera el nfor hasta el else o endif
knFor:=nfor+1 ; kif:=0 //;BLOQUEAYA:=.t.
while knFor<=nLines;cLine :=allTrim(oMemo:alines[ knFor])
if uppe(subs(cLine,1,5))=="ENDIF" .and. kif=0;nfor:=knFor;EXIT;END
if uppe(subs(cLine,1,4))=="ELSE" .and. kif=0;nfor:=knFor;EXIT;endif
//IF BLOQUEAYA ; aadd(aLinBloq,knFor) ; Endif
if uppe(subs(cLine,1,2))=="IF";kif++;endif
if uppe(subs(cLine,1,5))=="ENDIF" ;kif--;endif
knFor++
enddo
endif
nfor++;loop
endif

//?" que narizes vale resucond",resucond,cLine
If ascan(aLinBloq,nfor)=0//resucond
if nFor>=val(inilinea);MsgcLine( cLine,nFor,N );end
// oMemo:GoTo(nFor)
// oMemo:SetSel( 1, len(tLine) )

If (x:=AT("=",cLine))=0 // NO Es una asignacion
/*
If nFor>=218
?"que devuelve Estafuncion(cLine,nFor) ",Estafuncion(cLine,nFor)
endif
*/
if (velin:=Estafuncion(cLine,nFor))>0
kuserFunc++;aadd(aLinUserFunc,nFor) // linea donde regresara el flujo
nFor:=velin // Ahora debe ubicarme en la linea de la funcion
loop
else
if vcerror(cLine); dato:=&cLine ;endif
//12345678
if SUBS(alltrim(uppe(cLine)),1,8)="VZCOMMIT"
if oSub1:lChecked; vzmybrow();endif
endif //12345678
if SUBS(alltrim(uppe(cLine)),1,8)="VZDBSEEK"
if oSub2:lChecked; vzmybrow();endif
endif
endif
else
If subs(alltrim(cLine),1,1)="("
if vcerror(cLine); dato:=&cLine ;endif
else
variable:=subs(cLine,1,x-1)
if at(":",variable)>0
variable:=subs(variable,1,len(variable)-1)
endif
valor :=alltrim(subs(cLine,x+1))
//?variable," = ",valor,at("(",variable)=0
if at("(",variable)=0
if at("(",valor)=0
//?"815 variable",variable,"VALOR",valor
&variable:=&valor
x:=&variable
else // la ultima se trara de una funcino que devuelve valor que se asigna a var
if (velin:=Estafuncion(valor,nFor))>0
kuserFunc++;aadd(aLinUserFunc,nFor) // linea donde regresara el flujo
nFor:=velin // Ahora debe ubicarme en la linea de la funcion
loop
else
&variable:=&valor
//?"variable",variable
x:=&variable
endif
endif
else //te confundiste es una funcion que usa el signo =
if (velin:=Estafuncion(cLine,nFor))>0
kuserFunc++;aadd(aLinUserFunc,nFor) // linea donde regresara el flujo
nFor:=velin // Ahora debe ubicarme en la linea de la funcion
loop
else
if vcerror(cLine); dato:=&cLine ;endif
endif
endif
// ?"valor final de variable ",x
endif
endif
Endif
endif
nFor++
Enddo
ENDIF
retu .t.


Static Function Estafuncion(cLine,nFor)
Local j:=1,userfunc,cfunc
// es una funcion
/*
If nFor>=218
?len(aUserFunc),cLine
?(AT("(",cLine)>0 .and. AT(")",cLine)>0)
?(alltrim(uppe(subs(cLIne,1,2)))="VZ")
endif
*/
If AT("(",cLine)>0 .and. AT(")",cLine)>0
else
retu(0)
endif
// es vz
if alltrim(uppe(subs(cLIne,1,2)))="VZ"
retu(0)
Endif

// existe en el combo
userfunc:=alltrim(subs(cLine,1,at("(",cLine)-1))
while j<=len(aUserFunc)
IF at("(",aUserFunc[j])>0
cfunc:=alltrim(subs(aUserFunc[j],1,at("(",aUserFunc[j])-1))
ELSE
cfunc:=alltrim(aUserFunc[j])
ENDIF
/*
If nFor>=218
*/
// ?"BUSCANDO",aUserFunc[j],cfunc==userfunc,cfunc,userfunc
/*
endif
*/
If UPPE(cfunc)==UPPE(userfunc)
RETU(aFuncLin[j])
Endif
j++
Enddo
retu(0)






STATIC Func ignorar(cLine,nFor,nLines)
Local CARA2:=CHR(47)+CHR(42),C2ARA:=CHR(42)+CHR(47)
if subs(cLine,1,2)=CARA2
//?Subs(cLine,1,2)=CARA2,cLine,NFOR,NLINES
nFor++
while nFor<=nLines
cLine := allTrim(oMemo:alines[ nFor])
//?"ignorarndo",cLine,at(C2ARA,cLine)
if at(C2ARA,cLine)>0
//
nFor++
retu .t.
endif
nFor++
enddo
endif
if subs(cLine,1,2)="//" .or. subs(cLine,1,1)="*"
nFor++
retu .t.
ENDIF
retu .f.

STATIC FUNCTION puntoycoma(cLine,nFor,nLines,m)
Local n,linea,dato
if (n:=at(";",cLine))=0
retu .F.
endif
while .t.
linea:=subs(cLine,1,n-1) ;cLine:=subs(cLine,n+1)
acomodar(@cLine)
If !empty(m)
MsgcLine( cLine,nFor )
endif
if subs(uppe(cLINE),1,4)="RETU"
nFor:=nLines+50
retu .t.
endif
if vcerror(cLine)
dato:=&cLine
endif
if n:=at(";",cLine)=0;exit;endif
enddo
nFor++
retu .t.

STATIC Func MsgcLine( cLine,nFor,N )
Local valor,mcrut,X,oDlgb,nWidth
LOCAL cText := "Variable Valor "+h()+"------------------------------"+h(),j
Local cMsg :="Interpreta linea "+ltrim(str(nFor))
For j=1 to len(aVariables)
valor:=""
mcrut:=aVariables[j]
IF VCERROR(mcrut)
valor:=&mcrut
ENDIF
cText+=aVariables[j]+" = "+convcadena(valor)+h()

next j
cText +="Area en Curso "+ltrim(str(select()))+" Interpretando linea "+LTRIM(STR(nFor))+h()+"------------------------------"+h()
cText +=cLine+h()+h()+h()

iF EMPTY(N)
MsgInfo(cText, cMsg)
Trace+=cText+"------------------------------"+h()+h()

ELSE
ODLGE:sETFOCUS()
oMemo:GoLine(nFor)
HideCaret( oMemo:hWnd )
oMemo:DrawLine( oMemo:nLine(), oMemo:nLineRow + 1, 255 )
ShowCaret( oMemo:hWnd )
oMemo:SetFocus()
//MsgRun(cLine, cMsg, { || myv150000() })

DEFINE DIALOG oDlgb FROM 0,0 TO 4, Max( Len( cLine ), Len( cMsg ) ) + 4 TITLE cMsg STYLE DS_MODALFRAME
oDlgb:bStart := { || oDlgb:Hide() , myv150000() , oDlgb:End(), SysRefresh() }
ACTIVATE DIALOG oDlgb


oDlgE:SetText(ltrim(str(nFor))+" "+cLine)
setosay(cText)
//Trace+=cLine+h()
//Textacum+=cLine+h()
//MsgRun(cLine, cMsg)
ENDIF
//MemoWrit("TRACE.TXT",Trace )

retu .t.

Static Func myv150000
Local x:=1
while X<=v150000
if lNoCortar
else
exit
endif
//oDlgE:SetText("vuelta "+ltrim(str(x)) )
x++
enddo
retu .t.

//retu({1,LEN(nwText) }) FUNCIONA
retu({((LEN(OLDnwText)+1)+((nFor-1)*2)),(LEN(nwText)+(nFor*2)) }) // FUNCIONARA


Static Func convcadena(valor)
Do case
case valtype(valor)="O";valor:="Object"
case valtype(valor)="A";valor:="Array"
case valtype(valor)="U";valor:="NIL"
case valtype(valor)="N";valor:=str(valor)
case valtype(valor)="D";valor:=dtoc(valor)
case valtype(valor)="L";valor:=if(valor,"T","F")
Endcase
retu valor


STATIC Func acomodar(cLine)
Local aVars,j,variable,valor,n
IF (n:=AT("//",cLine))>0
cLine:=SUBS(cLine,1,n-1)
ENDIF
Do case
case (n:=AT("++",cLine))>0;cLine:=SUBS(cLine,1,n-1)+"="+SUBS(cLine,1,n-1)+"+1"
case (n:=AT("--",cLine))>0;cLine:=SUBS(cLine,1,n-1)+"="+SUBS(cLine,1,n-1)+"-1"
case (n:=AT("+=",cLine))>0;cLine:=SUBS(cLine,1,n-1)+"="+SUBS(cLine,1,n-1)+"+"+SUBS(cLine,n+2)
case (n:=AT("-=",cLine))>0;cLine:=SUBS(cLine,1,n-1)+"="+SUBS(cLine,1,n-1)+"-"+SUBS(cLine,n+2)
case uppe(subs(cLine,1,5))="LOCAL"
cLine:=subs(cLine,6)
aVars:=llenarray(cLine,0);cLine:=""
For j=1 to len(aVars)
If at("=",aVars[j])=0;aVars[j]:=aVars[j]+":="+chr(34)+chr(34);endif
cLine+=aVars[j]+","
variable:=subs(aVars[j],1,at("=",aVars[j])-1)
if at(":",variable)>0;variable:=subs(variable,1,len(variable)-1);end
aadd(aVariables,variable)
//msgalert(variable,"DECLARA ESTA VARIABLE ")
PUBLIC &variable
valor:=subs(aVars[j],at("=",aVars[j])+1)
aadd(aValores,valor)
Next j
cLine:="("+subs(cLine,1,len(cLine)-1)+")"
case uppe(subs(cLine,1,7))="SELECT("
case uppe(subs(cLine,1,5))="SELE"
SELECT(VAL(VSELE(ALLTRIM(subs(cLine,6)))))
cLine:="SELECT("+VSELE(ALLTRIM(subs(cLine,6)))+")"
Endcase
RETU .T.


STATIC FUNC VSELE(AREA)
IF VAL(AREA)=0
AREA:=LTRIM(STR(ASC(UPPE(AREA))-64))
ENDIF
RETU(AREA)
//1234
STATIC FUNCTION dameaUserFunc()
Local nFor,cLine
Local nLines := len(oMemo:alines)
Local aFunc:={}
aFuncLin:={}
nFor:=1
WHILE nFor<=nLines
cLine := allTrim(oMemo:alines[ nFor])
//?cLine,alltrim(subs(cLine,at(" ",cLine))),subs(UPPE(cLine),1,4)=="FUNC"
IF subs(UPPE(cLine),1,4)=="FUNC"
aadd(aFunc,alltrim(subs(cLine,at(" ",cLine))) )
aadd(aFuncLin,nFor)
ENDIF
nFor++
ENDDO // nFor
retu(aFunc)

Func VeraLinBloq(aLinBloq,nFor)

Local j,txt:="Lineas en alinbloq "
For j=1 to len(aLinBloq)
txt+=ltrim(str(aLinBloq[j]))+", "
next j
//msgstop(txt)

retu TXT

Func veraLinWhile(aLinWhile)
Local j,txt:="Lineas en alinwhile "
For j=1 to len(aLinWhile)
txt+=ltrim(str(aLinWhile[j]))+", "
next j
RETU(txt)



/////////////// POR FIN LA ASIENDAD DOCUMENTACION EN EL EDITOR ///////////////////////////
FUNC dameavzs()
Local avzs:={"vz","vzuse_","vzskip","vzeof","vzgotop",;
"vzgobottom","vzgoto","vzgo","vzrecno",;
"vzbof","vzreccount","vzfieldget","vzrlock","vzcommit",;
"vzcloseall","vzdele","vzrepl","vzfieldname","vzmasca",;
"vzfieldput","vzfieldget","vzquery",;
"vzdbseek","vzascan","vzfcount","vzappend","vzrefresh","vzdelete","vzappe",;
"vzseek","vzquery","vzexecute","vzselectdb",;
"vzloa","vzgraba","vzeditbrow","vzgrabas","vzfile","vzminimiza",;
"vztext","vzmybrow","vzyear","vzachoice","vzbrowse","vzconsis","vzhi"}
retu( avzs )

Func cargavzs(qvz)
Local textpegar:=""
qvz:=alltrim(UPPE(qvz))
DO CASE
CASE qvz=="VZ"
textpegar:="vz( alias - > Nombre de campo )"
CASE qvz=="VZUSE"
textpegar:="vzuse_(dbf,indice,comparte,orden,nuevo,alias,driver,sololee)"
CASE qvz=="VZSKIP"
textpegar:="VZSKIP(n)"
CASE qvz=="VZGOTO"
textpegar:="VZgoto(nRecno)"
CASE qvz=="VZGO"
textpegar:="VZgo(nRecno)"
CASE qvz=="VZREPL"
textpegar:="VZrepl(campo.valor)"
CASE qvz=="VZFIELDNAME"
textpegar:="VZfieldname(nField)"
CASE qvz=="VZMASCA"
textpegar:="VZmasca(campo,area)"
CASE qvz=="VZFIELDPUT"
textpegar:="VZfieldPut(nField,uValue)"
CASE qvz=="VZFIELDGET"
textpegar:="VZFieldGet(nField)"
CASE qvz=="VZQUERY"
textpegar:="VZQuery(cSelect,aStruLen,sStruDec)"
CASE qvz=="VZDBSEEK"
textpegar:="VZDBSEEK(aValores,aCampos,lhaydbf,fields,OBY,xStruLen,xStruDec,SUMARIO,NLIKE,LIMITE,WHERE )"
CASE qvz=="VZAPPEND"
textpegar:="VZAppend(aValores,aCampos,flag)"
CASE qvz=="VZDELETE"
textpegar:="VZDelete(aValores,aCampos)"
CASE qvz=="VZSEEK"
textpegar:="VZSeek(xSearch,NoCampo,lDescend)"
CASE qvz=="VZSELECTDB"
textpegar:="VZSelectDb(nwbase,Dns)"
CASE qvz=="VZLOA"
textpegar:="VZLoa(Cja,n)"
CASE qvz=="VZGRABA"
textpegar:="VZGraba(cForm,lCerrar)"
CASE qvz=="VZEDITBROW"
textpegar:="VZEditBrow(nKey,colbxFolder,Pagima,xnowait)"
CASE qvz=="VZGRABAS"
textpegar:="VZGrabas(cForm,lCerrar)"
CASE qvz=="VZFILE"
textpegar:="VZFile(tabla)"
CASE qvz=="VZYEAR"
textpegar:="VZYear(fecha)"
CASE qvz=="VZACHOICE"
textpegar:="VZAchoice(fs,cs,fi,ci,aSample,titulo,Head,posi)"
CASE qvz=="VZASCAN"
textpegar:="VZAscan(arreglo,dato)"
CASE qvz=="VZEli"
textpegar:="VZEli(nobj,area)"
CASE qvz=="VZBrowse"
textpegar:="VZBrowse(cTitle,aHeadrs,bInit,bdlbClick,UseFunc,CapFunc)"
CASE qvz=="VZCONSIS"
textpegar:="vzconsis(cnobj , caCod , caTitu )"
ENDCASE

iF MsgNoYes("la syntax de esta funcion en su editor."+h()+textpegar,"Desea Pegar")
oMemo:SetFocus()
oMemo:SetSel( 0, 0 )
oMemo:Goto( oMemo:GetLineCount() )
__Keyboard( Chr( VK_END ) )
oMemo:Paste( textpegar )
endif
retu .t.




//27/06/2005
Static Func verTablesActiv(oBtn)
Local atables:=dametablasactiv(),n,bblock,buf:=select()
LOCAL oMenu
Local area
Local objsql,plus
MENU oMenu POPUP

For n=1 to len(atables)

area:=val(subs(atables[n],1,at("-",atables[n] )-1 ) )
Select(area); objsql:=dameobjsql()
If valtype(objsql)="O"
plus:= ltrim(str(objsql:nRowCount() ))+" registros"
else
plus:="No hay Cursor Cargado"
endif
bblock:=&(" { |oMenuItem| _verTable_("+chr(34)+atables[n]+chr(34)+") } ")

MenuAddItem( atables[n]+" "+plus,, .F.,, bblock ,,,,,,, .F.,,, .F. )

next n

ENDMENU
ACTIVATE POPUP oMenu AT oBtn:nBottom, 0 OF oBtn//+oBtn:nHeight , 0 OF oBtn
Select(buf)
RETU .T.

//27/06/2005
Static Func _verTable_(table)
Local buf:=select(),objsql
Local area:=val(subs(table,1,at("-",table)-1 ) )
Local latabla:=subs(table,at("-",table)+1 )
Select(area); objsql:=dameobjsql()
If valtype(objsql)="O"
IF objsql:nRowCount()>0
vzMyBrow()
ELSE
MsgAlert("No hay registros en el area "+ltrim(str(select())),"Error" )
ENDIF
else
MsgAlert("No hay cursor cargado en el area "+ltrim(str(select())),"Error" )
endif
Select(buf)
retu .t.

//27/06/2005
STATIC FUNCTION vealalinea
Local nLin:=1
If MsgGet("Ingrese","Nº Linea",@nLin)
oMemo:GoLine( nLin )
Endif
retu .t.

//27/06/2005
Static Function veaestafunc(UserFunc)
if valtype(aFuncLin)="A"
if len(aFuncLin)>0
if oUserCBX:NAt>0
oMemo:GoLine( aFuncLin[ oUserCBX:NAt ] )
oMemo:SetFocus()
endif
endif
endif
retu .t.

// 1111
// 1234567890123
// FOR I=1 TO 10
STATIC FUNC FOR2WHILE(cLine) // TRANSFORMA EL FOR EN WHILE
LOCAL VARINC,NAT,INI,FIN,CEXP,COND,RESU
IF UPPE(SUBS(cLine,1,4))="FOR "
VARINC:=ALLTRIM(SUBS(cLine,4));CEXP:=UPPE(VARINC)
IF (NAT:=AT("=",VARINC))>0
VARINC:=SUBS(VARINC,1,NAT-1)
ELSE;MSGALERT("NO PUSO EL SIGNO = DESPUES DE LA VARIABLE DEL FOR ","ERROR")
ENDIF
//?"CEXP",CEXP,AT("=",CEXP)+1,AT("TO ",CEXP)-AT("=",CEXP)-1
INI:=ALLTRIM(SUBS(CEXP,AT("=",CEXP)+1,AT("TO ",CEXP)-AT("=",CEXP)-1 ) )
FIN:=ALLTRIM(SUBS(CEXP,AT("TO ",CEXP)+3) )
//?VARINC,INI
IF VALTYPE(UNASOLAVEZ)="U"
&VARINC=&INI
UNASOLAVEZ:=1
ENDIF
cLine:="WHILE "+VARINC+"<="+FIN
COND:=VARINC+"<="+FIN
//?"cond",cond
RESU:=&COND
IF RESU
ELSE
UNASOLAVEZ:=NIL
ENDIF
//FORMANDO EL WHILE ",cLine
ENDIF
RETU .T.


STATIC FUNC NEXT2ENDDO(cLine) // INCREMENTA LA VAR DEL FOR Y GENERA EL ENDDO
lOCAL VARINC,NAT,MCRUT
IF UPPE(SUBS(cLine,1,5))="NEXT "
VARINC:=ALLTRIM(SUBS(cLine,5))
IF (NAT:=AT("/",VARINC))>0
VARINC:=SUBS(VARINC,1,NAT-1)
ENDIF
&VARINC:=&VARINC+1
cLine:="ENDDO"
//"FORMANDO EL ENDDO ",cLine,"J",J
ENDIF
RETU .T.


// CONVIRTIENDO UN ACURSOR A FLDGET

FUNC ACURSOR2FLDGET(exp)
Local p1,n,campo,noLbx,obj,pos,on
on:=at("ACURSOR:FLDGET(",UPPE(exp))
if (n:=at("ACURSOR:",UPPE(exp)))=0 ;RETU(exp);endif
IF n=on;RETU(exp);endif
exp:=uppe(exp)
// 1 2 3 4 5 6
// 123456789012345678901234567890123456789012345678901234567890
// EMPTY(VZDBSEEK({ oLbx:aCursor:NUME_ORDEN },{"NUME_ORDEN"} ) )
// ------p1--------------1234567
p1:=subs(exp,1,n-1)
//?"p1",p1
IF (n:=RAT(" ",p1))=0
IF (n:=RAT("}",p1))=0
IF (n:=RAT(")",p1))=0
IF (n:=RAT(",",p1))=0
IF (n:=RAT("+",p1))=0
ENDIF
ENDIF
ENDIF
ENDIF
endif
noLbx:=subs(p1,n+1)
noLbx:=subs(noLbx,1,len(noLbx)-1)
//?"noLbx",noLbx
obj:=&noLbx
//?obj:aCursor:ClassName()

campo:=alltrim(subs(exp,n+8))
IF (n:=AT(" ",campo))=0
IF (n:=AT("}",campo))=0
IF (n:=AT(")",campo))=0
IF (n:=AT(",",campo))=0
IF (n:=AT("+",campo))=0
ENDIF
ENDIF
ENDIF
ENDIF
endif
p2:=subs(campo,n+1)
//?"p2",p2
campo:=subs(campo,1,n-1)
campo:=subs(campo,at(":",campo)+1)
//?"campo",campo
pos:=mifieldpos(obj:aCursor,campo)
//?"pos",pos
exp:=p1+"aCursor:FldGet("+ltrim(str(pos))+")"+p2
//?"exp ",exp
retu exp
ME INTERESA FW Y XHB POR SER OPEN SOURCE
Vladimir Zorrilla
 
Posts: 225
Joined: Tue Feb 28, 2006 4:25 pm
Location: PERU

Postby quique » Wed Jun 18, 2008 10:41 pm

Si se puede, un ejemplo de uno en desarrollo 100% fivewin/xharbour lo puedes ver en

ftp://ftp.quiquesoft.com/qsvisual.zip

Puedes tomar como base la clase ttxtedit
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 77 guests