Escolar Documentos
Profissional Documentos
Cultura Documentos
*************
Fontes com espaço fixo:
lcDato =[?re=XAXX010101000%26rr=XAXX010101000%26tt=1234567890.123456] + ;
[%26id=ad662d33-6934-459c-a128-BDf0393f0f44]
** Ancho x Alto
lcDimensiones = '300x300'
** Donde quieren guardar la imagen, ojo, es PNG
lcImagen = PUTFILE('QRCode','QRCode','png')
IF EMPTY(lcImagen)
RETURN
ENDIF
IF GoogleQR(lcDato,lcDimensiones,lcImagen) == 0
MESSAGEBOX('Descarga Exitosa',0+64,'GoogleQR')
ELSE
MESSAGEBOX('Error en la generacion del Codigo QR',0+16,'GoogleQR')
ENDIF
FUNCTION GoogleQR(pDato,pDimensiones,pImagen)
WAIT WINDOW "Generando y descargando Código QR, espere por favor..." NOWAIT
DECLARE LONG URLDownloadToFile IN "urlmon";
LONG pCaller,;
STRING szURL,;
STRING szFileName,;
LONG dwReserved,;
LONG lpfnCB
sURL ="https://chart.googleapis.com/chart?cht=qr&chs=" + ;
pDimensiones + "&chld=Q&chl=" + STRTRAN(pDato,'&','%26')
nRetVal = URLDownloadToFile (0, sURL, pImagen, 0, 0)
WAIT CLEAR
RETURN nRetVal
ENDFUNC
***********************************************************************************
*************
* Recuperar o nome do executavel associado a extensão do arquivo
#DEFINE MAX_PATH 260
? lcExeName
ERASE (lcTempFile)
***********************************************************************************
*************
*****SCRIPT DE BACKUP PARA POSTGRE
*--- Aquivo: BKP.BAT
@ echo off
for /f "tokens=1-4 delims=/ " %%i in ("%date%") do (
set dow=%%i
set day=%%j
set month=%%k
set year=%%l
)
set datestr=%year%_%month%_%day%_%dow%
echo Data de processamento do backip %datestr%
set BACKUP_FILE=C:\prov\SERGIO_%datestr%.backup
echo Nome do arquivo de backup %BACKUP_FILE%
SET PGPASSWORD=Maker@1
echo on
C:\"Program Files (x86)\Softwell Solutions\Maker 2.5\PostgreSQL\bin"\pg_dump -i -h
localhost -p 5432 -U postgres -F c -b -v -f %BACKUP_FILE% carnabeirao
***********************************************************************************
*************
CLEAR
oManager = Getobject("winmgmts:\\.\root\cimv2")
oStuff = oManager.InstancesOf("Win32_process")
isRunning = .F.
For Each Process In oStuff
If Upper( Process.Name ) = Upper( lcProcess )
isRunning = .T.
SET STEP ON
Process.Terminate
ENDIF
Next
Return isRunning
Endfunc
***********************************************************************************
*************
***********************************************************************************
*************
* 3 formas de conexao com SQLSERVER
*------------------------------ 2a ODBC
*---------------------------------
lcStringConn="Driver={SQL
Server}"+";Server="+lc_IPSQL+";Database="+lc_nombre+";Uid="+lc_usuario_+";Pwd="+lc_
password
***Evitar que aparezca la ventana de login
SQLSETPROP(0,"DispLogin",3)
SQLSETPROP(0,"IdleTimeout",0)
lc_con=SQLSTRINGCONNECT(lcStringConn)
if m.lc_con < 0 && nose pudo conectar
wait windows "no conecta"
endif
***********************************************************************************
*************
* Report a partir de um cursor
cCursor = 'CXXX'
cTitulo = 'TESTE TESTE'
**************************************************************
* Autogeneracion de un listado (report rapido) partiendo de un
* cursor o tabla.
* Se autoajusta fuente, tamaño y nº de columnas a mostrar
*
* Parametros: cCursor --> Nombre del cursor/tabla origen
* cTitulo --> Titulo para el listado
*
* Ej: do autorepo with "micursor", "Titulo del Listado"
*
****************************************************************
* LPARAMETERS cCursor, cTitulo
*
Local cRepo, nLong, sFont, cFont, cCampos, nMaxCol, sExtra
Otherwise
sFont = 10
sExtra = Iif(Version(5) / 100 = 9, 450, 180)
Endcase
* Cambiar tamaño fuente y estilo para 'labels' y 'campos' del pie de pagina
Replace FontSize With sFont - 1, fontstyle With 2 For Alltrim(Expr) = [DATE()] In
mirepor
Replace FontSize With sFont - 1, fontstyle With 2 For Alltrim(Expr) = ["Página "]
In mirepor
Replace FontSize With sFont - 1, fontstyle With 2 For Alltrim(Expr) = [_PAGENO] In
mirepor
*
* Añadir línea separación en pie de pagina
Goto Top
Locate For Alltrim(mirepor.Expr) = [_PAGENO]
miW = mirepor.hpos + mirepor.Width + 100
miV = mirepor.Vpos -100
*
Append Blank In mirepor
Replace mirepor.objtype With 6
Replace mirepor.Vpos With miV
Replace mirepor.Width With miW
Replace mirepor.Height With 105
Replace mirepor.penpat With 8
Replace mirepor.supalways With .T.
Replace mirepor.platform With 'WINDOWS'
*
* Añadir línea separación en encabezado
Goto Top
Locate For mirepor.objtype=5 And mirepor.Vpos=0
*
miV = mirepor.Vpos + mirepor.Height
*
Append Blank In mirepor
Replace mirepor.objtype With 6
Replace mirepor.Vpos With miV
Replace mirepor.Width With miW
Replace mirepor.Height With 105
Replace mirepor.penpat With 8
Replace mirepor.supalways With .T.
Replace mirepor.platform With 'WINDOWS'
*
* Mover todo hacia abajo, para colocar titulo
If !Empty(cTitulo)
*
extra = 4000 && Altura para el titulo
Goto Top
Replace All Vpos With Vpos + extra For Inlist(objtype, 5, 6, 8) In mirepor
Replace All Height With Height + extra For objcode = 1 In mirepor
*
* Añadir Titulo
Append Blank In mirepor
Replace mirepor.platform With 'WINDOWS'
Replace mirepor.objtype With 5
Replace mirepor.hpos With 100
Replace mirepor.fontface With cFont
Replace mirepor.fontstyle With 4
Replace mirepor.FontSize With 16
Replace mirepor.Width With 70000
Replace mirepor.Height With 2800
Replace mirepor.supalways With .T.
Replace mirepor.Expr With ["&cTitulo"]
Replace mirepor.mode With 1
*
Endif
*
* Ajustar 'labels' columnas segun version VFP
Replace All mirepor.Vpos With mirepor.Vpos - sExtra For mirepor.objtype=5 And
mirepor.Vpos = extra
*
Delete All For objtype = 26 In mirepor
Pack
*
Use In mirepor
*
* Mandar impresion
oForm = Createobject("Form")
With oForm
.Caption = "Vista Previa "
.WindowType = 1
.Width = _Screen.Width - 16
.Height = _Screen.Height - 16
*
Select &cCursor
Goto Top
Report Form (cRepo) Preview Window (.Name)
Report Form (cRepo) To Printer Prompt Noconsole Noeject
*
.Release()
Endwith
*
* Borrar Report autogenerado
Delete File (Juststem(cRepo) + '.frx')
Delete File (Juststem(cRepo) + '.frt')
*
Return
***********************************************************************************
*************
SABER SE PROGRAMA ESTA SENDO EXECUTADO A PARTIR DO EXE OU NO PROJETO
Código:
CODE
Código:
IF VERSION(2) = 0 && RunTime
MESSAGEBOX("EXECUTÁVEL")
ELSE
MESSAGEBOX("DESENVOLVIMENTO")
ENDIF
***********************************************************************************
*************
*!* Objet : Implémention en VisualFoxPro de l'algorithme de hachage SHA1
*!* Auteur : C.Chenavier
*!* Version : 1.00 - 15/11/2004
*!* Les tests ont été réalisés avec le programme HashCalc :
http://www.slavasoft.com
*!* SHA signifie Secure Hash Algorithme et on utilise souvent le terme SHA-1,
*!* pour noter la version.
*!* SHA est une fonction de hachage qui produit des empreintes de 160 bits,
*!* contrairement à MD5 qui produit des empreintes de 128 bits.
*!* Cette fonction de hachage a été développée conjointement par la NSA et le
NIST
*!* pour être le standard des fonctions de hachage (FIPS PUB 180-1).
*!* SHA est basé sur MD4 et est réputé plus sûr que MD5.
*!* SHA fonctionne sur des messages dont la taille est inférieure à 2^64 bits
*!* et travaille sur des blocs de 512 bits.
FUNCTION SHA1
LPARAMETERS cMessage
H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0
M.nNbBlocs = LEN(M.cMessage) / 64
M.nLen = LEN(M.cMessage)
M.nReste = MOD(M.nLen, 64)
IF M.nReste > 0 OR M.nLen = 0
M.nNbBlocs = M.nNbBlocs + 1
IF M.nReste > 55
M.cMessage = M.cMessage + CHR(2^7) + REPLICATE(CHR(0), (64 - M.nReste) + 55)
M.nNbBlocs = M.nNbBlocs + 1
ELSE
M.cMessage = M.cMessage + CHR(2^7) + REPLICATE(CHR(0), (55 - M.nReste))
ENDIF
M.nHigh = (M.nLen*8) / 2^32
M.nLow = MOD(M.nLen*8, 2^32)
M.cMessage = M.cMessage + CHR(BITAND(BITRSHIFT(M.nHigh, 24), 0xFF)) ; && 56
+ CHR(BITAND(BITRSHIFT(M.nHigh, 16), 0xFF)) ; && 57
+ CHR(BITAND(BITRSHIFT(M.nHigh, 8), 0xFF)) ; && 58
+ CHR(BITAND(M.nHigh, 0xFF)) ; && 59
+ CHR(BITAND(BITRSHIFT(M.nLow, 24), 0xFF)) ; && 60
+ CHR(BITAND(BITRSHIFT(M.nLow, 16), 0xFF)) ; && 61
+ CHR(BITAND(BITRSHIFT(M.nLow, 8), 0xFF)) ; && 62
+ CHR(BITAND(M.nLow, 0xFF)) && 63
ENDIF
FOR I = 1 TO M.nNbBlocs
DO SHA1_ProcessBloc WITH SUBSTR(M.cMessage, 1 + 64*(I-1), 64)
ENDFOR
RETURN SUBSTR(TRANSFORM(H0,"@0"),3) + ;
SUBSTR(TRANSFORM(H1,"@0"),3) + ;
SUBSTR(TRANSFORM(H2,"@0"),3) + ;
SUBSTR(TRANSFORM(H3,"@0"),3) + ;
SUBSTR(TRANSFORM(H4,"@0"),3)
PROCEDURE SHA1_ProcessBloc
LPARAMETERS cBloc
LOCAL I, A, B, C, D, E, nTemp
LOCAL ARRAY W(80)
FOR I = 1 TO 16
W(I) = BITLSHIFT(ASC(SUBSTR(M.cBloc, (I-1) * 4 + 1, 1)), 24) + ;
BITLSHIFT(ASC(SUBSTR(M.cBloc, (I-1) * 4 + 2, 1)), 16) + ;
BITLSHIFT(ASC(SUBSTR(M.cBloc, (I-1) * 4 + 3, 1)), 8) + ;
ASC(SUBSTR(M.cBloc, (I-1) * 4 + 4, 1))
ENDFOR
FOR I = 17 TO 80
W(i) = BitLRotate(1, BITXOR(W(i-3), W(i-8), W(i-14), W(i-16)))
ENDFOR
A = H0
B = H1
C = H2
D = H3
E = H4
FOR I = 1 TO 20
M.nTemp = BitLRotate(5,A) + BITOR(BITAND(B,C), BITAND(BITNOT(B), D)) + ;
E + W(i) + 0x5A827999
E = D
D = C
C = BitLRotate(30,B)
B = A
A = M.nTemp
ENDFOR
FOR I = 21 TO 40
M.nTemp = BitLRotate(5,A) + BITXOR(B, C, D) + E + W(i) + 0x6ED9EBA1
E = D
D = C
C = BitLRotate(30,B)
B = A
A = M.nTemp
ENDFOR
FOR I = 41 TO 60
M.nTemp = BitLRotate(5,A) + BITOR(BITAND(B,C), BITAND(B,D), BITAND(C,D)) + ;
E + W(i) + 0x8F1BBCDC
E = D
D = C
C = BitLRotate(30,B)
B = A
A = M.nTemp
ENDFOR
FOR I = 61 TO 80
M.nTemp = BitLRotate(5,A) + BITXOR(B, C, D) + E + W(i) + 0xCA62C1D6
E = D
D = C
C = BitLRotate(30,B)
B = A
A = M.nTemp
ENDFOR
H0 = H0 + A
H1 = H1 + B
H2 = H2 + C
H3 = H3 + D
H4 = H4 + E
RETURN
FUNCTION BitLRotate
LPARAMETERS nBits, nWord
RETURN BITLSHIFT(M.nWord, M.nBits) + BITRSHIFT(M.nWord, (32-(M.nBits)))
***********************************************************************************
*************
** Metodo para valida se determinados objertos estaao sem preencher
** Colocar um "*" na propriedade COMMENT dos objetos que deseja validar
LOCAL lnObjecto,lcContenido,lcNombre,lcFoco
FOR lnObjecto = 1 TO THISFORM.OBJECTS.COUNT
IF THISFORM.OBJECTS(lnObjecto).COMMENT = "*"
lcNombre = THISFORM.OBJECTS(lnObjecto).NAME
lcContenido = "ThisForm." + lcNombre + ".Value"
IF EMPTY(&lcContenido)
MESSAGEBOX("Es necesario capturar el dato " + ;
SUBSTR(lcNombre,4), 16, "No es posible")
lcFoco = "ThisForm." + lcNombre + ".SetFocus"
&lcFoco
RETURN
ENDIF
ENDIF
ENDFOR
***********************************************************************************
*************
* --- menu no botao...
* Menú en commandbutton
WITH NEWOBJECT("xForm")
.SHOW(1)
ENDWITH
RETURN
PROCEDURE cmdClose.CLICK
THISFORM.HIDE()
ENDPROC
ENDDEFINE
MenuOptions = ""
DO CASE
CASE nKeyCode==K_DOWN AND nShiftCtrlAlt==K_ALT
NODEFAULT
THIS.ShowPopupMenu()
CASE nKeyCode==K_F4
NODEFAULT
THIS.ShowPopupMenu()
ENDCASE
ENDPROC
PROCEDURE CLICK
NODEFAULT
THIS.ShowPopupMenu()
ENDPROC
TRY
RELEASE POPUP _Popup_Menu
CATCH
ENDTRY
WITH THIS
THISFORM.ADDPROPERTY("ActivePopupMenu", THIS)
* Convierto de pixels a foxels
nRatio = FONTMETRIC(1)
nY = (.TOP + .HEIGHT) / nRatio
nRatio = FONTMETRIC(6)
nX = .LEFT / nRatio
***********************************************************************************
*************
*Autocompletar
PUBLIC oFrm
oFrm=NEWOBJECT("frm_autocompletar")
oFrm.SHOW
RETURN
IF DODEFAULT()
IIF(EMPTY(THIS.AutocompSource),ALLTRIM(UPPER(THIS.NAME)),ALLTRIM(UPPER(THIS.Autocom
pSource)))
IIF(EMPTY(THIS.AutocompSource),ALLTRIM(UPPER(THIS.NAME)),ALLTRIM(UPPER(THIS.Autocom
pSource)))
USE IN (THIS.AutocompTable)
ENDIF
ENDPROC
PROCEDURE txt5.VALID
IF DODEFAULT()
IIF(EMPTY(THIS.AutocompSource),ALLTRIM(UPPER(THIS.NAME)),ALLTRIM(UPPER(THIS.Autocom
pSource)))
IIF(EMPTY(THIS.AutocompSource),ALLTRIM(UPPER(THIS.NAME)),ALLTRIM(UPPER(THIS.Autocom
pSource)))
USE IN (THIS.AutocompTable)
ENDIF
ENDPROC
ENDDEFINE
loWsh = CreateObject("wscript.shell")
lcWallpaper = loWsh.RegRead("HKCU\Control Panel\Desktop\Wallpaper")
loWsh = Null
loForm = CREATEOBJECT("Form")
loForm.WIDTH = 800
loForm.HEIGHT = 600
loForm.AUTOCENTER = .T.
loForm.PICTURE = lcWallpaper
loForm.SHOW(1)
loForm = Null
RETURN
***********************************************************************************
*************
Buscar incremental em COMBO
********************************
PUBLIC oform1
oform1 = NEWOBJECT("form1")
oform1.SHOW
RETURN
PROCEDURE LOAD
CAPSLOCK(.F.) && simulo trabajar con minusculas
PUBLIC mf
mf = SYS(2015)
OPEN DATABASE (HOME(2) + "Northwind\Northwind.dbc")
SELECT 0
USE Customers
ENDPROC
PROCEDURE combo1.INIT
* Creo propiedad para almacenar configuracion CapsLock
IF PEMSTATUS(THIS,'lCaps',5) = .F.
WITH THIS
.ADDPROPERTY('lCaps',.F.)
ENDWITH
ENDIF
THIS.COMMENT = ''
ENDPROC
PROCEDURE combo1.KEYPRESS
LPARAMETERS nKeyCode, nShiftAltCtrl
IF BETWEEN(nKeyCode, 32, 122)
* Primero comprueba la lista
FOR X=1 TO THIS.LISTCOUNT
IF UPPER(SUBSTR(THIS.LIST(X), 1, THIS.SELSTART+1)) == ;
UPPER(SUBSTR(THIS.TEXT, 1, THIS.SELSTART)+CHR(nKeyCode))
NCURPOS = THIS.SELSTART + 1
THIS.VALUE = THIS.LIST(X)
THIS.SELSTART = NCURPOS
THIS.SELLENGTH = LEN(LTRIM(THIS.LIST(X))) - NCURPOS
THIS.COMMENT = SUBSTR(THIS.LIST(X),1,NCURPOS)
NODEFAULT
EXIT
ENDIF
NEXT X
* Si no está en la lista
IF X > THIS.LISTCOUNT
NCURPOS = LEN(THIS.COMMENT) + 1
THIS.COMMENT = THIS.COMMENT + CHR(nKeyCode)
THIS.DISPLAYVALUE = THIS.COMMENT
THIS.SELSTART = NCURPOS
NODEFAULT
ENDIF
ENDIF
* Si pulsamos Retroceso o flecha izda.
IF nKeyCode = 127 OR nKeyCode = 19
NCURPOS = LEN(THIS.COMMENT) -1
THIS.COMMENT = LEFT(THIS.COMMENT, NCURPOS)
THIS.DISPLAYVALUE = THIS.COMMENT
THIS.SELSTART = NCURPOS
NODEFAULT
ENDIF
IF nKeyCode = 13
THIS.LOSTFOCUS
ENDIF
ENDPROC
PROCEDURE combo1.LOSTFOCUS
THIS.ROWSOURCE = ''
USE IN SELECT('curcombo')
* Devolvemos config. inicial CapsLock
CAPSLOCK(THIS.lcaps)
* Tiempo busqueda incremental predeterminado
_INCSEEK = 0.5
*
* El dato introducido / seleccionado, se encuentra
* en la propiedad 'DisplayValue'.
*
ENDPROC
PROCEDURE combo1.GOTFOCUS
THIS.lcaps = CAPSLOCK()
IF CAPSLOCK() = .F.
CAPSLOCK(.T.) && Fuerzo a mayúsculas
ENDIF
_INCSEEK = 5.5 && Tiempo busqueda incremental al maximo
LOCAL cFile, cCampo
cFile='customers' && Tabla de la que tomar los datos
cCampo='upper(ltrim(companyname))' && campo a mostrar
SELECT &cCampo AS cDato FROM &cFile DISTINCT WHERE !EMPTY(&cCampo) ;
ORDER BY cDato INTO CURSOR curcombo nofilter
THIS.ROWSOURCE = 'curcombo' && Establecemos origen de datos
KEYBOARD '{ALT+DNARROW}' && Desplegamos lista
*
* Si le pasamos un valor previo (en la propiedad 'DisplayValue'),
* simulamos haberlo tecleado para que se situe en la lista.
*
IF !EMPTY(THIS.DISPLAYVALUE)
cTexto = THIS.DISPLAYVALUE
FOR yy = 1 TO LEN(cTexto)
cLetra = SUBSTR(cTexto, yy, 1)
KEYBOARD cLetra
ENDFOR
ENDIF
ENDPROC
PROCEDURE command1.CLICK
* El dato lo obtenemos de la propiedad 'DisplayValue'
IF !EMPTY(ALLTRIM(THISFORM.combo1.DISPLAYVALUE))
=MESSAGEBOX(THISFORM.combo1.DISPLAYVALUE)
ENDIF
USE IN SELECT('customers')
CLOSE ALL
RELEASE mf
THISFORM.RELEASE
ENDPROC
ENDDEFINE
*-- EndDefine: form1
**************************************************
***********************************************************************************
*************
TORPEDO:
Para OI:
ddd+numero@oitorpedo.com.br
Exemplo: 01692621212@oitorpedo.com.br
Para Claro:
ddd+numero@clarotorpedo.com.br
***********************************************************************************
*************
http://www.xfrx.net/vfpWinsock/SendMailexemples_e.asp
http://www.4shared.com/file/123451622/832b7cac/VFPwinsock.html
Esta rotina funcionará em máquina que não têm o fox instalado, apenas se a seguinte
chave estiver incluída no registro:
[HKEY_CLASSES_ROOT\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d]
@="mlrljgrlhltlngjlthrligklpkrhllglqlrk"
Hello World with default mailer values and Dump file if problem
Hello World
Hello World 2
Sending Email with a message body resulting from MHTML file generated by XFRX
Combining the above examples: ESMTP + body MHTML generated by XFRX + Attachments
loReflection =
loSManager.createInstance( "com.sun.star.reflection.CoreReflection" )
comarray( loReflection, 10 )
laNoArgs[1] = loPropertyValue
laNoArgs[1].name = "ReadOnly"
laNoArgs[1].value = .F.
lcArchivoOrigen = "C:/temp/modelo1.doc"
lcArchivoDestino = "C:/temp/eco" + lcNro_infor + " - " + ALLTRIM(lcDetalle) +
".doc"
* c:\temp\eco00112638 - 53565 diaz de rodriguez claudia.doc
loFandR = loOpenDoc.createReplaceDescriptor
loFandR.searchRegularExpression = .T.
loFandR.setSearchString("«nro_infor»")
loFandR.setReplaceString(lcNro_infor)
loOpenDoc.ReplaceAll(loFandR)
loFandR.setSearchString("«fecha»")
loFandR.setReplaceString(lcFecha)
loOpenDoc.ReplaceAll(loFandR)
loFandR.setSearchString("«detalle»")
loFandR.setReplaceString(lcDetalle)
loOpenDoc.ReplaceAll(loFandR)
* imprime el documento
* loOpenDoc.printer()
RETURN
return ( loPropertyValue )
Marcelo ARDUSSO
Rafaela, Santa Fe. Argentina
* http://wiki.services.openoffice.org/wiki/Documentation/BASIC_Guide/StarDesktop
* http://user.services.openoffice.org/es/forum/viewtopic.php?f=50&t=1306
Modelo 1
----------------------------------------------
Protocolo Nº «nro_infor»
Fecha «fecha»
Paciente: «detalle»
Estimado/a «detalle»
ENDCASE
ENDFOR
ENDFOR
*-- Cierro la planilla
.Workbooks.CLOSE
*-- Salgo de Excel
.QUIT
ENDWITH
RELEASE loExcel
SELECT("&xTabla")
BROWSE
**** Fin del Codigo
***********************************************************************************
*************
* WAIT WINDOWS CENTRALIZADO
lcTexto = "Espere un momento ..." + CHR(13) + ;
"generando el informe del día " + TRANSFORM(DATE()) + CHR(13) + ;
"NADA CORRE COMO UN ZORRO"
? WaitWindowsCentrado(lcTexto,5)
***********************************************************************************
*************
*-- correção automatica do MSWORD
PUBLIC oForm
oForm = createobject("claseCorrector")
oForm.show()
PROCEDURE Init
LOCAL cString
cString = "La gran mayoria de programadores Visual FoxPro se recisten a dejar "
+ ;
"de programar en este lenguaje porque consideran que es una
herramienta " + ;
"muy poderosa, versátil y robusta que les permite crear aplicaciones "
+ ;
"tan poderosas y hasta más estables que las creadas por otros
lenguajes. " + ;
"Incluso programadores que han tenido la oportunidad de desarrollar
tanto " + ;
"en Visual Basic.NET y Visual FoxPro 9.0 coinciden que FoxPro es
largamente " + ;
"superior en cuanto a practicidad y flexibilidad al momento de
programar."
thisform.edit1.Value = cString
ENDPROC
**********************************************************************************
* para incluír en los fuentes de cualquier programa, solo copiar el código *
* del siguiente procedimiento en el evento "Click" del boton llame al corrector. *
* IMPORTANTE: cambiar el nombre del control que tiene el texto a corregir! *
**********************************************************************************
PROCEDURE command1.Click
LOCAL loWord, lnOldMousePointer, loControl
loControl = Thisform.Edit1 && control que tiene el texto a corregir.
lnOldMousePointer = loControl.Mousepointer
loControl.Mousepointer = 11
WAIT WINDOW NOWAIT "Iniciando la Corrección Ortográfica..."+CHR(13)+;
" Espere por favor" TIMEOUT 3
IF VARTYPE( loWord ) <> 'O'
loWord = CREATEOBJECT('word.application')
ENDIF
IF VARTYPE ( loWord ) = "O"
loWord.documents.ADD()
WITH loWord
.documents(1).content = loControl.VALUE
.windowstate = 2 && ventana minimizada
.visible = .T.
.documents(1).CheckSpelling() &&Comenzando Corrección Ortográfica...
.SELECTION.WholeStory
IF .selection.text <> loControl.VALUE
loControl.VALUE = .SELECTION.TEXT
WAIT WINDOW NOWAIT "Corrección Ortográfica Finalizada..."+CHR(13)+;
" El texto fue reemplazado" TIMEOUT 3
ELSE
WAIT WINDOW NOWAIT "Corrección Ortográfica Finalizada..."+CHR(13)+;
" No se encontraron errores" TIMEOUT 3
ENDIF
.documents(1).CLOSE(.F.)
.QUIT
ENDWITH
loWord = .NULL.
RELEASE loWord
ELSE
MESSAGEBOX("Lo siento, no se puedo iniciar Word",48,_SCREEN.CAPTION)
loControl.Mousepointer = lnOldMousePointer
RETURN .F.
ENDIF
loControl.Mousepointer = lnOldMousePointer
ENDPROC
ENDDEFINE
***********************************************************************************
*************
* Rotina que determina se o usuario atual do windows é administradorador.
#DEFINE NO_ERROR 0
DECLARE INTEGER IsUserAnAdmin IN shell32
DECLARE INTEGER WNetGetUser IN mpr INTEGER lpName, STRING @lpUserName, INTEGER
@lpnLength
PUBLIC objForm
objForm = CreateObject("Tform")
objForm.Visible = .T.
PROCEDURE Init
THIS.AddTrayCtrl
PROCEDURE AddTrayCtrl
LOCAL lErr
ON ERROR lErr = .T.
THIS.AddObject("FoxTray", "TFoxTray")
ON ERROR
IF lErr
= MessageB("ActiveX control not registered " + Chr(13) +;
"or VB support not available. " + Chr(13) + Chr(13) +;
"Class: FoxTrayCtl.cFoxTray " + Chr(13) +;
"File: FoxTray.ocx " + Chr(13) +;
"VB support: msvbvm60.dll ", 48, " FoxTray Control")
ENDIF
PROCEDURE cmdShowIcon.Click
WITH ThisForm.FoxTray
.IconSource = ccIcon
.ShowIcon
ENDWITH
PROCEDURE cmdHideIcon.Click
ThisForm.FoxTray.HideIcon
ENDDEFINE
PROCEDURE Init
WITH THIS
.IconSource = ccIcon
.IconTip = "FoxPro App"
.ShowIcon
PROCEDURE BeforePopupActivate
PARAMETERS lResult
lResult = ThisForm.chPopup.Value && .F. cancels popup activation
PROCEDURE OnPopupItemSelected
LPARAMETERS lnItem, lcCaption
DO CASE
CASE lnItem = 2
= MessageB("System Tray Icon and Menu Control ", 64, " About")
CASE lnItem = 4
ThisForm.Release
CASE lnItem = 5
IF MessageB("Exit FoxPro? ", 32+4, " FoxTray Control") = 6
QUIT
ENDIF
OTHER
= MessageB("Popup item selected: " + LTRIM(STR(lnItem)) +;
", [" + lcCaption + "]")
ENDCASE
ENDDEFINE
***********************************************************************************
*************
* Gravar CD
declare integer GetUserName in advapi32 String@, Integer@
lcnomeusuario = replicate(chr(0),255)
lres = getusername(@lcnomeusuario,255)
if lres # 0 then
userwin=left(lcnomeusuario,at(chr(0),lcnomeusuario)-1)
endif
DELETE FILE "c:\Documents and Settings\"+userwin+"\Configurações locais\Application
Data\Microsoft\CD Burning\*.*"
COPY FILE "c:\sistema\*.*" TO "c:\Documents and Settings\"+userwin+"\Configurações
locais\Application Data\Microsoft\CD Burning"
lcParam="c:\Documents and Settings\"+userwin+"\Configurações locais\Application
Data\Microsoft\CD Burning\*.*"
oShell = Createobject("wscript.shell")
lnRet = oShell.Run(FULLPATH("CreateCD.exe") + " " + lcParam ,1, .T.)
***********************************************************************************
*************
BuscarTag("Customers", "City")
*---------------------------------------------------
* FUNCTION BuscarTag(tcAlias, tcTag)
*---------------------------------------------------
* Busca el nombre de un tag en el alias de
* una tabla abierta en un area de trabajo
* RETORNO: Lógico
* .T. = Si el tag existe en la tabla
* .F. = Si el tag no existe o el alias no existe
*---------------------------------------------------
FUNCTION BuscarTag(tcAlias, tcTag)
RETURN SELECT(tcAlias) > 0 AND ;
ATAGINFO(laTag,"",SELECT(tcAlias)) > 0 AND ;
ASCAN(laTag,tcTag,-1,-1,1,1) > 0
ENDFUNC
*---------------------------------------------------
***********************************************************************************
*************
DEFINE NRO_COLUMNAS 10
#DEFINE NRO_CARTONES 1000
lnCarton = 0
DO WHILE lnCarton < NRO_CARTONES
*-- Inicio vector linea
laLista = 0
FOR lnI = 1 TO NRO_COLUMNAS
DO WHILE .T.
lnNro = CEILING(RAND()*90)
*-- compruebo que no exista el Nro
IF ASCAN(laLista, lnNro) = 0
EXIT
ENDIF
ENDDO
laLista(lnI) = lnNro
ENDFOR
*-- Ordeno el vector
ASORT(laLista)
lcLinea = ""
FOR lnI = 1 TO 10
lcLinea = lcLinea + TRANSFORM(laLista(lnI), "@L 99") + IIF(lnI = 10, "", "-")
ENDFOR
*-- Inserto el carton si la linea no existe
IF NOT SEEK(lcLinea, "Bingo", "Linea")
lnCarton = lnCarton + 1
INSERT INTO Bingo (Carton, Linea) VALUES (lnCarton, lcLinea)
ENDIF
ENDDO
***********************************************************************************
*************
*** Define Special Folder Constants
#define CSIDL_PROGRAMS 2 &&Program Groups Folder
#define CSIDL_PERSONAL 5 &&Personal Documents Folder
#define CSIDL_FAVORITES 6 &&Favorites Folder
#define CSIDL_STARTUP 7 &&Startup Group Folder
#define CSIDL_RECENT 8 &&Recently Used Documents
&&Folder
#define CSIDL_SENDTO 9 &&Send To Folder
#define CSIDL_STARTMENU 11 &&Start Menu Folder
#define CSIDL_DESKTOPDIRECTORY 16 &&Desktop Folder
#define CSIDL_NETHOOD 19 &&Network Neighborhood Folder
#define CSIDL_TEMPLATES 21 &&Document Templates Folder
#define CSIDL_COMMON_STARTMENU 22 &&Common Start Menu Folder
#define CSIDL_COMMON_PROGRAMS 23 &&Common Program Groups
&&Folder
#define CSIDL_COMMON_STARTUP 24 &&Common Startup Group Folder
#define CSIDL_COMMON_DESKTOPDIRECTORY 25 &&Common Desktop Folder
#define CSIDL_APPDATA 26 &&Application Data Folder
#define CSIDL_PRINTHOOD 27 &&Printers Folder
#define CSIDL_COMMON_FAVORITES 31 &&Common Favorites Folder
#define CSIDL_INTERNET_CACHE 32 &&Temp. Internet Files Folder
#define CSIDL_COOKIES 33 &&Cookies Folder
#define CSIDL_HISTORY 34 &&History Folder
***********************************************************************************
*************
Com estas funcoes podemos controlar um SERVICO se esta sendo executado no windows
Tomamos como ejemplo el servicio Themes de Windows XP.
***********************************************************************************
*************
*Criando ZIP com o SHELL do windows XP & VISTA
***************************************************************
* COMPRIMIRENZIP.PRG
* Se encarga de comprimir en un archivo zip varias extensiones de Archivos
* utilizando el Shell de Windows - probado en XP
* FECHA : 19 MARZO 2008
* HECHO POR : ROTEROL (Rubén V. Otero L.)
* La Coruña, España
****************************************************************
*!* Verifico todos los ficheros a comprimir y los guardo en un array único laArcDef
*!* No puedo hacer una sola instrucción adir con todas las extensiones de archivos,
con lo cual,
*!* ejecuto tantos adir como sea necesario para almacenar los
*!* *.dbc, *.dct, *.dcx, *.dbf, *.fpt y *.cdx
laExtensiones[1] = "*.dbc"
laExtensiones[2] = "*.dcx"
laExtensiones[3] = "*.dct"
laExtensiones[4] = "*.dbf"
laExtensiones[5] = "*.fpt"
laExtensiones[6] = "*.cdx"
FOR EACH lcExtension IN laExtensiones
lnArchivos = ADIR(laArchivos,lcExtension)
*!* Dependiendo si es la primera vez que paso por el For Each, declaro el array
laArcDef con el
*!* número de Archivos resultantes del Adir, Si no es la primera vez que paso por
el For Each,
*!* incremento el número de elementos de laArcDef en la longitud que tiene
actualmente
*!* mas el número de archivos resultantes del adir
IF lcExtension=laExtensiones[1]
lnContArrayDef = 0
DECLARE laArcDef[lnArchivos]
ELSE
lnContArrayDef = ALEN(laArcDef)
DECLARE laArcDef[ALEN(laArcDef)+lnArchivos]
ENDIF
FOR lnContArray = 1 TO lnArchivos
lnContArrayDef = lnContArrayDef + 1
laArcDef[lnContArrayDef] = ADDBS(FULLPATH(CURDIR()))+laArchivos[lnContArray,1]
NEXT
NEXT
lcZip = ADDBS(FULLPATH(CURDIR()))+'ArchivoComprimido.zip'
IF FILE(lcZip) && Borro Zip si existe
ERASE lcZip
ENDIF
oShell = CREATEOBJECT("Shell.Application")
IF TYPE('oShell')='O'
*!* Según Investigué, Microsoft recomienda crear el Objeto oFolder y trabajar con
ese objeto
*!* para hacer la instrucción copyHere intenté hacerlo directamente
*!* -oShell.NameSpace("&lcZip").copyHere(laArcDef[lnContArray])-, pero recibía
contínuos errores de
*!* fallo de aplicación VFP. asimismo, tuve que crear el objeto oFolder con la
macrosubstitución
*!* -oShell.NameSpace("&lcZip")- por que tambien, depurando el programa, detecté
que no se
*!* creaba el objeto oFolder colocando la instrucción
-oShell.NameSpace("&lcZip")- directamente
oFolder = oShell.NameSpace("&lcZip")
IF TYPE('oFolder')='O'
FOR lnContArray = 1 TO lnContArrayDef && ALEN(laArcDef)
WAIT 'Procesando Archivo '+LOWER(laArcDef[lnContArray])+', '+;
ALLTRIM(STR(lnContArray*100/lncontArrayDef))+'%' WINDOW NOWAIT
oFolder.CopyHere(laArcDef[lnContArray])
*!* Me veo obligado tambien a colocarle un inkey por que si no se pone y por
ejemplo
*!* tenemos 48 archivos para comprimir (como es mi caso), el proceso lo
efectúa muy rapido,
*!* y aún cuando sale del for...next, se crean tantos shell de Fox
*!* como archivos haya, con el dialogbox de "Comprimiendo..."
INKEY(0.5)
NEXT
WAIT CLEAR
oFolder = .F.
ELSE
MESSAGEBOX('No pudo crearse el Objeto oFolder',16)
ENDIF
oShell = .F.
ELSE
MESSAGEBOX('No pudo crearse el Objeto Shell',16)
ENDIF
***********************************************************************************
*************
Declare Long GetParent in Win32API Long
Declare Long EnableWindow in Win32API Long, Long
EnableWindow(GetParent(oleControl.Hwnd), 1)
***********************************************************************************
*************
Resultado de um REPORT em .BMP
cRutaReporte = Home(2)+"Solution:\Reports:\invoice.frx"
***********************************************************************************
*************
* Gera chave GUID
? GUIDGen(2)
FUNCTION GUIDGen
LPARAMETERS tn_mode as Integer
LOCAL ;
lc_guid_return as String, ;
lc_buffer as String, ;
ln_result as Integer, ;
lc_GUID as String
IF tn_mode = 0
lc_guid_return = lc_GUID
ELSE
lc_buffer = SPACE(78)
ln_result = StringFromGUID2(lc_GUID,@lc_buffer,LEN(lc_buffer)/2)
lc_guid_return = STRCONV((LEFT(lc_buffer,(ln_result-1)*2)),6)
ENDIF
RETURN lc_guid_return
ENDFUNC
***********************************************************************************
*************
*Validacao de Cartao de Credito
LPARAMETERS tcCCnumber, tcCCtype, tcError
LOCAL lcCCnumber, lnCClen, llCCok, lcCCtype, lcError, lnSum, lnTemp, lvRet
lcCCnumber = ALLTRIM(tcCCnumber)
lnCClen = LEN(lcCCnumber)
lcCCtype = "UNKNOWN"
lcError = ""
DO CASE
CASE NOT llCCok
* CC # is already invalid
lcError = "NON-DIGIT"
CASE lnCClen = 16
DO CASE
CASE BETWEEN( LEFT(lcCCnumber,2) , "51", "55")
lcCCtype = "MASTERCARD"
CASE lcCCnumber = "4"
lcCCtype = "VISA"
CASE lcCCnumber = "6011"
lcCCtype = "DISCOVER"
CASE lcCCnumber = "3"
lcCCtype = "JCB"
OTHERWISE
llCCok = .F.
lcError = "INCORRECT LEN"
ENDCASE
CASE lnCClen = 15
DO CASE
CASE INLIST( LEFT(lcCCnumber,2) , "34", "37")
lcCCtype = "AMEX"
CASE INLIST( LEFT(lcCCnumber,4) , "2131", "1800")
lcCCtype = "JCB"
OTHERWISE
llCCok = .F.
lcError = "INCORRECT LEN"
ENDCASE
CASE lnCClen = 14
DO CASE
CASE BETWEEN( LEFT(lcCCnumber,3) , "300", "305") OR ;
INLIST( LEFT(lcCCnumber,2) , "36", "38")
lcCCtype = "DINERS CLUB"
OTHERWISE
llCCok = .F.
lcError = "INCORRECT LEN"
ENDCASE
CASE lnCClen = 13
DO CASE
CASE lcCCnumber = "4"
lcCCtype = "VISA"
OTHERWISE
llCCok = .F.
lcError = "INCORRECT LEN"
ENDCASE
OTHERWISE
llCCok = .F.
lcError = "INCORRECT TYPE"
ENDCASE
IF llCCok
lnSum = 0
DO CASE
CASE PCOUNT() = 1
lvRet = llCCok
CASE tcCCtype = "TYPE"
lvRet = lcCCtype
CASE tcCCtype = "ERROR"
lvRet = lcError
CASE tcCCtype = "CD"
lvRet = lnSum
OTHERWISE
lvRet = llCCok
ENDCASE
IF PCOUNT() > 1
tcCCtype = lcCCtype
ENDIF
IF PCOUNT() > 2
tcError = lcError
ENDIF
RETURN lvRet
********************************************************
#IF .F.
Step 1:
4 9 9 2 7 3 9 8 7 1 6
x2 x2 x2 x2 x2
------------------------------
18 4 6 16 2
#ENDIF
Não me lembro de qual website eu peguei esta informação, mas existe uma página
similar em http://www.beachnet.com/~hstiles/cardtype.html
***********************************************************************************
*************
Estou utilizando o SQL Server 2005. É possível começar a mostrar um cursor na grade
enquanto o restante dele ainda está sendo recuperado do SQL Server?
=SQLSETPROP(g_connection,'BatchMode', .T.)
=SQLSETPROP(g_connection,'Asynchronous', .t.)
USE IN gridRecordSource
LOCAL nresult
nresult= SQLEXEC(g_connection,"select * from cases ","gridRecordSource")
DO WHILE nresult=0 AND ! USED("gridRecordSource")
nresult= SQLEXEC(g_connection)
enddo
IF nresult<0
MESSAGEBOX("Error in SQLEXEC",48,"Jaguar Alert")
RETURN .f.
ENDIF
RELEASE nresult
=CursorSetProp("FetchSize",50,"gridRecordSource")
***********************************************************************************
*************
* Abrir PDF com o VFP
PUBLIC oform1
oForm1=NEWOBJECT("form1")
oForm1.Show()
RETURN
Autocenter = .T.
Height = 520
Width = 741
Caption = "Visualisation de PDF"
ShowWindow = 2
Name = "Form1"
cPdfFileName = "=SPACE(0)"
PROCEDURE Refresh
&& Requis pour VFP8 et permet de contourner une erreur
NODEFAULT
ENDPROC
PROCEDURE ShowPdf
&& Affichage de page blanche dans le WebControl
Thisform.oWB.OBJECT.Navigate2("About:Blank")
&& Attendre que le chargement soit complet
lnSeconds = SECONDS()
DO WHILE Thisform.oWB.OBJECT.Busy AND SECONDS() - lnSeconds < 60
DOEVENTS
ENDDO
&& Charger PDF
Thisform.oWB.OBJECT.Navigate2(Thisform.cPdfFileName)
&& Attendre que le chargement soit complet
lnSeconds = SECONDS()
DO WHILE Thisform.oWB.OBJECT.Busy AND SECONDS() - lnSeconds < 60
DOEVENTS
ENDDO
ENDPROC
PROCEDURE command1.Click
&& Ouvrir PDF
Thisform.cPdfFileName = GETFILE("pdf")
&& Afficher le nom du PDF
Thisform.txtPdfName.Value = Thisform.cPdfFileName
IF NOT EMPTY(Thisform.cPdfFileName)
&& Afficher PDF
Thisform.ShowPdf()
ENDIF
ENDPROC
ENDDEFINE
***********************************************************************************
*************
Imprimir un objeto RTF (Rich Text Format) conservando el formato.
PUBLIC loMiForm
loMiForm = NEWOBJECT("MiForm")
loMiForm.SHOW
RETURN
PROCEDURE INIT
TEXT TO lcRTF NOSHOW PRETEXT 2
{\rtf1\ansi\ansicpg1252\deff0\deflang11274{\fonttbl{\f0\fswiss\fcharset0 Arial;}
{\f1\fswiss\fprq2\fcharset0 Arial Black;}{\f2\fswiss\fprq2\fcharset0 Arial
Narrow;}}
{\colortbl ;\red255\green0\blue0;\red0\green0\blue255;}
{\*\generator Msftedit 5.41.21.2507;}
\viewkind4\uc1\pard\ul\b\f0\fs40 Ejemplo de \cf1 RTF\cf0\ulnone\b0\fs20\par
\par
\cf2\i\f1\fs72 PortalFox\cf0\f0\fs20\par
\b\f2\fs36 Nada corre como un zorro\b0\i0\f0\fs20\par
\par
}
ENDTEXT
ERASE "RTF.RTF"
STRTOFILE(lcRTF, "RTF.RTF")
THISFORM.oleRTF.FileName = "RTF.RTF"
ENDPROC
PROCEDURE cmdPrint.CLICK
*-- Respuesta de Anders
DECLARE INTEGER CreateDC IN Win32Api ;
STRING, STRING, INTEGER, INTEGER
DECLARE INTEGER DeleteDC IN Win32Api INTEGER
cPrinter = SET("PRINTER",3)
hDC = CreateDC("WINSPOOL",cPrinter,0,0)
THISFORM.oleRTF.SelPrint(hDC)
DeleteDC(hDC)
ENDPROC
ENDDEFINE
***********************************************************************************
*************
Crear un Zip usando los recursos estandard de Windows lecturas 62
Como se que muchos de ustedes posiblemente han estado buscando rutinas para empacar
y desempacar archivos .zip de manera automatica y sin instalar librerias de
terceros (winzip, .dlls, etc) aqui les envio una copia del .prg que cree para hacer
esto sin necesidad de instalar nada mas que VFP.
********************************************
*
* CREADO: Moby
* Guatemala
* Enero 2008
*
* Crear un zip con las funciones del sistema operativo Windows
* Este programa deberia funcionar en windows 95/98/Me/XP/2000/2003/Vista
* Lo he probado en Windows Me/XP/y demas y funciona bien.
*
* Para usarlo en Windows Pre-XP instale primero la funcionalidad
* "carpetas comprimidas"
* en Inicio > Panel de control > Agregar y quitar programas > Componentes Windows
*
* Lo que hay que entender en este programa
* es que para Windows, un archivo .zip no es mas
* que un objeto Folder (es decir una carpeta cualquiera)
*
* Si quieren saber mas sobre Shell.Application
* pueden buscar la documentacion completa en:
*
* +MSDN - Library 2001 o posterior
* ++Platform SDK Documentation
* +++User interface services
* ++++Windows shell
*
* La informacion especifica de como tratar un objeto folter
* la pueden encontrar en:
*
* +MSDN - Library 2001 o posterior
* ++Platform SDK Documentation
* +++User interface services
* ++++Windows shell
* +++++Shell Reference
*
* y denle una ojeada a:
*
* +++Shell Objects for scripting an Visual Basic
* ++++Shell Object
* +++++Methods
* ++++++NameSpace
*
* Y Tambien a:
*
* ++Shell Objects for scripting an Visual Basic
* +++Folder Object
* ++++Methods
* +++++CopyHere
* ++++++Items
*
* El argumento de CopyHere
* PUEDE ser:
*
* Una cadena conteniendo la ruta completa y el nombre del archivo a copiar
* o Una referencia al Objeto FolderItems
* o Una referencia al objeto FolderItem
*
* FolderItems referencia el contenido completo del folder
* folderItem referencia solo un archivo en el folder
*
********************************************
&& Desempacalo
If File(cArchivoZip) .and. !Empty(cDirectorioDestino)
Desempaca(cArchivoZip,cDirectorioDestino)
EndIf
***********************************************************************************
PROCEDURE CreaZip
PARAMETERS cNombre && recibe como parametro el nombre del zip
PRIVATE lRetorno
lRetorno = .f.
RETURN lRetorno
***********************************************************************************
PROCEDURE Empaca
PARAMETERS cFileName,cDirectorio
PRIVATE oShell,oFolder
If IsNull(oFolder)
=MessageBox("No se puede abrir el zip.",48,"Advertencia:")
Else
&& si se pudo obtener el objeto folder
ENDPROC
***********************************************************************************
PROCEDURE Desempaca
PARAMETERS cFileName,cDirectorio
PRIVATE oShell,;
oFS,; && oFolderSource
oFD,; && oFolderDest
oFSI && oFolderItems
ENDPROC
***********************************************************************************
PROCEDURE LeeZip
PARAMETERS cArchivo
PRIVATE I,J,k
&& abre un archivo (cualquiera) y lo lee byte por byte
ENDPROC
***********************************************************************************
***********************************************************************************
*************
* Adicionar um campo autoincremental a uma tabela com registros
FUNCTION NewIncrem
LPARAMETERS lcTabla, lcNombreCampo, lnError, lnUltInc
* abre la tabla
TRY
USE (lcTabla) IN 0 EXCLUSIVE
lnError = 0
CATCH
MESSAGEBOX("Error al abrir tabla", 48, "Error")
lnError = 1
ENDTRY
IF lnError = 1
RETURN 0
ENDIF
* crea el campo, si ya existe el nombre o es inválido cancela la operación
* crea el campo como numérico para poder actualizar los valores
TRY
SELECT (lcTabla)
ALTER TABLE (lcTabla) ADD COLUMN (lcNombreCampo) N(10)
CATCH
MESSAGEBOX("Error al crear el campo", 48, "Error")
lnError = 1
ENDTRY
IF lnError = 1
RETURN 0
ENDIF
* actualiza los valores del campo
REPLACE (lcNombreCampo) WITH RECNO() ALL
* actualiza el tipo de campo a incremental y el siguiente valor del
autoincremental
ALTER TABLE (lcTabla) ALTER COLUMN (lcNombreCampo) I
GO BOTTOM
lnUltInc = &lcNombreCampo
ALTER TABLE (lcTabla) ALTER COLUMN (lcNombreCampo) INT AUTOINC NEXTVALUE
iUltReg+1 STEP 1
RETURN 1
ENDFUNC
***********************************************************************************
*************
* tratamento de erro
Program-ID.. ..: ERRTRAP
* Purpose.. .. ..: General purpose error trap
PARAMETERS ErrNum, Msg, Code
* Called with: ON ERROR DO ERRTRAP WITH ERROR(),MESSAGE(),MESSAGE(1)
ON ERROR
SaveAlias = ALIAS()
SaveDB = SET("DATABASE")
SET DATABASE TO
SET MEMOWIDTH TO 80
IF NOT FILE ( "ERRORS.DBF")
CREATE TABLE ERRORS FREE ;
( Date D(8), Time C(5), Program C(50),;
ErrorNum N(4), Message C(240), BadCodeC (240))
ENDIF
IF NOT USED ( "ERRORS" )
SELECT 0
USE ERRORS
ENDIF
DIMENSION pROGnAME[10]
FOR i = 1 TO 10
ProgName[I] = SYS (16, I)
ENDFOR
*-------------------------------------------------------------*
*!*- FUNCTION ExporToCalc([cCursor], [cDestino], [cFileSave])
*!*- cCursor: Alias del cursor que se va a exportar.
*!*- cDestino: Nombre de la carpeta donde se va a grabar.
*!*- cFileName: Nombre del archivo con el que se va a grabar.
*-------------------------------------------------------------*
FUNCTION ExporToCalc(cCursor, cDestino, cFileSave)
LOCAL oManager, oDesktop, oDoc, oSheet, oCell, oRow, FileURL
LOCAL ARRAY laPropertyValue[1]
IF EMPTY(cCursor)
cCursor = ALIAS()
ENDIF
lColNum = AFIELDS(lColName,cCursor)
oManager = CREATEOBJECT("com.sun.star.ServiceManager.1")
oDesktop = oManager.createInstance("com.sun.star.frame.Desktop")
COMARRAY(oDesktop, 10)
oReflection = oManager.createInstance("com.sun.star.reflection.CoreReflection")
COMARRAY(oReflection, 10)
laPropertyValue[1] = createStruct(@oReflection,
"com.sun.star.beans.PropertyValue")
laPropertyValue[1].NAME = "ReadOnly"
laPropertyValue[1].VALUE= .F.
oSheet = oDoc.getSheets.getByIndex(0)
FOR i = 1 TO lColNum
oColumn = oSheet.getColumns.getByIndex(i)
oColumn.setPropertyValue("OptimalWidth", .T.)
WITH oDoc.CurrentSelection
.CellBackColor = RGB(200,200,200)
.Cell
.CharColor = RGB(255,0,0)
.CharHeight = 10
.CharPosture = 0
.CharShadowed = .F.
.FormulaLocal = lColName[i,1]
.HoriJustify = 2
.ParaAdjust = 3
.ParaLastLineAdjust = 3
ENDWITH
ENDFOR
oCell = oSheet.getCellByPosition( 0, 0 )
oDoc.CurrentController.SELECT(oCell)
laPropertyValue[1] = createStruct(@oReflection,
"com.sun.star.beans.PropertyValue")
laPropertyValue[1].NAME = "Overwrite"
laPropertyValue[1].VALUE = .T.
oDoc.STORE()
ENDFUNC
*-----------------
*- Reparar tabla -
*-----------------
FUNCTION _ReparaEncabezado(cTabla)
LOCAL nArea,nTamañoTabla,nRegistros,nTamañoencabezado,;
nTamañoRegistro,nRegistrosCalculados
nArea=FOPEN(cTabla,12)
nTamañoTabla=FSEEK(nArea,0,2)
nRegistros=_Lee(nArea, 4,4)
nTamañoEncabezado=_Lee(nArea, 8,2)
nTamañoRegistro=_Lee(nArea,10,2)
nRegistrosCalculados=FLOOR((nTamañoTabla-nTamañoEncabezado)/;
nTamañoRegistro)
IF nRegistrosCalculados#nRegistros
_Escribe(nArea,4,4,nRegistrosCalculados)
ENDIF
=FCLOSE(nArea)
ENDFUNC
*------------------
*- Lee encabezado -
*------------------
FUNCTION _Lee(nArea,nPosicion,nTamaño)
LOCAL cCadena,nValor,nSubInd
=FSEEK(nArea,nPosicion,0)
cCadena=FREAD(nArea, nTamaño)
nValor = 0
FOR nSubInd=0 TO nTamaño-1
nValor=nValor+ASC(SUBSTR(cCadena,nSubInd+1))*256^nSubInd
ENDFOR
RETURN INT(nValor)
ENDFUNC
*------------------------
*- Reescribe encabezado -
*------------------------
FUNCTION _Escribe(nArea,nPosicion,nTamaño,nNumero)
LOCAL cCadena,nSubInd
cCadena=''
FOR nSubInd=0 TO nTamaño-1
cCadena=cCadena+CHR(nNumero/256^nSubInd%256)
ENDFOR
=FSEEK(nArea, nPosicion,0)
RETURN FWRITE(nArea,cCadena)
ENDFUN
***********************************************************************************
*************
Permite actualizar la Aplicacion tanto en el equipo local como actualizar el
servidor donde esta la aplicacion a distribuir.
AGETFILEVERSION(ServerApp,"\\miservidor")
Version_Mayor = VAL(SUBSTR(ServerApp(4),1,1))
Version_Menor = VAL(SUBSTR(ServerApp(4),3,AT(ServerApp(4),".",1) + 1))
Version_Mantension = VAL(SUBSTR(ServerApp(4),5,2) )
AGETFILEVERSION(MiApp,"C:\Archivos de programa\CDP\CDP.exe")
MiVersion_Mayor = VAL(SUBSTR(miapp(4),1,1))
MiVersion_Menor = VAL(SUBSTR(miapp(4),3,AT(miapp(4),".",1) + 1))
MiVersion_Mantension = VAL(SUBSTR(miapp(4),5,2) )
*
IF !(MiVersion_Mayor = Version_Mayor.AND.MiVersion_Menor = Version_Menor ;
.AND.MiVersion_Mantension = Version_Mantension)
**** Actualizar
** Si soy yo copia al servidor
IF UPPER(ALLTRIM(SUBSTR(SYS(0),AT("#",SYS(0),1) + 1,LEN(SYS(0))))) = "miUsername"
MESSAGEBOX("Las Versiones Son: ServerApp -> " + ServerApp(4) + CHR(13) + ;
"Local App. ->" + miApp(4) + CHR(13) + "Actualizando el Servidor")
@ECHO OFF
@ECHO Actualizando Sistema xxxxxxx
@ECHO AUTOR.: Ludwig Corales M.
@ECHO Actualizado al : %DATE%
@xCopy \\soft\CDP.EXE "C:\Archivos de programa\CDP" /C /R /Y
@ECHO OFF
@ECHO Actualizando Sistema xxxxxxx
@ECHO AUTOR.: Ludwig Corales M.
@ECHO Actualizado al Servidor : %DATE%
@xCopy "C:\Archivos de programa\CDP\CDP.exe" \\soft\ /C /R /Y
***** Fin Contenido **********Notar que se comparan siempre tanto las versiones
mayores, menores y sub versiones, para ver si se actualiza o no.
***********************************************************************************
*************
Función para grabar CDs mediante WSH
* Ejemplo de uso:
=GrabarCD('D:\',.T.)
***************************************************************
* Esta función graba los datos que hay pendientes de
* grabar en la unidad de CD de Windows, mediante llamadas
* a funciones internas del SO, con la posibilidad de
* eliminar los datos después de realizar la grabación
*
* PARAMETROS:
* unidad(String) - Letra de la unidad donde está la grabadora
* (debe acabar con el carácter ':\' ).
* vaciar(Boolean) - Si es .T., borra los datos pendientes
* de la unidad de grabación.
* RETORNO: Esta función no devuelve nada.
***************************************************************
FUNCTION GrabarCD(MyCD,vaciar)
** Objecto APPLICATION
sApp = CREATEOBJECT("Shell.Application")
** Objecto SHELL
sh = CREATEOBJECT("WScript.Shell")
** Abrimos Mi PC
ns = sApp.NameSpace(17)
** Abrimos unidad de grabación
np = ns.ParseName(MyCD)
** Damos la orden de grabar el CD
np.InvokeVerbEx("Grabar estos arc&hivos en un CD")
** Iniciamos grabación
sh.appactivate("Asistente para grabación de CD")
sh.SendKeys("{Enter}")
IF vaciar == .T.
** Borramos los archivos del directorio temporal de grabación de CD's
MyTarget = sh.regread("HKCU\Software\Microsoft\Windows\" + ;
"CurrentVersion\Explorer\Shell Folders\CD Burning")
deltree(MyTarget,.F.)
** Liberamos el objecto SHELL
RELEASE sh
ENDIF
ENDFUNC
***********************************************************************************
*************
** Creo un Cursor con los datos del Menu,
** puede ser una tabla ya predefinida
** se pueden agregar mas campos, como por ej: imagen, parametros, usuarios, etc
INSERT INTO cMiMenu (Nivel, Nombre, DoWhat) ;
VALUES ('0001_', 'Padre 1', ' ')
INSERT INTO cMiMenu (Nivel, Nombre, DoWhat) ;
VALUES ('0002_', 'Padre 2', ' ')
INSERT INTO cMiMenu (Nivel, Nombre, DoWhat) ;
VALUES ('0001_0001_', 'Hijo 1', 'DO FORM \FRM\Hijo1.scx')
INSERT INTO cMiMenu (Nivel, Nombre, DoWhat) ;
VALUES ('0002_0001_','Hijo 2',' ')
INSERT INTO cMiMenu (Nivel, Nombre, DoWhat) ;
VALUES ('0002_0001_0001_', 'Hijo de Hijo 2', 'DO \PRG\hijo_de_hijo2.prg')
PUBLIC oForm
oForm = NEWOBJECT("Form1")
oForm.SHOW
TOP = 10
LEFT = 100
HEIGHT = 360
WIDTH = 360
DOCREATE = .T.
CAPTION = "Menu con TreeView y DobleClick"
NAME = "Form1"
MINWIDTH = 100
MINHEIGHT = 100
PROCEDURE Olecontrol1.DBLCLICK
SELECT cMiMenu
LOCATE FOR cMiMenu.Nivel = THIS.SELECTEDITEM.KEY
IF FOUND()
IF LEN(ALLTRIM(cMiMenu.DoWhat)) > 1
WAIT WINDOW + cMiMenu.DoWhat
ENDIF
ENDIF
ENDPROC
PROCEDURE RESIZE
THIS.Olecontrol1.WIDTH = THIS.WIDTH - 20
THIS.Olecontrol1.HEIGHT = THIS.HEIGHT - 20
ENDPROC
PROCEDURE Olecontrol1.INIT
LOCAL lcNivel,lcTexto,lnTipo,lnResta
THISFORM.Olecontrol1.LineStyle = 1
THISFORM.Olecontrol1.LabelEdit = 1
THISFORM.Olecontrol1.FullRowSelect = .T.
THISFORM.Olecontrol1.HotTracking = .T.
SELECT cMiMenu
GO TOP
DO WHILE !EOF()
lcNivel = ALLTRIM(cMiMenu.Nivel)
lcTexto = ALLTRIM(cMiMenu.Nombre)
IF LEN(ALLTRIM(lcNivel)) = 5
** Cuando el valor del LEN() = 5 asumo que es un nodo raiz
lnTipo = 0
THISFORM.Olecontrol1.Nodes.ADD(, lnTipo, lcNivel, lcTexto,,)
ELSE
** si LEN() > 5 es un hijo, siempre multiplos de 5
lnTipo=4
lnResta = LEN(ALLTRIM(Nivel)) - 5
lcKey = SUBSTR(ALLTRIM(lcNivel), 1, lnResta)
THISFORM.Olecontrol1.Nodes.ADD(lcKey, lnTipo, lcNivel, lcTexto,,)
ENDIF
SKIP
ENDDO
ENDPROC
ENDDEFINE
***********************************************************************************
*************
* Fechar o PENDRIVE
lo = CREATEOBJECT("Shell.Application")
lo.ControlPanelItem("hotplug.dll")
lo = NULL
***********************************************************************************
*************
* Interromper um processo
oForm = CREATEOBJECT([Form1])
oForm.SHOW(1)
DOCREATE = .T.
bcancelloop = .F.
NAME = "form1"
ADD OBJECT command1 AS COMMANDBUTTON WITH ;
TOP = 125, ;
LEFT = 8, ;
HEIGHT = 27, ;
WIDTH = 111, ;
CAPTION = "Start Loop", ;
NAME = "Command1"
PROCEDURE command1.CLICK
THISFORM.bcancelloop = .F.
lnCounter = 0
DO WHILE .T.
lnCounter = lnCounter + 1
THISFORM.label1.CAPTION = TRANSFORM(lnCounter)
DOEVENTS
IF THISFORM.bcancelloop
THISFORM.label1.CAPTION = [Loop is canceled]
EXIT
ENDIF
ENDDO
ENDPROC
PROCEDURE command2.CLICK
THISFORM.bcancelloop = .T.
ENDPROC
ENDDEFINE
***********************************************************************************
*************
* Colunas do EXCEL
FUNCTION Num2ExcelColumn(tn)
RETURN IIF(tn > 26, ;
CHR(64 + FLOOR((tn - 1) / 26)), "") + ;
CHR(64 + MOD(tn - 1, 26) + 1)
ENDFUNC
***********************************************************************************
*************
* Mostrar termometro de progresso utilizando SQLEXEC
*****
LOCAL loTherm, lcTask, lnPercent, lnSeconds
cRuta="clases\_therm"
**_thermometer es la clase ejemplo que se encuentra en Samples
loTherm = NEWOBJECT("_thermometer",cRuta,"","Creando Tabla")
lcTask = "Consultando..."
loTherm.SHOW()
lc_time=0
SQLSETPROP(lc_con,"Asynchronous",.T.)
m.nresult= SQLEXEC(m.lc_con,"SELECT * FROM Repuesto","repuesto")
DO WHILE SQLEXEC(m.lc_con) = 0
lc_time=lc_time+1
loTherm.UPDATE(lc_time, lcTask+" "+TRANS(lc_time))
ENDDO
lotherm.COMPLETE()
SQLSETPROP(lc_con,"Asynchronous",.F.)
***********************************************************************************
*************
*Indexar arquivos
***********************************************************************************
*************
*==========================================================
* Demarrer une application Windows ou Dos à partir de VFP
* et attendre la fin de l'application pour redonner la main de VFP.
* On peut attendre le thread ou pas.
* Auteur : Hamou Olivier
*==========================================================
oShell = createobject("WScript.Shell")
* Paramètres
* 1- m.cCheminDeMonAppli && le Chemin de votre appli
* 2- Le mode de fenetrage
* 3- Boolean pour .T. on attend le thread , .F. on attend pas le thread le code
passe à la suite.
* Renvoi 0 si c'est Ok
ExecOk = oShell.Run(m.cCheminDeMonAppli, 0,.T.)
oShell = Null
***********************************************************************************
*************
* Mover o Grid Vertical com ENTER
IF LASTKEY() = 13
CLEAR TYPEAHEAD
KEYBOARD '#' CLEAR
SKIP
Thisform.Grid1.Refresh()
Thisform.Grid1.ColumnX.SetFocus()
ENDIF
***********************************************************************************
*************
Criando um campo memo em uma selacao com VFP9
***********************************************************************************
*************
Matando um processo
FUNCTION KillProcess(lcExe)
oWMI = GETOBJECT("winmgmts://")
loProcesses = oWMI.InstancesOf("Win32_Process")
lcExe = LOWER(lcEXE)
RETURN .F.
***********************************************************************************
*************
LINK PARA BAIXAR O WSH
http://msdn.microsoft.com/library/default.asp?url=/downloads/list/webdev.asp
Windows NT/98/ME:
http://download.microsoft.com/download/4/c/9/4c9e63f1-617f-4c6d-8faf-
c2868f670c1c/scr56en.exe
Windows 2000/XP:
http://download.microsoft.com/download/2/8/a/28a5a346-1be1-4049-b554-
3bc5f3174353/scripten.exe
***********************************************************************************
*************
SABER SE O WSH - WINDOWS SCRIPTING HOST ESTÁ INSTALADO NA MÁQUINA
Código:
oShell = CREATEOBJECT('Shell.Application')
IF TYPE('oShell') = 'O' AND NOT ISNULL(oShell)
MESSAGEBOX("WSH Instalado !!!")
ENDIF
***********************************************************************************
*************
ABRIR / FECHAR UNIDADE DE CD
Código:
DECLARE integer mciSendString IN WINMM.DLL string, string, integer, integer
**Para abrir
? mciSendString('set cdaudio door open wait',"",0,0)
**Para Fechar
? mciSendString("set cdaudio door closed","",0,0)
***********************************************************************************
*************
VERIFICAR DE DISQUETE ESTA NO DRIVE A:
Código:
oFSO = CREATEOBJECT("Scripting.FileSystemObject")
? oFSO.FolderExists("A:\")
Código:
oFSO = CREATEOBJ('Scripting.FileSystemObject')
oDrive = oFSO.GetDrive("C:")
? TRANSFORM(oDrive.AvailableSpace,"999,999,999,999")
***********************************************************************************
*************
SABER NOME DO USUÁRIO LOGADO NO WINDOWS
Código:
declare integer GetUserName in advapi32 String@, Integer@
lcnomeusuario = replicate(chr(0),255)
lres = getusername(@lcnomeusuario,255)
if lres # 0 then
messagebox(left(lcnomeusuario,at(chr(0),lcnomeusuario)-1))
endif
Código:
FUNCTION _ExistFont(tcFont)
LOCAL laArray(1), lnI, llRet
llRet = .F.
IF AFONT(laArray)
tcFont = UPPER(tcFont)
FOR lnI = 1 TO ALEN(laArray)
IF UPPER(laArray(lnI)) == tcFont
llRet = .T.
EXIT
ENDIF
ENDFOR
ELSE
MESSAGEBOX('Fonte não instalada')
ENDIF
RETURN llRet
ENDFUNC
Código:
DECLARE LONG DllRegisterServer IN [arquivo.ocx]
IF DllRegisterServer() = 0
messagebox('REGISTRADO !!!')
ELSE
messagebox('NÃO REGISTRADO !!!')
ENDIF
***********************************************************************************
*************
CRIAR UMA CONEXÃO COM IMPRESSORA DA REDE
Código:
oNet = createobject('WScript.Network')
oNet.AddWindowsPrinterConnection('\\Servidor\nomeimpressora')
***********************************************************************************
*************
MUDAR DATA E HORA DO COMPUTADOR
Código:
DECLARE INTEGER ShellExecute IN shell32.dll ;
INTEGER hndWin, STRING cAction, STRING cFileName, ;
STRING cParams, STRING cDir, INTEGER nShowWin
lcComm = "date"
lcParams = "21-07-2007"
ShellExecute(0,"open",lcComm,lcParams,"",1)
***********************************************************************************
*************
DESMAPEANDO OU DESCONECTANDO UNIDADE DE REDE
Código:
** parâmetros :
** 1 - "drive" a desmapear
** 2 - Forçar ou não a desconexão mesmo que esteja em uso
** 3 - .T. para que o sistema "lembre" do mapeamento ao reinicializar
oNet = CREATEOBJECT("WScript.Network")
oNet.RemoveNetworkDrive('J:',.T.,.T.)
RELEASE oNet
***********************************************************************************
*************
MAPEANDO UNIDADES DE REDE
Código:
** parâmetros :
** 1 - "drive" a mapear
** 2 - caminho da rede
** 3 - .T. para que o sistema "lembre" do mapeamento ao reinicializar
** 4 - nome do usuário (opcional)
** 5 - senha do usuário (opcional)
oNet = CREATEOBJECT('Wscript.Network')
oNet.MapNetworkDrive('J:','\\Servidor\pastadocumentos\',.t.)
RELEASE oNet
***********************************************************************************
*************
MOVER UMA PASTA (OU RENOMEAR)
Código:
** parâmetros :
** 1 - origem
** 2 - destino
IF DIRECTORY('c:\diretorioteste\teste')
fso = CREATEOBJECT('Scripting.FileSystemObject')
fso.MoveFolder("C:\\diretorioteste\\teste", "C:\\novodiretorio\\zzz")
RELEASE fso
ENDIF
Código:
** parâmetros :
** 1 - origem
IF DIRECTORY('c:\diretorioteste\teste')
fso = CREATEOBJECT('Scripting.FileSystemObject')
fso.DeleteFolder("C:\\diretorioteste\\teste")
RELEASE fso
ENDIF
Código:
** parâmetros :
** 1 - origem
** 2 - destino
** 3 - sobreescrever - default = .T.
IF DIRECTORY('c:\diretorioteste\teste')
fso = CREATEOBJECT('Scripting.FileSystemObject')
fso.CopyFolder("C:\\diretorioteste\\teste", "C:\\novodiretorio\\zzz", .T.)
RELEASE fso
ENDIF
***********************************************************************************
*************
COMO CRIAR UM ATALHO
Código:
WshShell = CreateObject("WScript.Shell")
oShortCut= WshShell.CreateShortcut("MeuAtalho.lnk")
oShortCut.TargetPath = 'c:\arquivo.bat'
oShortCut.WorkingDirectory = 'c:'
oShortCut.Save
***********************************************************************************
*************
CRIAR UM ATALHO NA ÁREA DE TRABALHO
Código:
oShell = CreateObject('WScript.Shell')
DesktopPath = oShell.SpecialFolders('Desktop')
oURL = oShell.CreateShortcut(DesktopPath + 'MSDN Scripting.URL')
oURL.TargetPath = 'HTTP://MSDN.Microsoft.com/scripting/'
oURL.Save
***********************************************************************************
*************
--------------------------------------------------------------------------------
Código:
Declare Integer CoCreateGuid In 'OLE32.dll' ;
string @pguid
Declare Integer StringFromGUID2 In 'OLE32.dll' ;
string rguid, String @lpsz, Integer cchMax
Declare Integer UuidCreateSequential In 'RPCRT4.dll' String @ Uuid
pGUID=Replicate(Chr(0),16)
rGUID=Replicate(Chr(0),80)
lcOldError = On('error')
On Error lnResult = CoCreateGuid(@pGUID)
lnResult = UuidCreateSequential(@pGUID)
On Error &lcOldError
lcMacAddress = Substr( Iif( lnResult = 0 And ;
StringFromGUID2(pGUID,@rGUID,40) # 0, ;
StrConv(Left(rGUID,76),6), "" ), 26,12)
? m.lcMacAddress
***********************************************************************************
*************
OBTER POSIÇÃO DO MOUSE NA TELA
Código:
DECLARE INTEGER GetCursorPos IN user32 STRING @ lpPoint
LOCAL lcBuffer
lcBuffer = REPLI(CHR(0), 8)
= GetCursorPos (@lcBuffer)
x = CTOBIN(SUBSTR(lcBuffer, 1,4),"4rs")
y = CTOBIN(SUBSTR(lcBuffer, 5,4),"4rs")
***********************************************************************************
*************
* Mostrando imagem de satelite
PUBLIC oMiForm
oMiForm = CREATEOBJECT("MiForm")
oMiForm.SHOW
RETURN
PROCEDURE LOAD
SYS(2333,1)
THIS.SetPoint = SET("Point")
SET POINT TO .
SET SAFETY OFF
*-- Creo el cursor con los datos
CREATE CURSOR MisLugares (Descri C(40), Lat N(12,6), Lon N(12,6), Zoom I(4))
INSERT INTO MisLugares VALUES ("Torre Eiffel (Francia)", 48.858333, 2.295000,
20)
INSERT INTO MisLugares VALUES ("Basílica de San Pedro (Vaticano)", 41.902102,
12.456400, 16)
INSERT INTO MisLugares VALUES ("Estatua de la Libertad (EEUU)", 40.689360,
-74.044400, 20)
INSERT INTO MisLugares VALUES ("Estadio Monumental (Argentina)", -34.545277,
-58.449722, 20)
INSERT INTO MisLugares VALUES ("Estadio Azteca (Mexico)", 19.302900,
-99.150400, 20)
INSERT INTO MisLugares VALUES ("Estadio Camp Nou (España)", 41.380906,
2.123330, 20)
INSERT INTO MisLugares VALUES ("Cementerio de aviones (EEUU)", 32.174247,
-110.855874, 17)
ENDPROC
PROCEDURE DESTROY
SET POINT TO (THIS.SetPoint)
ENDPROC
PROCEDURE cboDescrip.INIT
THIS.LISTINDEX = 1
ENDPROC
PROCEDURE cmdMostrar.CLICK
TEXT TO lcHtml NOSHOW TEXTMERGE
<html> <head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Maps</title>
<script src="http://maps.google.com/maps?file=api&v=2&key=123"
type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function load()
{ if (GBrowserIsCompatible())
{ var map = new GMap2(document.getElementById("map"),G_SATELLITE_TYPE);
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
map.addControl(new GOverviewMapControl());
map.setCenter(new GLatLng(<<ALLTRIM(STR(MisLugares.Lat,12,6))>>,
<<ALLTRIM(STR(MisLugares.Lon,12,6))>>),<<TRANSFORM(MisLugares.Zoom)>>);
map.setMapType(G_HYBRID_TYPE);
} }
//]]> </script> </head>
<body scroll="no" bgcolor="#CCCCCC" topmargin="0" leftmargin="0"
onload="load()" onunload="GUnload()">
<div id="map" style="width:450px;height:300px"></div>
</body> </html>
ENDTEXT
STRTOFILE(lcHtml,"MiHtml.htm")
THISFORM.oleIE.Navigate2(FULLPATH("MiHtml.htm"))
ENDPROC
ENDDEFINE
***********************************************************************************
*************
* Busca por arquivos graficos em codrefence
(\.ani)|(\.bmp)|(\.cur)|(\.dib)|(\.emf)|(\.exif)|
(\.gif)|(\.gfa)|(\.ico)|(\.jpg)|(\.jpeg)|(\.jpe)|
(\.jfif)|(\.png)|(\.tif)|(\.tiff)|(\.wmf)
***********************************************************************************
*************
*Importacao de dados para EXCEL
********************************************************************
********************************************************************
*!* FUNCTION Exp2Excel( [cCursor, [cFileSave, [cTitulo]]] )
*!*
*!* Exporta un Cursor de Visual FoxPro a Excel, utilizando la
*!* técnica de importación de datos externos en modo texto.
*!*
*!* PARAMETROS OPCIONALES:
*!* - cCursor Alias del cursor que se va a exportar.
*!* Si no se informa, utiliza el alias
*!* en que se encuentra.
*!*
*!* - cFileName Nombre del archivo que se va a grabar.
*!* Si no se informa, muestra el libro generado
*!* una vez concluída la exportación.
*!*
*!* - cTitulo Titulo del informe. Si se informa, este
*!* ocuparía la primera file de cada hoja del libro.
********************************************************************
********************************************************************
FUNCTION Exp2Excel( cCursor, cFileSave, cTitulo )
LOCAL cWarning
cWarning = "Exportar a EXCEL"
IF EMPTY(cCursor)
cCursor = ALIAS()
ENDIF
IF TYPE('cCursor') # 'C' OR !USED(cCursor)
MESSAGEBOX("Parámetros Inválidos",16,cWarning)
RETURN .F.
ENDIF
*********************************
*** Creación del Objeto Excel ***
*********************************
WAIT WINDOW 'Abriendo aplicación Excel.' NOWAIT NOCLEAR
oExcel = CREATEOBJECT("Excel.Application")
WAIT CLEAR
IF TYPE('oExcel') # 'O'
MESSAGEBOX("No se puede procesar el archivo porque no tiene la aplicación" ;
+ CHR(13) + "Microsoft Excel instalada en su computador.",16,cWarning)
RETURN .F.
ENDIF
oExcel.workbooks.ADD
SELECT (cCursor)
lnRecno = RECNO(cCursor)
GO TOP
*************************************************
*** Verifica la cantidad de hojas necesarias ***
*** en el libro para la cantidad de datos ***
*************************************************
lnHojas = ROUND(RECCOUNT(cCursor)/65000,0)
DO WHILE oExcel.Sheets.COUNT < lnHojas
oExcel.Sheets.ADD
ENDDO
lnPos = 0
lnPag = 0
oExcel.Sheets(lnPag).SELECT
XLSheet = oExcel.ActiveSheet
XLSheet.NAME = cCursor + '_' + ALLTRIM(STR(lnPag))
lnCuantos = AFIELDS(aCampos,cCursor)
********************************************************
*** Coloca título del informe (si este es informado) ***
********************************************************
IF !EMPTY(cTitulo)
XLSheet.Cells(1,1).FONT.NAME = "Arial"
XLSheet.Cells(1,1).FONT.SIZE = 12
XLSheet.Cells(1,1).FONT.BOLD = .T.
XLSheet.Cells(1,1).VALUE = cTitulo
XLSheet.RANGE(XLSheet.Cells(1,1),XLSheet.Cells(1,lnCuantos)).MergeCells = .T.
XLSheet.RANGE(XLSheet.Cells(1,1),XLSheet.Cells(1,lnCuantos)).Merge
XLSheet.RANGE(XLSheet.Cells(1,1),XLSheet.Cells(1,lnCuantos)).HorizontalAlignment =
3
lnRowPos = 3
ELSE
lnRowPos = 2
ENDIF
lnRowTit = lnRowPos - 1
**********************************
*** Coloca títulos de Columnas ***
**********************************
FOR i = 1 TO lnCuantos
lcName = aCampos(i,1)
lcCampo = ALLTRIM(cCursor) + '.' + aCampos(i,1)
XLSheet.Cells(lnRowTit,i).VALUE=lcname
XLSheet.Cells(lnRowTit,i).FONT.bold = .T.
XLSheet.Cells(lnRowTit,i).Interior.ColorIndex = 15
XLSheet.Cells(lnRowTit,i).Interior.PATTERN = 1
XLSheet.RANGE(XLSheet.Cells(lnRowTit,i),XLSheet.Cells(lnRowTit,i)).BorderAround(7)
NEXT
XLSheet.RANGE(XLSheet.Cells(lnRowTit,1),XLSheet.Cells(lnRowTit,lnCuantos)).Horizont
alAlignment = 3
*************************
*** Cuerpo de la hoja ***
*************************
oConnection = XLSheet.QueryTables.ADD("TEXT;" + cDefault + cCursor + ".txt",
;
XLSheet.RANGE("A" + ALLTRIM(STR(lnRowPos))))
WITH oConnection
.NAME = cCursor
.FieldNames = .T.
.RowNumbers = .F.
.FillAdjacentFormulas = .F.
.PreserveFormatting = .T.
.RefreshOnFileOpen = .F.
.RefreshStyle = 1 && xlInsertDeleteCells
.SavePassword = .F.
.SaveData = .T.
.AdjustColumnWidth = .T.
.RefreshPeriod = 0
.TextFilePromptOnRefresh = .F.
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = 1 && xlDelimited
.TextFileTextQualifier = 1 && xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = .F.
.TextFileTabDelimiter = .F.
.TextFileSemicolonDelimiter = .T.
.TextFileCommaDelimiter = .F.
.TextFileSpaceDelimiter = .F.
.TextFileTrailingMinusNumbers = .T.
.REFRESH
ENDWITH
XLSheet.RANGE(XLSheet.Cells(lnRowTit,1),XLSheet.Cells(XLSheet.ROWS.COUNT,lnCuantos)
).FONT.NAME = "Arial"
XLSheet.RANGE(XLSheet.Cells(lnRowTit,1),XLSheet.Cells(XLSheet.ROWS.COUNT,lnCuantos)
).FONT.SIZE = 8
XLSheet.COLUMNS.AUTOFIT
XLSheet.Cells(lnRowPos,1).SELECT
oExcel.ActiveWindow.FreezePanes = .T.
WAIT CLEAR
ENDDO
oExcel.Sheets(1).SELECT
oExcel.Cells(lnRowPos,1).SELECT
IF !EMPTY(cFileSave)
oExcel.DisplayAlerts = .F.
oExcel.ActiveWorkbook.SAVEAS(cFileSave)
oExcel.QUIT
ELSE
oExcel.VISIBLE = .T.
ENDIF
GO lnRecno
RELEASE oExcel,XLSheet,oConnection
RETURN .T.
ENDFUNC
***
***
***********************************************************************************
*************
**** Como detectar uma impressora matricial
#DEFINE DC_BINS 6
#DEFINE DMBIN_TRACTOR 8
CLEAR
DIMENSION asPrn[1]
FOR nPrn = 1 TO APRINTERS(asPrn)
sPrn = asPrn[nPrn, 1]
? PADR(sPrn,25), " ", IIF(IsDotPrinter (sPrn), "Matriz", "")
NEXT
RETURN
PROCEDURE Init
DECLARE INTEGER GetKeyboardState IN WIN32API STRING @ sStatus
DECLARE INTEGER GetCursorPos IN WIN32API STRING @ sPos
DECLARE INTEGER GetForegroundWindow IN WIN32API
ENDPROC
PROCEDURE Destroy
CLEAR DLLS GetKeyboardState, GetCursorPos, GetForegroundWindow
ENDPROC
PROCEDURE Timer
WITH This
IF ! .CheckActivity()
* Si no hubo actividad veo si es tiempo de disparar OnInactivity
IF ! ISNULL(.LastActivity) AND ;
DATETIME() - .LastActivity > .InactivityInterval
.LastActivity = NULL && Prevengo disparo múltiple de OnInactivity
.OnInactivity()
ENDIF
ENDIF
ENDWITH
ENDPROC
PROCEDURE OnInactivity
WAIT WINDOW "Inactividad a las " + TIME() NOWAIT
ENDPROC
* Hubo actividad
PROCEDURE OnActivity
WAIT WINDOW "Actividad a las " + TIME() NOWAIT
ENDPROC
ENDDEFINE
***********************************************************************************
*************
* Chaves possiveis para um cadeia de caracteres
CLEAR
nn=0
permute("abcd",0)
Procedure permute(cstr,nLev)
Local nTrylen,i
nTrylen= Len(cstr)-nLev
If nTrylen = 0
nn=nn+1
? nn ,cstr
Else
For i = 1 To nTrylen
If i>1 && swap nlev+1 and nlev+i chars
cstr= Left(cstr,nLev) + Substr(cstr,nLev+i,1) +;
Substr(cstr,nLev+2, i-2)+Substr(cstr,nLev+1,1)+Substr(cstr,nLev+i+1)
Endif
permute(cstr,nLev+1)
Endfor
Endif
Return
***********************************************************************************
*************
Como configurar uma entrada de campo numerico (get) de forma que se alguem digitar
187,89 ou 187.89 ele aceitar ambos os formatos
se o SET POINT TO estiver com ponto coloque no keypress do text o seguinte codigo
***********************************************************************************
*************
Indexar uma tabela SHARED
Caros Colegas,
Existe sim forma de ser organizar tabelas mesmo em ums sitema multiusuario, mesmo
com a tabela estando aberta em outro terminal basta usar da seguinte forma.
Código:
exemplo
no caso ele ira criar no na pasta TEMP o arquivo Clientes.idx usando o campo
CodClie.
***********************************************************************************
*************
** PLAY AVI
** Para USAR
SET PROCEDURE TO ClasseAvi additive
ThisForm.addobject("OAvi1", "AVI")
ThisForm.oAvi1.PlayAvi(Thisform.ShapeAvi1, "filecopy.avi")
Code source :
*----------------------------------------------------------------------
* ClasseAvi
* PayAvi : But afficher un AVI dans un formulaire avec gestion de la couleur de
fond (Transparence)
* sans utiliser (Directement) le MMcontrol
* Francis FAURE 6/2006
*----------------------------------------------------------------------
* 1.0 : Publication
* 1.1 : Ajout Méthode "StopAvi", Correction pb chargement dll dans le init,
* Stop AVI et suppression de la fenétre au destroy() de l'objet
*----------------------------------------------------------------------
DEFINE CLASS AVI as Session
version = 1.1
x = 0
y = 0
w = 0
h = 0
FormHwnd = 0
AviHwnd = 0
BackColor = 0
BackStyle = 1
Shape = null
AviFileName = ""
PROCEDURE Init
Endproc
Procedure Destroy
This.StopAvi() && v 1.1
DODEFAULT()
endproc
* v 1.1
PROCEDURE StopAvi
IF This.AviHwnd<>0
Declare LONG SendMessage IN user32 Long, Long, Long, String
Declare long DestroyWindow IN user32 Long
#define ACM_STOP WM_USER + 102
=SendMessage(This.AviHwnd, ACM_STOP, 0, "")
=DestroyWindow(this.AviHwnd)
This.AviHwnd=0 && permet de savoir si un avi est en cours
This.AviFileName=""
CLEAR DLLS DestroyWindow
CLEAR DLLS SendMessage
endif
endproc
ENDDEFINE
*----------------------------------------------------------------------
***********************************************************************************
*************
* RunDll32.exe para acessar funcoes do WINDOWS
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,0")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe shell32.dll,Control_RunDLL access.cpl,,3")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe shell32.dll,Control_RunDLL access.cpl,,2")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe shell32.dll,Control_RunDLL")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe DISKCOPY.DLL,DiskCopyRunDll")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe SHELL32.DLL,SHFormatDrive")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe SHELL32.DLL,SHHelpShortcuts_RunDLL FontsFolder")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe shell32.dll,Control_RunDLL hdwwiz.cpl")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe shell32.dll,Control_RunDLL main.cpl @0")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe netplwiz.dll,AddNetPlaceRunDll")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe shell32.dll,SHHelpShortcuts_RunDLL Connect")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe shell32.dll,Control_RunDLL odbccp32.cpl")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe keymgr.dll,PRShowSaveWizardExW")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe keymgr.dll,PRShowRestoreWizardExW")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe WINSPOOL.DRV,ConnectToPrinterDlg")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe SHELL32.DLL,SHHelpShortcuts_RunDLL PrintersFolder")
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe shell32.dll,Control_RunDLL telephon.cpl")
oShell = CreateObject("WScript.Shell")
oShell.run("rundll32.exe %SystemRoot%\System32\netplwiz.dll,UsersRunDll")
&& Ouvrir l'interface du FireWall de Windows
oShell = CreateObject("WScript.Shell")
oShell.run("RunDll32.exe shell32.dll,Control_RunDLL firewall.cpl")
***********************************************************************************
*************
Picture em LISTBOX e COMBOBOX
****
PUBLIC goMiForm
goMiForm = CREATEOBJECT("MiForm")
goMiForm.SHOW(1)
RETURN
SetTime("\\ServerName\SharedDIsk")
FUNCTION SetTime(l_path)
LOCAL c_creatf, m1, cDate, cTime
c_creatf = ADDBS(l_path) + SYS(2015) + ".TIM"
m1 = FCREATE(c_creatf)
IF m1 > 0
FCLOSE(m1)
m1 = ADIR(cTim, c_creatf)
ERASE (c_creatf)
cDate = cTim[1,3]
cTime = cTim[1,4]
cBuff = Num2WORD(YEAR(cDate))
cBuff = cBuff + Num2WORD(MONTH(cDate))
cBuff = cBuff + Num2WORD(1) && Day of week, ignored
cBuff = cBuff + Num2WORD(DAY(cDate))
cBuff = cBuff + Num2WORD(VAL(LEFT(cTime,2)))
cBuff = cBuff + Num2WORD(VAL(SUBSTR(cTime,4,2)))
cBuff = cBuff + Num2WORD(VAL(RIGHT(cTime,2)))
cBuff = cBuff + Num2WORD(0)+CHR(0)
DECLARE INTEGER SetLocalTime IN WIN32API STRING @cBuff
SetLocalTime(@cBuff)
ENDIF
RETURN
FUNCTION Num2WORD
LPARAMETER tnNum
LOCAL x
x=INT(tnNum)
RETURN CHR(MOD(x,256))+CHR(INT(x/256))
***********************************************************************************
*************
*TRAMENTO DE DATAS API
*
CLEAR
? CDATEEX(DATE(),1)
? CDATEEX(DATE(),2)
?
FOR i = 1 TO 12
? CDATEEX(DATE(2007,i,1),2)
ENDFOR
?
? CDOWEX(DATE(2007,1,1),1), CDOWEX(1,2)
? CDOWEX(DATE(2007,1,2),1), CDOWEX(2,2)
? CDOWEX(DATE(2007,1,3),1), CDOWEX(3,2)
? CDOWEX(DATE(2007,1,4),1), CDOWEX(4,2)
? CDOWEX(DATE(2007,1,5),1), CDOWEX(5,2)
? CDOWEX(DATE(2007,1,6),1), CDOWEX(6,2)
? CDOWEX(DATE(2007,1,7),1), CDOWEX(7,2)
?
FOR i = 1 TO 12
? CMONTHEX(i,1), CMONTHEX(i,2)
ENDFOR
?
? CMONTHEX(DATE(2007,12,7),1), CMONTHEX(12,2)
?
? TRANSFORM(DAY(DATE())) + [/] + CMONTHEX(DATE(),1) + ;
[/] + TRANSFORM((YEAR(DATE())))
RETURN
*
*****
* CDOWEX(dDate, nFormat)
* dDate: expresión de fecha/fechahora/dia de la semana
* nFormat: 1/S/C = nombre de dia abreviado,
* 2/L = nombre de dia completo (Default)
*****
FUNCTION CDOWEX
PARAMETERS tdDate, tnFormat
DeclareDlls()
LOCAL lnType, lcBuffer, lnBufferLen, lnRetVal
IF VARTYPE(m.tnFormat) = [C] AND UPPER(m.tnFormat) $ "SC" THEN
m.tnFormat = 1
ENDIF
IF NOT VARTYPE(m.tnFormat) = [N] THEN
m.tnFormat = 2
ENDIF
IF NOT BETWEEN(m.tnFormat, 1, 2) THEN
m.tnFormat = 2
ENDIF
IF VARTYPE(m.tdDate) = [N] AND BETWEEN(m.tdDate, 1, 7)
m.lnType = m.tdDate + IIF(m.tnFormat = 1, 48, 41)
ELSE
IF NOT VARTYPE(m.tdDate) $ [DT] THEN
m.tdDate = DATE()
ENDIF
m.lnType = DOW(m.tdDate,2) + IIF(m.tnFormat = 1, 48, 41)
ENDIF
m.lcBuffer = SPACE(254)
lnRetVal = GetLocaleInfo(1024, m.lnType, @m.lcBuffer, 254)
m.lcBuffer = LEFT(m.lcBuffer, m.lnRetVal - 1)
RETURN m.lcBuffer
ENDFUNC
*****
* CMONTHEX(dDate, nFormat)
* dDate: expresión de fecha/fechahora/numero de mes
* nFormat: 1/S/C = nombre de mes abreviado,
* 2/L = nombre de mes completo (Default)
*****
FUNCTION CMONTHEX
PARAMETERS tdDate, tnFormat
DeclareDlls()
LOCAL lnType, lcBuffer, lnBufferLen, lnRetVal
IF VARTYPE(m.tnFormat) = [C] AND UPPER(m.tnFormat) $ "SC" THEN
m.tnFormat = 1
ENDIF
IF NOT VARTYPE(m.tnFormat) = [N] THEN
m.tnFormat = 2
ENDIF
IF NOT BETWEEN(m.tnFormat, 1, 2) THEN
m.tnFormat = 2
ENDIF
IF VARTYPE(m.tdDate) = [N] AND BETWEEN(m.tdDate, 1, 12)
m.lnType = m.tdDate + IIF(m.tnFormat = 1, 67, 55)
ELSE
IF NOT VARTYPE(m.tdDate) $ [DT] THEN
m.tdDate = DATE()
ENDIF
m.lnType = MONTH(m.tdDate) + IIF(m.tnFormat = 1, 67, 55)
ENDIF
m.lcBuffer = SPACE(254)
lnRetVal = GetLocaleInfo(1024, m.lnType, @m.lcBuffer, 254)
m.lcBuffer = LEFT(m.lcBuffer, m.lnRetVal - 1)
RETURN m.lcBuffer
ENDFUNC
*****
* CDATEEX(dDate, nFormat)
* dDate: expresión de fecha/fechahora
* nFormat: 1/S/C = formato de fecha corta,
* 2/L = formato de fecha larga (Default)
*****
FUNCTION CDATEEX
PARAMETERS tdDate, tnFormat
DeclareDlls()
LOCAL lcDate, lcBuffer, lnBufferLen, lnRetVal
IF NOT VARTYPE(m.tdDate) $ [DT] THEN
m.tdDate = DATE()
ENDIF
IF VARTYPE(m.tnFormat) = [C] AND UPPER(m.tnFormat) $ "SC" THEN
m.tnFormat = 1
ENDIF
IF NOT VARTYPE(m.tnFormat) = [N] THEN
m.tnFormat = 2
ENDIF
IF NOT BETWEEN(m.tnFormat,1,2) THEN
m.tnFormat = 2
ENDIF
m.lcDate = ShortToBin(YEAR(m.tdDate)) + ;
ShortToBin(MONTH(m.tdDate)) + ;
ShortToBin(DOW(m.tdDate,2)) + ;
ShortToBin(DAY(m.tdDate)) + ;
REPLICATE(CHR(0),8)
m.lcBuffer = SPACE(254)
m.lnBufferLen = 254
m.lnRetVal = GetDateFormat_CDATEEX(1024, m.tnFormat, ;
@m.lcDate, 0, @m.lcBuffer, m.lnBufferLen)
m.lcBuffer = LEFT(m.lcBuffer, m.lnRetVal - 1)
RETURN m.lcBuffer
ENDFUNC
*****
* DeclareDlls
* Declara las funciones API usadas por CDOWEX, CMONTHEX, CDATEEX
*****
PROCEDURE DeclareDlls
LOCAL laDlls(1,3), lnLen AS NUMBER
m.lnLen = ADLLS(laDlls )
IF ASCAN(laDlls, "GetDateFormat_CDATEEX", 1, m.lnLen , 2, 15) = 0
DECLARE INTEGER GetDateFormat ;
IN kernel32 AS GetDateFormat_CDATEEX ;
INTEGER Locale, ;
INTEGER dwFlags, ;
STRING @lpDate, ;
INTEGER lpFormat, ;
STRING @lpDateStr, ;
INTEGER cchDate
ENDIF
IF ASCAN(laDlls, "GetLocaleInfo", 1, m.lnLen , 2, 15) = 0
DECLARE INTEGER GetLocaleInfo ;
IN kernel32 ;
INTEGER Locale, ;
INTEGER LCType, ;
STRING lpLCData, ;
INTEGER cchData, ;
ENDIF
ENDIF
RETURN
ENDFUNC
*****
* ShortToBin
* Convierte un numero en una cadena binaria de 2 bytes
*****
FUNCTION ShortToBin
PARAMETERS tnLongVal
PRIVATE i, lcRetstr
IF VERSION(5) < 900 THEN
m.lcRetstr = ""
FOR i = 8 TO 0 STEP -8
m.lcRetstr = CHR(INT(m.tnLongVal/(2^i))) + m.lcRetstr
m.tnLongVal = MOD(m.tnLongVal, (2^i))
NEXT
ELSE
m.lcRetstr = BINTOC(m.tnLongVal,[2RS])
ENDIF
RETURN m.lcRetstr
ENDFUNC
***********************************************************************************
*************
************************************************************
* Funcion: Is_Run
* Indica si un programa está en ejecución
* Parametros:
* tcprograma - Nombre del programa a comprobar
* Ejemplos:
* llret = Is_Run("GESTION.EXE")
* llret = Is_Run("GESTION")
* Retorno:
* .F. - El programa no está en ejecución
* .T. - El programa está en ejecución
* Notas:
* Si no se pone extensión, se asume EXE por defecto.
*
* Adaptación de código realizado por Carlos Salina
* http://www.portalfox.com/article.php?sid=329
* Creación : 14/02/2006 Pablo Roca
* Ultima Modificacion: 14/02/2006 Pablo Roca
************************************************************
FUNCTION IS_RUN(tcprograma)
#DEFINE PROCESS_VM_READ 16
#DEFINE PROCESS_QUERY_INFORMATION 1024
#DEFINE DWORD 4
*--------------------------------------------------
* Declaración de Funciones API
*--------------------------------------------------
DECLARE INTEGER GetLastError IN kernel32
DECLARE INTEGER CloseHandle IN kernel32 INTEGER Handle
DECLARE INTEGER OpenProcess IN kernel32;
INTEGER dwDesiredAccessas, INTEGER bInheritHandle,;
INTEGER dwProcId
DECLARE INTEGER EnumProcesses IN psapi;
STRING @ lpidProcess, INTEGER cb,;
INTEGER @ cbNeeded
DECLARE INTEGER GetModuleBaseName IN psapi;
INTEGER hProcess, INTEGER hModule,;
STRING @ lpBaseName, INTEGER nSize
DECLARE INTEGER EnumProcessModules IN psapi;
INTEGER hProcess, STRING @ lphModule,;
INTEGER cb, INTEGER @ cbNeeded
tcprograma = UPPER(tcprograma)
IF EMPTY(JUSTEXT(tcprograma))
tcprograma = tcprograma + ".EXE"
ENDIF
lnBufSize = 4096
lcProcBuf = Repli(Chr(0), lnBufSize)
lnProcessBufRet = 0
lcst = ""
FOR lnProcNo=1 TO lnProcessBufRet/DWORD
lnProcId = buf2dword(SUBSTR(lcProcBuf, (lnProcNo-1)*DWORD+1, DWORD))
IF hProcess > 0
lnBufSize = 4096
lcModBuf = Repli(Chr(0), lnBufSize)
lnModBufRet = 0
IF EnumProcessModules(hProcess,@lcModBuf,lnBufSize,@lnModBufRet) > 0
IF AT(lcBasename,lcst)=0
lcst = lcst + "," + lcBasename
ENDIF
ENDIF
= CloseHandle (hProcess)
ENDIF
ENDFOR
IF AT(tcprograma,lcst)>0
llret = .T.
ELSE
llret = .F.
ENDIF
RETURN llret
ENDFUNC
***********************************************************************************
*************
FUNCAO PARA MULT_TAREFA
Function ExecProcess
Lparameters cFile,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p17
Local ;
i As Integer
For i = 2 To Parameters()
cTransform = "transform(p"+Transform(i)+")"
m.cFile = m.cFile + " '"+&cTransform+"' "
Endfor
#Define NORMAL_PRIORITY_CLASS 32
#Define IDLE_PRIORITY_CLASS 64
#Define HIGH_PRIORITY_CLASS 128
#Define REALTIME_PRIORITY_CLASS 1600
* Return code from WaitForSingleObject() if
* it timed out.
#Define WAIT_TIMEOUT 0x00000102
Local lTerminer
Do While !lTerminer
* Use timeout of TIMEOUT_INTERVAL msec so the display
* will be updated. Otherwise, the VFP window never repaints until
* the loop is exited.
If !WaitForSingleObject(RetCode, WAIT_INTERVAL) != WAIT_TIMEOUT
DoEvents
Else
lTerminer = .T.
* Show a message box when we're done.
* Close the process handle afterwards.
RetCode = CloseHandle(RetCode)
return -1
Endif
Enddo
********************
Function long2str
********************
* Passed : 32-bit non-negative numeric value (m.longval)
* Returns : ASCII character representation of passed
* value in low-high format (m.retstr)
* Example :
* m.long = 999999
* m.longstr = long2str(m.long)
Parameters m.longval
Private i, m.retstr
m.retstr = ""
For i = 24 To 0 Step -8
m.retstr = Chr(Int(m.longval/(2^i))) + m.retstr
m.longval = Mod(m.longval, (2^i))
Next
Return m.retstr
*******************
Function str2long
*******************
* Passed: 4-byte character string (m.longstr)
* in low-high ASCII format
* returns: long integer value
* example:
* m.longstr = "1111"
* m.longval = str2long(m.longstr)
Parameters m.longstr
Private i, m.retval
m.retval = 0
For i = 0 To 24 Step 8
m.retval = m.retval + (Asc(m.longstr) * (2^i))
m.longstr = Right(m.longstr, Len(m.longstr) - 1)
Next
Return m.retval
***********************************************************************************
*************
&& CAPTURAR QUALQUER IMAGEM E TAMANHO
PUBLIC oCapturaImg
oCapturaImg = CREATEOBJECT("CapturaImagem")
oCapturaImg.Show()
PROCEDURE Init
WITH THIS
.DeclareFunctions()
.Resize()
ENDWITH
ENDPROC
PROCEDURE SetTransparent
LOCAL lnControlBottom, lnControlRight, lnControlLeft, lnControlTop,
lnBorderWidth, ;
lnTitleHeight, lnFormHeight, lnFormWidth, lnInnerRgn, lnOuterRgn,
lnCombinedRgn, ;
lnControlRgn, lnControl, lnRgnDiff, lnRgnOr, llTrue
lnRgnDiff = 4
lnRgnOr = 2
llTrue = -1
WITH THIS
lnBorderWidth = SYSMETRIC(3)
lnTitleHeight = SYSMETRIC(9)-SYSMETRIC(4)
lnFormWidth = .Width + (lnBorderWidth * 2)
lnFormHeight = .Height + lnTitleHeight + lnBorderWidth
lnOuterRgn = CreateRectRgn(0, 0, lnFormWidth, lnFormHeight)
lnInnerRgn = CreateRectRgn(lnBorderWidth, lnTitleHeight, ;
lnFormWidth - lnBorderWidth, lnFormHeight - lnBorderWidth)
lnCombinedRgn = CreateRectRgn(0, 0, 0, 0)
CombineRgn(lnCombinedRgn, lnOuterRgn, lnInnerRgn, lnRgnDiff)
FOR EACH Control in .Controls
lnControlLeft = Control.Left + lnBorderWidth
lnControlTop = Control.Top + lnTitleHeight
lnControlRight = Control.Width + lnControlLeft
lnControlBottom = Control.Height + lnControlTop
lnControlRgn = CreateRectRgn(lnControlLeft, lnControlTop,
lnControlRight, lnControlBottom)
CombineRgn(lnCombinedRgn, lnCombinedRgn, lnControlRgn, lnRgnOr)
ENDFOR
SetWindowRgn(.HWnd , lnCombinedRgn, llTrue)
ENDWITH
ENDPROC
PROCEDURE num2dword
LPARAMETERS lnValue
#DEFINE m0 256
#DEFINE m1 65536
#DEFINE m2 16777216
b3 = INT(lnValue/m2)
b2 = INT((lnValue - b3*m2)/m1)
b1 = INT((lnValue - b3*m2 - b2*m1)/m0)
b0 = MOD(lnValue, m0)
RETURN(CHR(b0)+CHR(b1)+CHR(b2)+CHR(b3))
ENDPROC
PROCEDURE declarefunctions
DECLARE INTEGER CombineRgn in "gdi32" integer hDestRgn, integer hRgn1,
integer hRgn2, integer nMode
DECLARE INTEGER CreateRectRgn in "gdi32" integer X1, integer Y1, integer X2,
integer Y2
DECLARE INTEGER SetWindowRgn in "user32" integer hwnd, integer hRgn, integer
nRedraw
PROCEDURE CopyToClipBoard
WITH THIS
.Caption = "Capturando"
.Command1.Left = .Width+.Command1.Width
.Cls()
.SetTransparent()
=Sleep(100)
#DEFINE CF_BITMAP 2
#DEFINE SRCCOPY 13369376
lnLeft = SYSMETRIC(3)
lnTop = SYSMETRIC(4)+(SYSMETRIC(20)-SYSMETRIC(11))
lnRight = 0
lnBottom = 0
lnWidth = .Width
lnHeight = .Height-1
*hwnd = GetFocus()
hdc = GetWindowDC(.HWnd)
hVdc = CreateCompatibleDC(hdc)
hBitmap = CreateCompatibleBitmap(hdc, lnWidth, lnHeight)
= SelectObject(hVdc, hBitmap)
= BitBlt(hVdc, 0, 0, lnWidth, lnHeight, hdc, lnLeft, lnTop, SRCCOPY)
= OpenClipboard(.HWnd)
= EmptyClipboard()
= SetClipboardData(CF_BITMAP, hBitmap)
= CloseClipboard()
= DeleteObject(hBitmap)
= DeleteDC(hVdc)
= ReleaseDC(.HWnd, hdc)
.Command1.Left = VAL(.Command1.Tag)
.SetTransparent()
.Caption = "Captura"
ENDWITH
ENDPROC
PROCEDURE CopyToFile
#DEFINE CF_BITMAP 2
#DEFINE SRCCOPY 13369376
#DEFINE OBJ_BITMAP 7
#DEFINE DIB_RGB_COLORS 0
#DEFINE BFHDR_SIZE 14
#DEFINE BHDR_SIZE 40
#DEFINE GENERIC_WRITE 1073741824
#DEFINE FILE_SHARE_WRITE 2
#DEFINE CREATE_ALWAYS 2
#DEFINE FILE_ATTRIBUTE_NORMAL 128
#DEFINE INVALID_HANDLE_VALUE -1
#DEFINE BITMAP_STRU_SIZE 24
#DEFINE BI_RGB 0
#DEFINE RGBQUAD_SIZE 4
#DEFINE BHDR_SIZE 40
#DEFINE GMEM_FIXED 0
cDefault = FULLPATH(SYS(5))
cNameFile = GETPICT("BMP")
SET DEFAULT TO (cDefault)
IF EMPTY(cNameFile)
RETURN
ENDIF
IF FILE(cNameFile)
IF MESSAGEBOX("Esta pasta já contém um arquivo chamado
'"+PROPER(JUSTFNAME(cNameFile))+"'"+CHR(13)+"Deseja substituir o arquivo
existente?",36+256,"Confirmar substituição de arquivo") = 7
RETURN
ENDIF
ENDIF
ERASE (cNameFile)
WITH THIS
.CopyToClipBoard()
= OpenClipboard (0)
hClipBmp = GetClipboardData (CF_BITMAP)
= CloseClipboard()
lnBitsPerPixel = 24
pnBytesPerScan = INT((pnWidth * lnBitsPerPixel)/8)
IF MOD(pnBytesPerScan, 4) # 0
pnBytesPerScan = pnBytesPerScan + 4 - MOD(pnBytesPerScan, 4)
ENDIF
IF lnBitsPerPixel <= 8
pnRgbQuadSize = (2^lnBitsPerPixel) * RGBQUAD_SIZE
lcRgbQuad = REPLI(CHR(0), pnRgbQuadSize)
ELSE
lcRgbQuad = ""
ENDIF
lcBInfo = lcBIHdr + lcRgbQuad
pnBitsSize = pnHeight * pnBytesPerScan
lpBitsArray = GlobalAlloc (GMEM_FIXED, pnBitsSize)
= ZeroMemory (lpBitsArray, pnBitsSize)
*hwnd = GetActiveWindow()
hdc = GetWindowDC(.HWnd)
hMemDC = CreateCompatibleDC (hdc)
= ReleaseDC (.HWnd, hdc)
= GetDIBits (hMemDC, hClipBmp, 0, pnHeight, lpBitsArray, @lcBInfo,
DIB_RGB_COLORS)
IF hFile # INVALID_HANDLE_VALUE
DECLARE INTEGER WriteFile IN kernel32;
INTEGER hFile, STRING @lpBuffer, INTEGER nBt2Write,;
INTEGER @lpBtWritten, INTEGER lpOverlapped
= WriteFile (hFile, @lcBFileHdr, Len(lcBFileHdr), 0, 0)
= WriteFile (hFile, @lcBInfo, Len(lcBInfo), 0, 0)
= GlobalFree(lpBitsArray)
= DeleteDC (hMemDC)
= DeleteObject (hClipBmp)
ENDWITH
ENDPROC
PROCEDURE Resize
WITH THIS
.Command1.Left = .Width-.Command1.Width
.Command1.Top = .Height-.Command1.Height
.Command1.Tag = ALLT(STR(.Command1.Left))
.SetTransparent()
ENDWITH
ENDPROC
PROCEDURE Destroy
oCapturaImg = .F.
RELEASE oCapturaImg
ENDPROC
ENDDEFINE
PROCEDURE Click
cOptMenu = ""
DEFINE POPUP _menu_clip SHORTCUT RELATIVE FROM MROW(), MCOL()
DEFINE BAR CNTBAR("_menu_clip")+1 OF _menu_clip PROMPT "Copiar para a
área de transferência"
ON SELECTION BAR CNTBAR("_menu_clip") OF _menu_clip cOptMenu =
"CLIPBOARD"
DEFINE BAR CNTBAR("_menu_clip")+1 OF _menu_clip PROMPT "Copiar para um
arquivo"
ON SELECTION BAR CNTBAR("_menu_clip") OF _menu_clip cOptMenu =
"FILE"
ACTIVATE POPUP _menu_clip
RELEASE POPUPS _menu_clip
DO CASE
CASE cOptMenu == "CLIPBOARD"
THISFORM.CopyToClipBoard()
PUBLIC loForm1
loForm1 = CREATEOBJECT("Form1")
loForm1.SHOW(1)
***********************************************************************************
*************
pessoal estou quebrando a cabeça e naun consigo achar a formula para o seguinte
calculo
tenho um cheque no valor de 3600 e quero descontar no banco 106 dias antes do
vencimento e o banco cobra uma taxa de juros e 2,03 ao mes, quanto o banco ira me
pagar ?
mais qual a formula que eles usaram para chegar a este valor ?
*****
A fórmula é a seguinte:
Pega a taxa do banco, divida por 100 e some 1: fica
1+ 0,0203 = 1,0203
J=C((1+1)^N-1)
Logo:
J=3600((1,0203)^(106/30)-1)
J=264,93
3600-264,93 = 3335,07
Geralmente, essa é a fórmula que eles usam para Juros Compostos; pode dar uma
diferença por causa do arrendondamento.
****
*****
Com o criador de menus aberto, encontre View no menu principal do seu FoxPro e
clique em General Options. Marque a opção Top-Level Form do seu menu.
Nota. Não utilize THISFORM de dentro do menu. Lance seu form utilizando a cláusula
NAME.
Compreendeu?
***********************************************************************************
*************
Manter uma IMAGEM centralizada na _SCREENN
_SCREEN.ADDOBJECT("oImagen","MiImagen")
WITH _Screen.oImagen
.PICTURE = "C:\MiImagen.jpg"
.LEFT = INT(_SCREEN.WIDTH - .WIDTH)/ 2
.TOP = INT(_SCREEN.HEIGHT - .HEIGHT)/ 2
.VISIBLE = .T.
ENDWITH
BINDEVENT(_SCREEN,"Resize",_SCREEN.oImagen,"MiMetodo")
***********************************************************************************
*************
*******************************
*!* Ejemplo de utilización de SendViaMAPI
*******************************
DIMENSION aryAttach(2)
aryAttach(1) = "C:\attachment1.txt" && cambie a un archivo real que existe en su PC
aryAttach(2) = "C:\attachment2.zip" && cambie a un archivo real que existe en su PC
LOCAL lcTo, lcSubject, lcBody, lnCount, lcCC, lcBCC, lcUserName, lcPassword,
llOpenEmail, lcErrReturn
lcTo = "alguien@algundominio.com"
lcSubject = "¿Ha intentado enviar un email con VFP?"
lcBody = "Quiero hacerle saber que VFP es muy versátil" + CHR(13) + "y hay muchas
formas de enviar un email."
lcCC = "otro@otrodominio.com"
lcBCC = "mijefe@dominiodeljefe.com"
lcUserName = "yo@midominio.com" && mi nombre de usuario SMTP
lcPassword = "Mi_PaSsWoRd" && mi contraseña SMTP
*!* para enviar correo automáticamente haga llOpenEmail igual a .F.
llOpenEmail = .T. && Si el correo se abrió o no, en el cliente de correo MAPI
SendViaMAPI(@lcErrReturn, lcTo, lcSubject, lcBody, @aryAttach, lcCC, lcBCC,
lcUserName, lcPassword, llOpenEmail)
IF EMPTY(lcErrReturn)
MESSAGEBOX("'" + lcSubject + "' se envió satisfactoriamente.", 64, "Envía email
via MAPI")
ELSE
MESSAGEBOX("'" + lcSubject + "' falló al enviar. Causa:" + CHR(13) + lcErrReturn,
64, "Envía email via MAPI")
ENDIF
*******************************************
PROCEDURE SendViaMAPI(tcReturn, tcTo, tcSubject, tcBody, taFiles, tcCC, tcBCC,
tcUserName, tcPassword, tlOpenEmail)
*******************************************
#DEFINE PRIMARY 1
#DEFINE CARBON_COPY 2
#DEFINE BLIND_CARBON_COPY 3
LOCAL loSession, loMessages, lnAttachments, loError AS EXCEPTION, loErrorSend AS
EXCEPTION
tcReturn = ""
TRY
loSession = CREATEOBJECT( "MSMAPI.MAPISession" )
IF TYPE("tcUserName") = "C"
loSession.UserName = tcUserName
ENDIF
IF TYPE("tcPassword") = "C"
loSession.PASSWORD = tcPassword
ENDIF
loSession.Signon()
IF (loSession.SessionID > 0)
loMessages = CREATEOBJECT( "MSMAPI.MAPIMessages" )
loMessages.SessionID = loSession.SessionID
ENDIF
WITH loMessages
.Compose()
.RecipDisplayName = tcTo
.RecipType = PRIMARY
.ResolveName()
IF TYPE("tcCC") = "C"
.RecipIndex = .RecipCount
.RecipDisplayName = tcCC
.RecipType = CARBON_COPY
.ResolveName()
ENDIF
IF TYPE("tcBCC") = "C"
.RecipIndex = .RecipCount
.RecipDisplayName = tcBCC
.RecipType = BLIND_CARBON_COPY
.ResolveName()
ENDIF
.MsgSubject = tcSubject
.MsgNoteText = tcBody
IF TYPE("taFiles", 1) = "A"
lnAttachments = ALEN(taFiles)
IF LEN(tcBody) < lnAttachments && Se asegura que el cuerpo es
suficientemente grande para los adjuntos
tcBody = PADR(tcBody, lnAttachments, " ")
ENDIF
FOR lnCountAttachments = 1 TO lnAttachments
.AttachmentIndex = .AttachmentCount
.AttachmentPosition = .AttachmentIndex
.AttachmentName = JUSTFNAME(taFiles(lnCountAttachments))
.AttachmentPathName = taFiles(lnCountAttachments)
ENDFOR
ENDIF
TRY
.SEND(tlOpenEmail)
CATCH TO loErrorSend
IF tlOpenEmail && El usuario canceló la operación desde su cliente de
correo?
tcReturn = "El usuario canceló el envío de correo."
ELSE
THROW loErrorSend
ENDIF
ENDTRY
ENDWITH
loSession.Signoff()
CATCH TO loError
tcReturn = [Error: ] + STR(loError.ERRORNO) + CHR(13) + ;
[LineNo: ] + STR(loError.LINENO) + CHR(13) + ;
[Message: ] + loError.MESSAGE + CHR(13) + ;
[Procedure: ] + loError.PROCEDURE + CHR(13) + ;
[Details: ] + loError.DETAILS + CHR(13) + ;
[StackLevel: ] + STR(loError.STACKLEVEL) + CHR(13) + ;
[LineContents: ] + loError.LINECONTENTS
FINALLY
STORE .NULL. TO loSession, loMessages
RELEASE loSession, loMessages
ENDTRY
ENDPROC
***********************************************************************************
*************
Criar um atalho
&&ATALHOS
WshShell = CreateObject("WScript.Shell")
ctexto = vpdefaulte+"\TEMP\EMAIL.HTM"
oMSG.Attachments.Add(ctexto)
***********************************************************************************
*************
*** Guardar posicao do FORM
PUBLIC oMiForm
oMiForm = CREATEOBJECT("MiForm")
oMiForm.SHOW(1)
RETURN
PROCEDURE INIT
THISFORM.InicializarPropiedades()
THISFORM.TomarPropiedades()
THISFORM.RESIZE
ENDPROC
PROCEDURE DESTROY
THISFORM.GuardarPropiedades()
ENDPROC
PROCEDURE RESIZE
THISFORM.lblAyuda.WIDTH = THISFORM.WIDTH - 24
ENDPROC
PROCEDURE InicializarPropiedades
LOCAL lcScx
*-- Creo propiedades
THISFORM.ADDPROPERTY("Prop_Alias")
THISFORM.ADDPROPERTY("Prop_Tabla")
*-- Nombre de la tabla de propiedades
lcScx = SYS(1271,THISFORM)
THISFORM.Prop_Alias = "_Prop_" + IIF(EMPTY(lcScx),"Form",JUSTSTEM(lcForm))
THISFORM.Prop_Tabla = FORCEEXT(FULLPATH("")+ THISFORM.Prop_Alias, "DBF")
*-- Si no existe la tabla la creo
IF NOT FILE(THISFORM.Prop_Tabla)
CREATE TABLE (THISFORM.Prop_Tabla) FREE ;
(TOP I, LEFT I, WIDTH I, HEIGHT I, BACKCOLOR I)
APPEND BLANK
GATHER NAME THISFORM
USE IN SELECT(THISFORM.Prop_Alias)
ENDIF
ENDPROC
PROCEDURE TomarPropiedades
*-- Tomo las propiedades de la tabla
SELECT 0
USE (THISFORM.Prop_Tabla)
SCATTER NAME THISFORM ADDITIVE
USE IN SELECT(THISFORM.Prop_Alias)
ENDPROC
PROCEDURE GuardarPropiedades
*-- Guardo las propiedades en la tabla
SELECT 0
USE (THISFORM.Prop_Tabla)
GATHER NAME THISFORM
USE IN SELECT(THISFORM.Prop_Alias)
ENDPROC
PROCEDURE cmdColor.CLICK
THISFORM.BACKCOLOR = GETCOLOR(THISFORM.BACKCOLOR)
ENDPROC
PROCEDURE cmdSalir.CLICK
THISFORM.RELEASE
ENDPROC
ENDDEFINE
***********************************************************************************
*************
Itamar,
exite uma forma de desabilitar a tecla da jenalinha que vc esta mencionando.
Esta janelinha esta associada ao botão INICIAR de windows.
Vc tem como desabilitar o botão e retornar, não isto não impede o teclado.
Vc tem que APAGAR o botão INICIAR, pois o usuário pode usar o mouse para
ativar o mesmo menu.
O problema deste comando é que quando vc apaga o botão INICIAR que é uma
tarefa do windows, vc só pode reexibir o botão novamente se der um reboot no
SO.
Ao mesmo tempo, se vc usar a instrução para apagar o botão INICIAR, o
usuário do windows só podera fechar/sair do SO se der um CTRL + Alt + Del e
escolher finalizar ou reboot.
Não conheço outra forma e a MS é contra este tipo de solução.
=EnableStartMenuButton(0)
=INKEY(15)
=EnableStartMenuButton(1)
PROCEDURE EnableStartMenuButton(liEnable)
* Não esquecer de reativar
LOCAL lHwnd
lHwnd = FindWindowEx(0, 0, "Shell_TrayWnd", .NULL.)
lHwnd = FindWindowEx(lHwnd, 0, "Button", .NULL.)
=EnableWindow(lHwnd, liEnable)
****
* 2) Apagar o botão start ( só retorna se de boot )
DECLARE LONG FindWindow IN "user32" STRING lpClassName, STRING lpWindowName
DECLARE LONG SendMessage IN "user32" LONG hWnd, LONG wMsg, LONG wParam, LONG
lParam
DECLARE LONG FindWindowEx IN "user32" LONG hWnd1, LONG hWnd2, STRING lpsz1,
STRING lpsz2
#DEFINE WM_CLOSE 0x10
SendMessage(FindWindowEx(FindWindow("Shell_TrayWnd", ""), 0x0, "Button",
.NULL.), WM_CLOSE, 0, 0)
[ ]´s
Peter
***********************************************************************************
*************
O codigo abaixo visualiza um report em janela propria com caption e icone, alem
de maximar e ajustar o toolbar, coloca tambem o numero total de paginas do
relatorio.
***********************************************************************************
*************
AUTOREGISTRAR OCX E DLLS
Código:
DECLARE LONG DllRegisterServer IN [arquivo.ocx]
IF DllRegisterServer() = 0
messagebox('REGISTRADO !!!')
ELSE
messagebox('NÃO REGISTRADO !!!')
ENDIF
***********************************************************************************
*************
Somar arquivos texto com FileSystemObject
ofs = createobject("scripting.filesystemobject")
ob1 = ofs.OpenTextFile("Fichero1")
ob2 = ofs.OpenTextFile("Fichero2")
ob3 = ofs.CreateTextFile("NuevoFichero")
ob3.Write(ob1.ReadAll)
ob3.Write(ob2.ReadAll)
ob1.Close
ob2.Close
ob3.Close
release ofs,ob1,ob2,ob3
***********************************************************************************
*************
CAPTURAR QUALQUER IMAGEM E TAMANHO
Este pequeno, mas poderoso exemplo utiliza somente APIs de acesso a memória e
conversão de dados para a área de transferência do Windows. Não utiliza OCX e pode
funcionar desde a versão 5 até a 9 do FoxPro. Desenvolvi este algoritmo porque
percebi que muitas pessoas vem procurado recursos para WebCams e outros acessórios
de imagem conectados ao programa. Este exemplo demonstra mais uma vez que podemos
fazer misérias com o Visual FoxPro. Veja o que eu fiz com um simples form!
Código:
PUBLIC oCapturaImg
oCapturaImg = CREATEOBJECT("CapturaImagem")
oCapturaImg.Show()
PROCEDURE Init
WITH THIS
.DeclareFunctions()
.Resize()
ENDWITH
ENDPROC
PROCEDURE SetTransparent
LOCAL lnControlBottom, lnControlRight, lnControlLeft, lnControlTop,
lnBorderWidth, ;
lnTitleHeight, lnFormHeight, lnFormWidth, lnInnerRgn, lnOuterRgn,
lnCombinedRgn, ;
lnControlRgn, lnControl, lnRgnDiff, lnRgnOr, llTrue
lnRgnDiff = 4
lnRgnOr = 2
llTrue = -1
WITH THIS
lnBorderWidth = SYSMETRIC(3)
lnTitleHeight = SYSMETRIC(9)-SYSMETRIC(4)
lnFormWidth = .Width + (lnBorderWidth * 2)
lnFormHeight = .Height + lnTitleHeight + lnBorderWidth
lnOuterRgn = CreateRectRgn(0, 0, lnFormWidth, lnFormHeight)
lnInnerRgn = CreateRectRgn(lnBorderWidth, lnTitleHeight, ;
lnFormWidth - lnBorderWidth, lnFormHeight - lnBorderWidth)
lnCombinedRgn = CreateRectRgn(0, 0, 0, 0)
CombineRgn(lnCombinedRgn, lnOuterRgn, lnInnerRgn, lnRgnDiff)
FOR EACH Control in .Controls
lnControlLeft = Control.Left + lnBorderWidth
lnControlTop = Control.Top + lnTitleHeight
lnControlRight = Control.Width + lnControlLeft
lnControlBottom = Control.Height + lnControlTop
lnControlRgn = CreateRectRgn(lnControlLeft, lnControlTop,
lnControlRight, lnControlBottom)
CombineRgn(lnCombinedRgn, lnCombinedRgn, lnControlRgn, lnRgnOr)
ENDFOR
SetWindowRgn(.HWnd , lnCombinedRgn, llTrue)
ENDWITH
ENDPROC
PROCEDURE num2dword
LPARAMETERS lnValue
#DEFINE m0 256
#DEFINE m1 65536
#DEFINE m2 16777216
b3 = INT(lnValue/m2)
b2 = INT((lnValue - b3*m2)/m1)
b1 = INT((lnValue - b3*m2 - b2*m1)/m0)
b0 = MOD(lnValue, m0)
RETURN(CHR(b0)+CHR(b1)+CHR(b2)+CHR(b3))
ENDPROC
PROCEDURE declarefunctions
DECLARE INTEGER CombineRgn in "gdi32" integer hDestRgn, integer hRgn1,
integer hRgn2, integer nMode
DECLARE INTEGER CreateRectRgn in "gdi32" integer X1, integer Y1, integer X2,
integer Y2
DECLARE INTEGER SetWindowRgn in "user32" integer hwnd, integer hRgn, integer
nRedraw
PROCEDURE CopyToClipBoard
WITH THIS
.Caption = "Capturando"
.Command1.Left = .Width+.Command1.Width
.Cls()
.SetTransparent()
=Sleep(100)
#DEFINE CF_BITMAP 2
#DEFINE SRCCOPY 13369376
lnLeft = SYSMETRIC(3)
lnTop = SYSMETRIC(4)+(SYSMETRIC(20)-SYSMETRIC(11))
lnRight = 0
lnBottom = 0
lnWidth = .Width
lnHeight = .Height-1
*hwnd = GetFocus()
hdc = GetWindowDC(.HWnd)
hVdc = CreateCompatibleDC(hdc)
hBitmap = CreateCompatibleBitmap(hdc, lnWidth, lnHeight)
= SelectObject(hVdc, hBitmap)
= BitBlt(hVdc, 0, 0, lnWidth, lnHeight, hdc, lnLeft, lnTop, SRCCOPY)
= OpenClipboard(.HWnd)
= EmptyClipboard()
= SetClipboardData(CF_BITMAP, hBitmap)
= CloseClipboard()
= DeleteObject(hBitmap)
= DeleteDC(hVdc)
= ReleaseDC(.HWnd, hdc)
.Command1.Left = VAL(.Command1.Tag)
.SetTransparent()
.Caption = "Captura"
ENDWITH
ENDPROC
PROCEDURE CopyToFile
#DEFINE CF_BITMAP 2
#DEFINE SRCCOPY 13369376
#DEFINE OBJ_BITMAP 7
#DEFINE DIB_RGB_COLORS 0
#DEFINE BFHDR_SIZE 14
#DEFINE BHDR_SIZE 40
#DEFINE GENERIC_WRITE 1073741824
#DEFINE FILE_SHARE_WRITE 2
#DEFINE CREATE_ALWAYS 2
#DEFINE FILE_ATTRIBUTE_NORMAL 128
#DEFINE INVALID_HANDLE_VALUE -1
#DEFINE BITMAP_STRU_SIZE 24
#DEFINE BI_RGB 0
#DEFINE RGBQUAD_SIZE 4
#DEFINE BHDR_SIZE 40
#DEFINE GMEM_FIXED 0
cDefault = FULLPATH(SYS(5))
cNameFile = GETPICT("BMP")
SET DEFAULT TO (cDefault)
IF EMPTY(cNameFile)
RETURN
ENDIF
IF FILE(cNameFile)
IF MESSAGEBOX("Esta pasta já contém um arquivo chamado
'"+PROPER(JUSTFNAME(cNameFile))+"'"+CHR(13)+"Deseja substituir o arquivo
existente?",36+256,"Confirmar substituição de arquivo") = 7
RETURN
ENDIF
ENDIF
ERASE (cNameFile)
WITH THIS
.CopyToClipBoard()
= OpenClipboard (0)
hClipBmp = GetClipboardData (CF_BITMAP)
= CloseClipboard()
lnBitsPerPixel = 24
pnBytesPerScan = INT((pnWidth * lnBitsPerPixel)/8)
IF MOD(pnBytesPerScan, 4) # 0
pnBytesPerScan = pnBytesPerScan + 4 - MOD(pnBytesPerScan, 4)
ENDIF
IF lnBitsPerPixel <= 8
pnRgbQuadSize = (2^lnBitsPerPixel) * RGBQUAD_SIZE
lcRgbQuad = REPLI(CHR(0), pnRgbQuadSize)
ELSE
lcRgbQuad = ""
ENDIF
lcBInfo = lcBIHdr + lcRgbQuad
pnBitsSize = pnHeight * pnBytesPerScan
lpBitsArray = GlobalAlloc (GMEM_FIXED, pnBitsSize)
= ZeroMemory (lpBitsArray, pnBitsSize)
*hwnd = GetActiveWindow()
hdc = GetWindowDC(.HWnd)
hMemDC = CreateCompatibleDC (hdc)
= ReleaseDC (.HWnd, hdc)
= GetDIBits (hMemDC, hClipBmp, 0, pnHeight, lpBitsArray, @lcBInfo,
DIB_RGB_COLORS)
IF hFile # INVALID_HANDLE_VALUE
DECLARE INTEGER WriteFile IN kernel32;
INTEGER hFile, STRING @lpBuffer, INTEGER nBt2Write,;
INTEGER @lpBtWritten, INTEGER lpOverlapped
= WriteFile (hFile, @lcBFileHdr, Len(lcBFileHdr), 0, 0)
= WriteFile (hFile, @lcBInfo, Len(lcBInfo), 0, 0)
= GlobalFree(lpBitsArray)
= DeleteDC (hMemDC)
= DeleteObject (hClipBmp)
ENDWITH
ENDPROC
PROCEDURE Resize
WITH THIS
.Command1.Left = .Width-.Command1.Width
.Command1.Top = .Height-.Command1.Height
.Command1.Tag = ALLT(STR(.Command1.Left))
.SetTransparent()
ENDWITH
ENDPROC
PROCEDURE Destroy
oCapturaImg = .F.
RELEASE oCapturaImg
ENDPROC
ENDDEFINE
PROCEDURE Click
cOptMenu = ""
DEFINE POPUP _menu_clip SHORTCUT RELATIVE FROM MROW(), MCOL()
DEFINE BAR CNTBAR("_menu_clip")+1 OF _menu_clip PROMPT "Copiar para a
área de transferência"
ON SELECTION BAR CNTBAR("_menu_clip") OF _menu_clip cOptMenu =
"CLIPBOARD"
DEFINE BAR CNTBAR("_menu_clip")+1 OF _menu_clip PROMPT "Copiar para um
arquivo"
ON SELECTION BAR CNTBAR("_menu_clip") OF _menu_clip cOptMenu =
"FILE"
ACTIVATE POPUP _menu_clip
RELEASE POPUPS _menu_clip
DO CASE
CASE cOptMenu == "CLIPBOARD"
THISFORM.CopyToClipBoard()
***********************************************************************************
*************
ADICIONAR UM ODBC DATA SOURCE POR API
Autor : desconhecido
Código:
DECLARE Integer SQLConfigDataSource IN odbccp32.dll ;
Integer, Short, String @, String @
ODBC_ADD_SYS_DSN = 1
&& Add data source de sistema
lc_driver = "Microsoft Visual FoxPro Driver" + CHR(0)
lc_dsn = "dsn=Bases Bodega1" + CHR(0) + ;
"BackgroundFetch=Yes" + CHR(0) + ;
"Description=Conexion Para Agencias" + CHR(0) + "Exclusive=No" + CHR(0) +;
"SourceDb=\\Sttacasant2\basesbo\bodega1.dbc" + CHR(0) +;
"Sourcetype=DBC"
IF SQLConfigDataSource(0, ODBC_ADD_SYS_DSN, @lc_driver, @lc_dsn) = 1
RETURN .T. && se configuró OK
ENDIF
RETURN .F. && falló
*.- lc_driver = Drive de Visual FoxPro
*.- lc_dsn = dsn = Nombre de la Conexion
*.- BackgroudFetch = Busqueda de datos secundarios Valores Yes o No
*.- Description = Descripcion de de la conexion
*.- SourceDb = Mapeo o direccion de la tabla o base de datos a conectar
*.- SourceType = tipo de conexion valores DBC o DBF si fuera tabla libre
***********************************************************************************
*************
SABER SE PROGRAMA ESTA SENDO EXECUTADO A PARTIR DO EXE OU NO PROJETO
Código:
IF VERSION(2) = 0 && RunTime
MESSAGEBOX("EXECUTÁVEL")
ELSE
MESSAGEBOX("DESENVOLVIMENTO")
ENDIF
***********************************************************************************
*************
Ola pessoal
Setei a propriedade ScrollBars de uma form para 2 (Vertical), pois
tenho um form com varios controles. Gostarai que ao focar um controle
fora da area de visão o scroll fosse automatico, alguem sabe como fazer
isso ?
***********************************************************************************
*************
Comparar 2 registros
TRY
USE (_Samples+"Northwind\Customers") IN 0
CATCH
ENDTRY
IF NOT USED("Customers")
MESSAGEBOX("No se pudo abrir la tabla Customers en _Samples",16,"Aviso")
RETURN
ENDIF
******************************************
* Comparar objetos
******************************************
LOCAL loFirstRecord, loSecondRecord
SELECT Customers
LOCATE
SCATTER MEMO NAME loFirstRecord
SKIP
SCATTER MEMO NAME loSecondRecord
IF COMPOBJ(loFirstRecord,loSecondRecord)
MESSAGEBOX("Los registros son iguales",48,"Aviso")
ELSE
MESSAGEBOX("Los registros son distintos",48,"Aviso")
ENDIF
******************************************
* Comparar XML
******************************************
ERASE FirstRecord.XML
ERASE SecondRecord.XML
SELECT Customers
LOCATE
CURSORTOXML("Customers","FirstRecord.XML",1,512,1)
SKIP
CURSORTOXML("Customers","SecondRecord.XML",1,512,1)
IF FILETOSTR("FirstRecord.XML") == FILETOSTR("SecondRecord.XML")
MESSAGEBOX("Los registros son iguales",48,"Aviso")
ELSE
MESSAGEBOX("Los registros son distintos",48,"Aviso")
ENDIF
ERASE FirstRecord.XML
ERASE SecondRecord.XML
******************************************
* Comparar SYS(2017)
******************************************
LOCAL lnFirstRecord, lnSecondRecord
SELECT Customers
LOCATE
lnFirstRecord = SYS(2017,"",0,3)
SKIP
lnSecondRecord = SYS(2017,"",0,3)
IF lnFirstRecord = lnSecondRecord
MESSAGEBOX("Los registros son iguales",48,"Aviso")
ELSE
MESSAGEBOX("Los registros son distintos",48,"Aviso")
ENDIF
USE IN Customers
RETURN
***********************************************************************************
*************
POSICIONAR O REGISTRO EM CERTA LINHA DA GRADE
Código:
local lnGridHeight
thisform.lockscreen=.T.
lnGridHeight=yourgrid.height
yourgrid.height=xx && Where xx is the height necessary to show only two lines
yourgrid.height=lnGridHeight
thisform.lockscreen=.F.
***********************************************************************************
*************
MOSTRAR IMAGEM EM UMA GRADE
***********************************************************************************
*************
CONFIGURAR GRID PROGRAMATICAMENTE
Embora seja muito fácil se ajustar uma grade visualmente, em certas situações
podemos optar por definir programaticamente as propriedades de uma grade, como
largura de colunas, fontes, estilos etc... o que se torna um pouco trabalhoso.
Para facilitar as coisas, é possível se definir "visualmente" uma grade e "puxar"
as configurações para o modo programado.
Código:
if this.Column1.ColumnOrder <> this.LeftColumn
this.Column1.ColumnOrder = this.LeftColumn
endif
***********************************************************************************
*************
cConnectString = "Driver=SQL Server;Server=Y;Database=Y;UID=usuario;PWD=clave"
hConn = sqlstringconnect(cConnectString)
SQLExec(hConn, "select count(*) AS rcount from tu_gran_archivo","rcuenta")
nTotalRecordsToFetch=rcuenta.rcount
use
lSQLResult=SQLSETPROP(hConn,"Asynchronous",.t.)
llCancel = .f.
lnResult = 0
SQLCancel(hConn)
SQLDisconnect(hConn)
***********************************************************************************
*************
Cómo escribir en el registro de la aplicación en Windows NT, Windows 2000 o Windows
XP que utiliza el Windows Script Host
#DEFINE SUCCESS 0
#DEFINE ERROR 1
#DEFINE WARNING 2
#DEFINE INFORMATION 4
#DEFINE AUDIT_SUCCESS 8
#DEFINE AUDIT_FAILURE 16
WshShell = CreateObject("WScript.Shell")
*!* Logevent returns .t. for SUCCESS for .f. for FAILURE
?WshShell.LogEvent(SUCCESS, "Logon Script Completed Successfully")
WshShell.LogEvent(ERROR, "Logon Script Completed Successfully")
WshShell.LogEvent(WARNING, "We are getting low on disk space!!")
WshShell.LogEvent(INFORMATION, "Start nightly backup")
WshShell.LogEvent(AUDIT_SUCCESS, "Checksum Success!!")
WshShell.LogEvent(AUDIT_FAILURE, "Checksum Failure")
WshShell=.NULL.
***********************************************************************************
*************
Conectar a una Unidad de Red
Contribución de maoh el Lunes, 31 octubre a las 14:31:06
#DEFINE RESOURCETYPE_DISK 1
#DEFINE RESOURCETYPE_PRINT 2
DO decl
LOCAL hWindow
hWindow = GetActiveWindow()
PROCEDURE decl
DECLARE INTEGER GetActiveWindow IN user32
***********************************************************************************
*************
Visibilidade do FORM CHAMADOR
IF TYPE( "_Screen.ActiveForm" ) = "O"
*** OK, tenemos realmente un formulario activo
loForm = _Screen.ActiveForm
ELSE
*** Ooops! ¿No debía existir un formulario activo?
ENDIF
***********************************************************************************
*************
Imprimir en JPG
http://www.news2news.com/vfp
oListener = CREATEOBJECT("ReportListener")
cOutputFile = "tmp"+TRANS(nPageIndex)+".jpg"
oListener.OutputPage(nPageIndex,;
NEXT
***********************************************************************************
*************
* Endereco de um OBJETO
ON KEY LABEL 'F2' MESSAGEBOX("tecla F2 o seu objeto
é:"+CHR(13)+sys(1272,sys(1270)),0+48,"Mensagem do sistema")
***********************************************************************************
*************
* Mapear uma unidade de rede
oNet = CREATEOBJECT("wscript.network")
* oNet.MapNetworkDrive('<drive>','<caminho>')
oNet.MapNetworkDrive('S:','\\Andre\cd')
***********************************************************************************
*************
Como Setar Impressora padrao no Windowns.
***********************************************************************************
*************
SQLSERVER
Ver se a tabela existe (ou qualquer outro tipo de objeto - views, sps, etc):
select count(*) c from sysobjects where id = object_id('nome_da_tabela')
Nota importante: pra alterar ou criar qualquer coisa no SQL Server o usuário do
SQL tem que ter o direito pra tal. Pra
garantir essa flexibilidade em meus sistemas o logon ao SQL Server é sempre com
usuário único, com direito de
administrador.
***********************************************************************************
*************
* Colocando imagem no combo BOX
ThisForm.cboMeuCombo.AddItem( 'NOVO' )
ThisForm.cboMeuCombo.AddItem( 'ALTERA' )
ThisForm.cboMeuCombo.AddItem( 'EXCLUI' )
ThisForm.cboMeuCombo.Picture[1] = 'NOVO.ico'
ThisForm.cboMeuCombo.Picture[2] = 'ALTERA.ico'
ThisForm.cboMeuCombo.Picture[3] = 'EXCLUI.ico'
ThisForm.cboMeuCombo.PictureSelectionDisplay = 1
***********************************************************************************
*************
Como descobrir um código vago em uma tabela DBF
***********************************************************************************
*************
* Maximiza o relatório no preview
if wexist("Report Designer")
zoom wind "Report Designer" max
endif
***********************************************************************************
*************
* MOSTRA DRIVERS INSTALDO NO COMPUTADOR
CLEAR
***********************************************************************************
*************
* Jogo de PINGPONG
PUBLIC oForm1
oForm1 = NEWOBJECT("Form1")
oForm1.SHOW(1)
RETURN
PROCEDURE INIT
THISFORM.timer1.INTERVAL = 5
PUBLIC x AS INTEGER, Y AS INTEGER, vCont AS INTEGER
STORE 1 TO x, Y
vCont = 0
ENDPROC
PROCEDURE MOUSEMOVE
LPARAMETERS nButton, nShift, nXCoord, nYCoord
THISFORM.barra.LEFT = nXCoord
THISFORM.lblb2.LEFT = nXCoord
ENDPROC
PROCEDURE timer1.TIMER
THISFORM.bola.LEFT = THISFORM.bola.LEFT + x
THISFORM.bola.TOP = THISFORM.bola.TOP + Y
vcol1 = INT(RAND()*256)
vcol2 = INT(RAND()*256)
vcol3 = INT(RAND()*256)
IF THISFORM.bola.LEFT + THISFORM.bola.WIDTH => THISFORM.WIDTH
x = -1
ELSE
IF THISFORM.bola.LEFT = 0
x = 1
ENDIF
ENDIF
IF THISFORM.bola.TOP + THISFORM.bola.HEIGHT => THISFORM.HEIGHT
Y = -1
ELSE
IF THISFORM.bola.TOP = 0
Y = 1
ENDIF
ENDIF
IF THISFORM.bola.TOP + THISFORM.bola.HEIGHT = THISFORM.barra.TOP ;
AND THISFORM.bola.LEFT + THISFORM.bola.WIDTH >= THISFORM.barra.LEFT ;
AND THISFORM.bola.LEFT <= THISFORM.barra.LEFT + THISFORM.barra.WIDTH
THISFORM.bola.BACKCOLOR = RGB(vcol1,vcol2,vcol3)
Y = -1
IF THISFORM.lblB2.WIDTH < THISFORM.barra.WIDTH
THISFORM.lblB2.WIDTH = THISFORM.lblB2.WIDTH + 10
ELSE
MESSAGEBOX("Finalizado")
THISFORM.RELEASE
ENDIF
ENDIF
IF THISFORM.bola.TOP = THISFORM.barra.TOP + THISFORM.barra.HEIGHT ;
AND THISFORM.bola.LEFT + THISFORM.bola.WIDTH >= THISFORM.barra.LEFT ;
AND THISFORM.bola.LEFT <= THISFORM.barra.LEFT + THISFORM.barra.WIDTH
THISFORM.bola.BACKCOLOR=RGB(vcol1,vcol2,vcol3)
Y = 1
IF THISFORM.lblB2.WIDTH >10
THISFORM.lblB2.WIDTH = THISFORM.lblB2.WIDTH - 10
ENDIF
ENDIF
ENDPROC
ENDDEFINE
***********************************************************************************
*************
INDEXAR/ORDENAR COLUNAS DO GRID
NO INICIO DO RELATORIO
* click's para el grid de la consultas
for lnCols = 1 to this.Grid1.columncount
lcCol = 'This.Grid1.Column'+transform(lnCols)+'.Header1'
bindevent(&lcCol,"MouseUp",thisform,"ClickMHeader")
endfor
***********************************************************************************
*************
Não permitir abrir o programa mais de uma vez na mesma estação
Boa noite!
Aqui eu utilizo essa rotina
onde o parametro eh a instancia
PARAMETERS lcSmp
#DEFINE WAIT_OBJECT_0 0
#DEFINE STATUS_TIMEOUT 258
#DEFINE STANDARD_RIGHTS_REQUIRED 983040 && 0xF0000
#DEFINE SYNCHRONIZE 1048576 && 0x100000
#DEFINE SEMAPHORE_ALL_ACCESS 2031619 && 0x1F0003
#DEFINE SW_SHOWMAXIMIZED 3
DECLARE INTEGER CreateSemaphore IN kernel32 ;
INTEGER lcSmAttr, INTEGER lInitialCount, ;
INTEGER lMaximumCount, STRING lpName
DECLARE INTEGER OpenSemaphore IN kernel32 ;
INTEGER dwDesiredAccess, ;
INTEGER bInheritHandle, STRING lpName
LOCAL hSmp
hSmp = OpenSemaphore (STANDARD_RIGHTS_REQUIRED, 0, lcSmp)
IF hSmp = 0
hSmp = CreateSemaphore (0, 1, 1, lcSmp)
CLEAR DLLS
RETURN
ELSE
LOCAL mHandle, mResult
mHandle = FindWindowLike(lcSmp)
DECLARE INTEGER SetForegroundWindow IN User32 ;
INTEGER HWND
mResult = SetForegroundWindow(mHandle)
DECLARE INTEGER ShowWindow IN WIN32API INTEGER, INTEGER
= ShowWindow (mHandle, SW_SHOWMAXIMIZED)
ENDIF
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
= CloseHandle (hSmp)
CLEAR DLLS
QUIT
FUNCTION FindWindowLike(lcSmp)
#DEFINE GW_HWNDFIRST 0
#DEFINE GW_HWNDLAST 1
#DEFINE GW_HWNDNEXT 2
#DEFINE GW_HWNDPREV 3
#DEFINE GW_OWNER 4
#DEFINE GW_CHILD 5
DECLARE INTEGER GetDesktopWindow IN user32
DECLARE INTEGER GetWindow IN user32 ;
INTEGER HWND, ;
INTEGER wCmd
DECLARE INTEGER GetWindowText IN user32 AS GetWindowTextA ;
INTEGER HWND, ;
STRING @lpString, ;
INTEGER cch
LOCAL mCaption, mDeskWin, mHwnd
mCaption = SPACE(255)
mDeskWin = GetDesktopWindow()
mHwnd = GetWindow(mDeskWin, GW_CHILD)
DO WHILE mHwnd<>0
= GetWindowTextA(mHwnd, @mCaption, 255)
IF lcSmp$mCaption
EXIT
ENDIF
mHwnd = GetWindow(mHwnd, GW_HWNDNEXT)
ENDDO
CLEAR DLLS
RETURN mHwnd
ENDFUNC
***********************************************************************************
*************
Una forma de obtener la misma funcionalidad de SQLColumns, pero a traves de
OLEDB/ADO. Cortesía de Çetin Basöz, MVP de VFP.
Usando las funciones SQLColumns() y SQLTables() podemos obtener esos datos, pero si
no fuera posible hacerlo via ODBC (y por lo tanto hacerlo con dicha función),
puedes optar por hacerlo con ADO/OLEDB.
#Define adSchemaCatalogs 1
#Define adSchemaColumns 4
#Define adSchemaTables 20
Function ShowMe
Lparameters toRecordset
oForm = Createobject('myForm', toRecordset)
oForm.Show
Read Events
Endfunc
Procedure Init
Lparameters toRecordset
This.Caption = "Recordset"
This.hflex.Datasource = toRecordset
This.hflex.AllowUSerResizing = 3
Endproc
Procedure QueryUnload
Clear Events
Endproc
Enddefine
***********************************************************************************
*************
Select * From Information_Schema.Columns Where Table_name = 'CLIENTE'
***********************************************************************************
*************
Cansado de codificar largas y tediosas instrucciones INSERT para utilizarlas via
SPT?, aquí te decimos como hacerlo un poco mas fácil.
Select MiCursor
SCATTER MEMVAR
SQLExec(lnConnHandle,"INSERT INTO miTablaSQL FROM MEMVAR")
MiTabla (iID int, dFecha date, iClienteID int, iSeccionID int, yImporte Y)
USE miTabla IN 0
lcInsert = CrearInsert("Mitabla","Ventas")
USE MiTabla IN 0
lcInsert = CrearInsert("Mitabla","Ventas")
lcRegistros = trans( RECCOUNT("MiTabla"))
llError = .F.
IF SQLPrepare(lnConnHandle,lcInsert) > 0
SCAN FOR NOT llError
WAIT WINDOW "Insertando registro " + TRANS(recno())+ "/"+lcRegistros NOWAIT
llError = SQLExec(lnConnHandle) < 0
ENDSCAN
IF llError
Messagebox(laError[2],"Error al insertar")
ELSE
WAIT WINDOW "Proceso Finalizado"
ENDIF
ENDIF
***********************************************************************************
*************
Con el siguiente código y utilizando Automation, podemos crear una hoja Excel con
SubTotales. Cortesía de Çetin Basöz, MVP de VFP.
***********************************************************************************
*************
continuación un código para automatizar el cambio de nombre de los archivos
contenedores de bases de datos (DBC) de Visual FoxPro. Cortesía de Çetin Basöz, MVP
de VFP.
RenDBC('testnew','testdata')
Function RenDbc
lparameters OldName, NewName
Open data (oldName)
lnTables=adbobject(arrTables,'TABLE')
For ix=1 to lnTables
lcTable = arrTables[ix]+'.DBF'
handle=fopen(lcTable,12)
=fseek(handle,8,0)
lnLowByte = asc(fread(handle,1))
lnHighByte = asc(fread(handle,1))*256
lnBackLinkstart = lnHighByte + lnLowByte - 263
=fseek(handle,lnBackLinkstart,0)
Fwrite(handle,forceext(newName,'dbc')+replicate(chr(0),263),263)
=fclose(handle)
Endfor
Close data all
Rename (forceext(oldName,'dbc')) to (forceext(newName,'dbc'))
Rename (forceext(oldName,'dcx')) to (forceext(newName,'dcx'))
Rename (forceext(oldName,'dct')) to (forceext(newName,'dct'))
***********************************************************************************
*************
**************************************************
*-- Class: powergrid
*-- ParentClass: grid
*-- BaseClass: grid
*-- Time Stamp: 04/24/05 01:50:08 AM
*
DEFINE CLASS powergrid AS GRID
DELETEMARK = .F.
HEIGHT = 200
READONLY = .T.
WIDTH = 320
HIGHLIGHTSTYLE = 2
ALLOWAUTOCOLUMNFIT = 0
NAME = "ordergrid"
lcorden = .F.
*-- Metodo que crea dinamicamente los indices de los campos
*-- Integer, fecha, fechahora y caracter ( podria utilizarse
*-- una vista y realizar un order by de los registros al
*-- momento de hacer el click en el columnheader en lugar
*-- de indexar por todos los campos)
HIDDEN PROCEDURE indexar
LOCAL lSet AS STRING
LOCAL lncuantos AS INTEGER,iii AS INTEGER,lcIndice AS STRING,lcTag AS STRING
LOCAL ARRAY Lacampos[1]
LOCAL LcIndiceAsc
LOCAL lcIndiceDes
IF !EMPTY(THIS.RECORDSOURCE)
lSet=SET("Safety")
SET SAFETY OFF
SELECT (THIS.RECORDSOURCE)
lncuantos= AFIELDS(lacampos,THIS.RECORDSOURCE)
FOR iii=1 TO lncuantos
IF INLIST(lacampos[iii,2],"C","D","T","I")
LcTag=IIF(INLIST(lacampos[iii,2],'D','T'),"DTOS("+lacampos[iii,1]+")", ;
IIF(lacampos[iii,2]='C',"upper("+IIF(lacampos[iii,3]>100, ;
"SUBSTR("+lacampos[iii,1]+",1,100)", ;
lacampos[iii,1])+")",lacampos[iii,1]))
lcIndice=LEFT(lacampos[iii,1],9)
LcIndiceAsc = 'Index On ' + lctag+ ' Tag '+ "A"+lcIndice+' Additive'
&LcIndiceAsc
LcIndiceDes = 'Index On ' + lctag+ ' Tag '+ "D"+lcIndice+' Descending
Additive'
&LcIndiceDes
ENDIF
NEXT
SET SAFETY &lSet
THIS.lcorden=''
ENDIF
ENDPROC
*-- Selecciona el orden correcto
HIDDEN PROCEDURE ordenar
LOCAL lCorden AS STRING,lCcampo AS STRING
AEVENTS(laEventos,0)
lCorden = laEventos[1].PARENT.CONTROLSOURCE
IF !EMPTY(lCorden) AND VARTYPE(EVALUATE(lCorden))$"CDTN"
THIS.pordefecto
lCcampo=SUBSTR(lCorden,AT('.',lCorden)+1)
lCorden="A"+LEFT(lCcampo,9)
WITH laEventos[1]
.PICTURE="UP.bmp"
IF UPPER(ALLTRIM(THIS.lCorden))==UPPER(ALLTRIM(lCorden))
lCorden="D"+LEFT(lCcampo,9)
.PICTURE="Down.bmp"
ENDIF
.BACKCOLOR=RGB(255,0,0)
ENDWITH
THIS.lCorden=lCorden
SET ORDER TO lCorden
GO TOP IN (THIS.RECORDSOURCE)
THIS.REFRESH()
ENDIF
ENDPROC
HIDDEN PROCEDURE pordefecto
***************************************
* lcinit determina si es el init de la
* grilla ( .t.) o no( .f.)
***************************************
LPARAMETERS lcinit
LOCAL LCClaseBase
FOR EACH loObjects IN THIS.OBJECTS
FOR EACH loControls IN loObjects.CONTROLS
LCClaseBase=LOWER(loControls.BASECLASS)
DO CASE
CASE LCClaseBase ="header"
loControls.PICTURE=''
loControls.BACKCOLOR=RGB(0,128,192)
IF lcInit
****************************************
* intercepto el click y llamo al proceso ordenar
* que esta en esta misma clase
****************************************
BINDEVENT(loControls,"Click",THIS,"Ordenar")
ENDIF
CASE LCClaseBase="textbox"
IF lcInit
****************************************
* intercepto el gotfocus y llamo al proceso
* gorecno que esta en esta misma clase
****************************************
BINDEVENT(loControls,"gotfocus",THIS,"gorecno")
ENDIF
ENDCASE
ENDFOR
ENDFOR
ENDPROC
HIDDEN PROCEDURE gorecno
**************************************
* el proceso gorecno llama a otra clase
* contenida en el form que se encarga de
* mostrar los datos en pantalla
****************************************
* thisform.ohaceboton.qhacer("M")
ENDPROC
PROCEDURE INIT
IF DODEFAULT()
THIS.pordefecto(.T.)
THIS.indexar()
ENDIF
ENDPROC
ENDDEFINE
*
*-- EndDefine: ordergrid
**************************************************
***********************************************************************************
*************
Esta es una rutina que nos permitira saber el tiempo que el PC tiene encendido.
***********************************************************************************
*************
***********************************************************************************
*************
Con esta función podemos tomar la fecha y hora de un servidor Windows NT o
superior, desde Visual FoxPro, con funciones de la API de Windows.
? ServerTime("\\MiServidor")
*----------------------------------------------------
* FUNCTION ServerTime(tcServerName, tlUtcTime)
* Retorna la hora del servidor pasado como parametro
* PARAMETROS:
* tcServerName = Nombre del servidor
* tlUtcTime = .T. FH UTC - .F. FH Local
* RETORNO: FechaHora ó .Null. si hubo error
* USO: ? ServerTime("\\MiServidor")
*----------------------------------------------------
FUNCTION ServerTime(tcServerName, tlUtcTime)
IF PARAMETERS() < 2
tlUtcTime = .F.
ENDIF
DECLARE INTEGER NetRemoteTOD IN netapi32 ;
STRING @, INTEGER @
DECLARE INTEGER RtlMoveMemory IN win32api ;
STRING @outbuffer, ;
INTEGER inbuffer, ;
INTEGER bytes2copy
tdbuffout = REPLICATE(CHR(0), 48)
tdbuffin = 0
lcTryServerName = STRCONV(tcServerName, 5)
rc = NetRemoteTOD(@lcTryServerName, @tdbuffin)
IF rc = 0
=RtlMoveMemory(@tdbuffout, tdbuffin, 48)
ELSE
lcTryServerName = STRCONV("\\" + tcServerName, 5)
rc = NetRemoteTOD(@lcTryServerName, @tdbuffin)
IF rc = 0
=RtlMoveMemory(@tdbuffout, tdbuffin, 48)
ELSE
*-- Error con NetRemoteTOD()
RETURN .Null.
ENDIF
ENDIF
tod_month = str2long(SUBSTR(tdbuffout, 37, 4))
tod_day = str2long(SUBSTR(tdbuffout, 33, 4))
tod_year = str2long(SUBSTR(tdbuffout, 41, 4))
tod_hours = str2long(SUBSTR(tdbuffout, 9, 4))
tod_mins = str2long(SUBSTR(tdbuffout, 13, 4))
tod_secs = str2long(SUBSTR(tdbuffout, 17, 4))
tod_timezone = str2long(SUBSTR(tdbuffout, 25, 4)) * 60
serverdatetime = DATETIME(tod_year, tod_month, tod_day, ;
tod_hours, tod_mins, tod_secs)
IF tlUtcTime
tdServerTime = serverdatetime
ELSE
tdServerTime = serverdatetime - tod_timezone
ENDIF
RETURN tdServerTime
ENDFUNC
*----------------------------------------------------
FUNCTION str2long(tcLongStr)
LOCAL ln, lnRetVal
lnRetVal = 0
FOR ln = 0 TO 24 STEP 8
lnRetVal = lnRetVal + (ASC(tcLongStr) * (2^ln))
tcLongStr = RIGHT(tcLongStr, LEN(tcLongStr) - 1)
ENDFOR
RETURN lnRetVal
ENDFUNC
*----------------------------------------------------
***********************************************************************************
*************
código abaixo cria um texto e armazena no campo do tipo general. No relatório,
adicione um objeto OLE que aponte para o campo gText.
CLEAR ALL
CLOSE DATABASES all
LOCAL lcStr
lcstr = "Note that there is a limit of 32 characters total for the sum of text"+;
"before and text after for simple numbering. Multilevel numbering has a limit"+;
"of 64 characters total for the sum of all levels.NOTE: The file must have a"+;
".RTF extension to work properly."+;
"Note that there is a limit of 32 characters total for the sum of text"+;
"before and text after for simple numbering. Multilevel numbering has a limit"+;
"of 64 characters total for the sum of all levels.NOTE: The file must have a"+;
".RTF extension to work properly."
CREATE cursor ctext (lctext m,gText g)
INSERT INTO ctext (lctext) VALUES (lcStr)
_rtfFile = "c:\"+SYS(3)+".rtf"
SCAN
SET TEXTMERGE TO &_rtfFile NOSHOW
SET TEXTMERGE ON
\\{\rtf1\ansi\qj <>}
SET TEXTMERGE TO
APPEND GENERAL gText FROM &_rtfFile CLASS "RICHTEXT.RICHTEXTCTRL.1"
ENDSCAN
REPORT FORM rtfdemo PREVIEW NOCONSOLE
***********************************************************************************
*************
Como saber la ruta de las carpetas Mis Documentos y Archivos de Programa
Con la Foundation Class que trae VFP podemos saber la ruta de la carpetas
Mis Documentos y Archivos de programa.
Ejemplo:
lo = NEWOBJECT("_CommonFolder",HOME(1)+"FFC\_System")
lcMD = lo.GetFolder(5)
lcAP = lo.GetFolder(38)
lo = .Null.
MESSAGEBOX(lcMD,64,"Mis Documentos")
MESSAGEBOX(lcAP,64,"Archivos de programa")
***********************************************************************************
*************
* Ajustar o volume
lcHex = GetVolume()
*-- % volumen altavoz izquierdo
lnIzq = CEILING(BITAND(EVALUATE(lcHex),0xFFFF)*100/0xFFFF)
*-- % volumen altavoz derecho
lnDer = CEILING((BITAND(EVALUATE(lcHex),0xFFFF0000)/0x10000)*100/0xFFFF)
SetVolume(75,75)
*---------------------------------------------------
* FUNCTION SetVolume(tnIzq, tnDer)
*---------------------------------------------------
* Configura el volumen de los altavoces de la PC
* PARAMETROS:
* tnIzq = Porcentaje de volumen altavoz izquierdo
* tnDer = Porcentaje de volumen altavoz derecho
* RETORNO: Logico .T. si pudo configurar
* USO: SetVolume(50,50)
*---------------------------------------------------
FUNCTION SetVolume(tnIzq, tnDer)
LOCAL lnVol
DECLARE INTEGER waveOutSetVolume IN Winmm ;
INTEGER wDeviceID, ;
INTEGER dwVolume
tnIzq = MAX(0,MIN(tnIzq,100))
tnDer = MAX(0,MIN(tnDer,100))
lnVol = EVALUATE("0x" + ;
RIGHT(TRANSFORM(tnDer*0xFFFF/100,";@0"),4) + ;
RIGHT(TRANSFORM(tnIzq*0xFFFF/100,";@0"),4))
RETURN 0 = waveOutSetVolume(0,lnVol)
ENDFUNC
*---------------------------------------------------
***********************************************************************************
*************
** Listbox com CheckBox
PUBLIC oForm
oForm = CREATEOBJECT("clsListCheckBox")
oForm.VISIBLE = .T.
READ EVENTS
TOP = 1
LEFT = 0
HEIGHT = 473
WIDTH = 287
DOCREATE = .T.
CAPTION = "Listbox With Checkboxes"
WINDOWSTATE = 0
NAME = "clsListCheckBox"
AlwaysOnTop = .T.
CheckIcon = HOME() + "Graphics\Icons\Misc\MISC15.ICO"
Uncheckicon = HOME() + "Graphics\Icons\Misc\MISC13.ICO"
SHOWWINDOW = 2
PROCEDURE LOAD
LOCAL nCount, nCount2, nWordLength, sItem, nUpper, nLower
nUpper = 90 &&ASCII
nLower = 65 &&ASCII
CREATE CURSOR ListCheck (MyEntry c(35), Checked L)
FOR nCount = 1 TO 250
sItem = ""
nWordLength = INT((35) * RAND( ) + 1)
FOR nCount2 = 1 TO nWordLength
sItem = sItem + CHR(INT((nUpper - nLower + 1) * RAND( ) + nLower))
ENDFOR
INSERT INTO ListCheck (MyEntry, Checked) VALUES(sItem, .F.)
NEXT
ENDPROC
PROCEDURE Unload
USE IN SELECT("ListCheck")
CLEAR EVENTS
ENDPROC
PROCEDURE ListSetup
THISFORM.LOCKSCREEN = .T.
LOCAL nListCount
nListCount = 1
SELECT ListCheck
SCAN ALL
IF ListCheck.Checked
THIS.list1.PICTURE(nListCount) = THISFORM.CheckIcon
ELSE
THIS.list1.PICTURE(nListCount) = THISFORM.Uncheckicon
ENDIF
nListCount = nListCount + 1
ENDSCAN
THISFORM.LOCKSCREEN = .F.
ENDPROC
PROCEDURE SetCheck
LOCAL nListIndex
nListIndex = THIS.list1.LISTINDEX
IF nListIndex > 0
GO nListIndex IN "ListCheck"
IF ListCheck.Checked
THIS.list1.PICTURE(nListIndex) = THISFORM.Uncheckicon
ELSE
THIS.list1.PICTURE(nListIndex) = THISFORM.CheckIcon
ENDIF
REPLACE ListCheck.Checked WITH !ListCheck.Checked
ENDIF
ENDPROC
PROCEDURE list1.GOTFOCUS()
IF DODEFAULT()
THISFORM.ListSetup()
ENDIF
ENDPROC
PROCEDURE list1.CLICK()
IF LASTKEY() = 13
THISFORM.SetCheck()
ENDIF
ENDPROC
ENDDEFINE
***********************************************************************************
*************
Utilizando o código abaixo, é possível determinar o endereço IP e outras
informações sobre o computador:
PUBLIC IPSocket
crlf=CHR(13)+CHR(10)
IPSocket = CREATEOBJECT("MSWinsock.Winsock")
IF TYPE('IPSocket')='O'
IPAddress = IPSocket.LocalIP
localhostname=IPSocket.localhostname
remotehost=IPSocket.remotehost
remotehostip=IPSocket.remotehostip
MESSAGEBOX ("Local IP = " + IPAddress+crlf+"local host = "+localhostname;
+crlf+"Remotehost = "+remotehost+crlf+"Remotehostip = "+remotehostip)
ELSE
MESSAGEBOX('Unable to determine IP Address')
ENDIF
***********************************************************************************
*************
Como fazer para simular a tecla PRTSC do windows, ou seja, capturar a tela
do windows com todas janelas, etc. e salvar como imagem JPG
***********************************************************************************
*************
ENTER NO BROWSE
Faça o seguinte:
BROWSE
***********************************************************************************
*************
Código simple que agrega un registro en blanco y repara la tabla.
Wait Window 'Si obtienes un "Not a database file", haz clic en Ignore' NoWait
Use MiTabla && Reemplazar con el nombre de la tabla
Wait Window 'ESC para cancelar o cualquier tecla para continuar'
*-
fh = FOpen('MiTabla.dbf', 2) && Reemplazar con el nombre de la tabla
=FSeek(fh, 0, 2) && se mueve el puntero al EOF
=FWrite(fh, Space(123)) && al final agrega un registro en blanco
=FClose(fh) && Cierra la tabla
Wait Window 'Si puedes ver los datos, entonces se arregló satisfactoriamente'
Use MiTabla Exclusive && Reemplazar con el nombre de la tabla
Go Bottom
Browse Last Nowait
ReIndex
***********************************************************************************
*************
Es muy facil de manejar. Me funciona perfecto. La descompresion no esta, porque no
la utilizo, pero al crear un zip, se puede abrir con cualquier compresor externo.
PROCEDURE creazip
PARAMETER nomarch, incluye && archivo de destino, archivo a incluir
PRIVATE ozip, nres
ozip = NEWOBJECT('zip')
nRes = ozip.zip(nomarch,incluye,.F.) && destino, origen, si mando .T., mueve los
archivos
RETURN nRes
PROCEDURE ZIP
LPARAMETERS cDestFile, cSourceFiles, lAddMove
WITH THIS.oZip
.ZipFilename = cDestFile && nomche archivo zip destino
.AddMove = lAddMove && .T., mueve - .F. suma
.AddCompLevel = 9 && maximo nivel de compresion
.AddDirNames = .F. && incluye el path en la compresion
.AddRecurseDirs = .F.
.AddDiskSpan = .F.
.AddDiskSpanErase = .F.
.FSpecArgs.ADD(cSourceFiles) && lista de archivos a comprimir
.ADD && agrega los archivos especificados en
.fspecargs en .zipfilename
* .GetAddPassword && abre ventana de ingreso de password para
.ADD
* .GetExtrPassword && abre ventana de ingreso de password para
.Extract
ENDWITH
RETURN THIS.oZip.ErrCode
ENDPROC
ENDDEFINE
***********************************************************************************
*************
Como criar uma classe vazia
*---------------------------------------------------------------------
* EmptyObject(fieldsList)
* Receives a list of fields separated by comma
* Returns an empty object with empty properties
* Recibe una lista de campos sepados por comas
* Retorna un objeto Empty con propiedades basadas
* en objetos empty
*---------------------------------------------------------------------
* Test:
Customer = EmptyObject("Name,Address,Phone,Contacts[5]")
Customer.Address = EmptyObject("Street,City,State,Zip,Country")
Customer.Name = "John Doe"
Customer.Phone = "555-1234"
Customer.Address.City = "Sunny Beach"
Customer.Address.State = "FL"
Customer.Address.Zip = "12345"
Customer.Contacts[1] = "Jane Doe"
Customer.Contacts[2] = "Jim Doe"
*** Revise el objeto Customer
Set Step On && Check out Customer object
Return Customer
*---------------------------------------------------------------------
Function EmptyObject
LParameters fieldsList As String
If Empty(fieldsList) Then
Return Null
Endif
Local oEmpty
oEmpty = NewObject("Empty")
Try
For Each item In fieldsArray
AddProperty(oEmpty,item,"")
Endfor
Catch
oEmpty = Null
Endtry
Return oEmpty
EndFunc
*---------------------------------------------------------------------
***********************************************************************************
*************
FUNCTION IsCursorChanged
LPARAMTERS tcCursor
LOCAL lnRecno,;
lnRetValue
lcOldAlias = SELECT(0) && SET COMPATIBLE debe estar en OFF
SELECT (tcCursor)
lnRecno = RECNO(tcCursor) && Guardamos el num de reg. donde estaba
LOCATE && Ir al primer registro del cursor
lnRetValue = GETNEXTMODIFIED(0,tcCursor)
GO TOP
IF NOT(EOF(tcCursor)) && ¿Es un cursor vacio?
GO lnRecno && Regresamos el puntero a donde se quedó
ENDIF
SELECT (lcOldAlias) && Regresamos al área donde se encontraba
RETURN lnRetValue # 0
ENDFUNC
***********************************************************************************
*************
Grafico EXCEL a partir do VFP
*************************************************************
*** Grafica de Pastel en MS Excel con formateo de datos ***
*** Proceso de Envio a MS EXCEL ***
*************************************************************
oExcel = CREATEOBJECT("Excel.Application")
WITH oExcel
.Visible = .T.
.Workbooks.Add
.Worksheets(1).Activate
.Worksheets(1).Name = "GRAFICA"
.Columns("A:A").ColumnWidth = 45
.Columns("B:B").Select
.Selection.NumberFormat = "#,##0.00"
.Columns("E:E").ColumnWidth = 14.31
.Columns("E:E").Select
.Selection.NumberFormat = "#,##0.00"
.Selection.Font.Bold = .T.
.Range("A1:E1").Select
WITH .Selection.Font
.Bold=.T.
.Size = 14
.Name = "TAHOMA"
ENDWITH
WITH .Worksheets(1)
.Cells(1,1).Value = "MI EMPRESA"
.Cells(3,1).Value = "Fecha de Impresión: " + ALLTRIM(DTOC(DATE()))
ENDWITH
.Range("A3:E3").Select
WITH .Selection
.Merge
.MergeCells = .T.
.HorizontalAlignment = 1
.VerticalAlignment = 1
.Font.Bold = .T.
ENDWITH
.Worksheets(1).Cells(4,1).Value = "Fecha de Anásilis: " + ALLTRIM(DTOC(DATE()))
&& loFecha
.Range("A4:E4").Select
WITH .Selection
.Merge
.MergeCells = .T.
.HorizontalAlignment = 1
.VerticalAlignment = 1
.Font.Bold = .T.
ENDWITH
.Range("A3:E4").Select
valor(1) = 32
valor(2) = 234
valor(3) = 7488
valor(4) = 3256
valor(5) = 1256
** valor(6) = crGraph.TTCCSINUSAR - (Thisform.Cant_norm+Thisform.Cant_cort)
valor(6) = valor(3) - (valor(4)+valor(5))
FOR I = 1 TO 6
&& Titulo de " TOTAL DE PAGINAS "
lc = 7+I
loK = "A"+ALLTRIM(STR(lc))+":A"+ALLTRIM(STR(lc))
.Range(loK).Select
.Worksheets(1).Cells(lc,1).Value = titulo(i)
.Worksheets(1).Cells(lc,2).Value = valor(i)
WITH .Selection.Font
.Bold=.T.
.Size = 10
.Name = "TAHOMA"
ENDWITH
WITH .Selection
.Merge
.MergeCells = .T.
.HorizontalAlignment = 1
.VerticalAlignment = 1
.Font.Bold = .T.
ENDWITH
NEXT
.Charts.Add
.ActiveChart.ChartType = 70 && Tipo Pastel
.ActiveChart.SetSourceData(.Sheets("GRAFICA").Range("A11:B13"),2) && Rango de
Datos
.ActiveChart.Location(2,"GRAFICA")
.ActiveChart.HasTitle = .T.
.ActiveChart.ChartTitle.Characters.Text = "MI EMPRESA"
.ActiveChart.SeriesCollection(1).ApplyDataLabels(3) && Tipo de Aplicación de
Leyendas A LA IZQUIERDA
.ActiveSheet.Shapes("Gráfico 1").IncrementLeft(-173.25) && Posicionamiento de
la Grafica a la Izquierda
.ActiveSheet.Shapes("Gráfico 1").IncrementTop(68.75) && Posicionamiento de la
Grafica hacia Arriba
.ActiveSheet.Shapes("Gráfico 1").ScaleWidth(1.28,.F.,0) && Escala de Ancho de
la Gráfica
.ActiveSheet.Shapes("Gráfico 1").ScaleHeight(1.15,.F.,0)&& Escala de Largo de
la Gráfica
.ActiveSheet.ChartObjects("Gráfico 1").Activate
.ActiveChart.ChartArea.Select
loCont = .ActiveChart.SeriesCollection.Count
FOR I = 1 TO loCont
.ActiveChart.SeriesCollection(I).DataLabels.AutoScaleFont = .T.
With .ActiveChart.SeriesCollection(I).DataLabels.Font
.Name = "Verdana"
.Size = 8
.Bold = .T.
.Strikethrough = .F.
.Superscript = .F.
.Subscript = .F.
.OutlineFont = .F.
.Shadow = .F.
.Underline = .F.
.ColorIndex = 0
EndWith
NEXT
************************************
*** FIN ***
************************************
***********************************************************************************
*************
**************************************************
* Funcion: GetFoxEXEVersion
* Obter a versao em que foi compilado o EXE
* Autor: Rick Bean rgbean@unrealmelange-inc.com
* Ejemplo: ?GetFoxEXEVersion(GETFILE("EXE"))
**************************************************
* GetFoxEXEVersion.prg
LPARAMETERS p_cEXEName
DIMENSION VersionInfo[8,3]
VersionInfo[1,1] = "FPW 2.5"
VersionInfo[2,1] = "FPW 2.6"
VersionInfo[3,1] = "VFP 3.0"
VersionInfo[4,1] = "VFP 5.0"
VersionInfo[5,1] = "VFP 6.0"
VersionInfo[6,1] = "VFP 7.0"
VersionInfo[7,1] = "VFP 8.0"
VersionInfo[8,1] = "VFP 9.0"
VersionInfo[1,2] = "foxw"
VersionInfo[2,2] = "foxw"
VersionInfo[3,2] = "VisualFoxProRuntime.3"
VersionInfo[4,2] = "VisualFoxProRuntime.5"
VersionInfo[5,2] = "VisualFoxProRuntime.6"
VersionInfo[6,2] = "VisualFoxProRuntime.7"
VersionInfo[7,2] = "VisualFoxProRuntime.8"
VersionInfo[8,2] = "VisualFoxProRuntime.9"
VersionInfo[1,3] = "00D1"
VersionInfo[2,3] = "0111"
VersionInfo[3,3] = ""
VersionInfo[4,3] = "3228"
VersionInfo[5,3] = "1418"
VersionInfo[6,3] = "162C"
VersionInfo[7,3] = "1638"
VersionInfo[8,3] = "10EC" && beta 1
LOCAL lnii, lcVersion, lnHandle, lcKeyName
lnHandle = FOPEN(p_cEXEName, 0)
IF lnHandle < 0
RETURN "Unable to Open file"
ENDIF
lcVersion = "(unknown)"
FOR lnii = 1 TO 8
IF !EMPTY(VersionInfo[lnii,3])
= FSEEK(lnHandle, EVALUATE("0x"+VersionInfo[lnii,3]))
lcKeyName = VersionInfo[lnii,2]
IF FGETS(lnHandle, LEN(lcKeyName)) == lcKeyName
lcVersion = VersionInfo[lnii, 1]
EXIT
ENDIF
ENDIF
ENDFOR
=FCLOSE(lnHandle)
RETURN lcVersion
***********************************************************************************
*************
Insertar Tablas en Microsoft Word usando Automation.
Enviado por: Esparta Palma el Miércoles, 22 de Diciembre de 2004 - 12:03 AM GMT
Clear All
OPEN DATABASE (HOME(2)+"Data\testdata.dbc")
* Assuming VFP7 and later 'As ...' added to get help from IntelliSense
Local oWord As 'Word.application', ;
oDocument As "Word.Document", ;
loTable As 'Word.Table', ;
loRow As 'Word.Row'
oWord = Createobject("Word.Application")
oWord.Visible = .T.
oWord.Activate
oDocument = oWord.Documents.Add
With oDocument.MailMerge
* Attach the data to the document
.CreateDataSource("dummyfilename.doc",,,;
"Customer_ID, Company, Contact_name")
.EditDataSource
For Ix = 1 To Fcount()
loRow.Cells[ Ix ].Range.InsertAfter(;
Trim(Eval(Fields(Ix)))) && Trans if not all char
Endfor
Endscan
With loBalloon
.Heading = 'Scan ended. OK to delete row 2.'
.Show
loTable.Rows(2).Delete()
.Heading = 'Activating main doc.'
.Show
endwith
.EditMainDocument
Endwith
***********************************************************************************
*************
Proteger con contraseña documentos de Microsoft Excel (usando Automation)
Enviado por: Esparta Palma el Martes, 21 de Diciembre de 2004 - 12:04 AM GMT
Use orders
lcXLS = Sys(5)+Curdir()+'orders.xls'
Copy To (lcXLS) Type Xls
lcLastColumn = Chr(Asc('A')-1+Fcount()) && Last col not locked
oExcel = Createobject('Excel.application')
With oExcel
.Workbooks.Open(lcXLS)
With .ActiveWorkbook.ActiveSheet
.UsedRange.Locked = .T.
.Range(lcLastColumn+':'+lcLastColumn).Locked = .F.
.Protect('mypassword')
Endwith
.Visible = .T.
Endwith
***********************************************************************************
*************
RECUPERAR REGISTROS DE UMA TABELA APÓS O ZAP
Função permite recuperar N registros de uma tabela que não foi ainda manipulada
após o comando ZAP.
Uso:
ZAP
=UNZAP(47) && recupera 47 registros
Código:
FUNCTION UNZAP
PARAMETER Y
IF Y>0 .AND. USED()
IF RECCOUNT()=0
FILENAME=DBF()
USE
HANDLE=FOPEN(FILENAME,2)
IF HANDLE>0
BYTE=FREAD(HANDLE,32)
BKUP_BYTE=BYTE
FIELD_SIZE=ASC(SUBSTR(BYTE,11,1))+(ASC(SUBSTR(BYTE,12,1))*256)
FILE_SIZE=FSEEK(HANDLE,0,2)
BYTE8=CHR(INT(Y/(256*256*256)))
BYTE7=CHR(INT(Y/(256*256)))
BYTE6=CHR(INT(Y/256))
BYTE5=CHR(MOD(Y,256))
BYTE=SUBSTR(BYTE,1,4)+BYTE5+BYTE6+BYTE7+BYTE8+SUBSTR(BYTE,9)
=FSEEK(HANDLE,0)
=FWRITE(HANDLE,BYTE)
=FCHSIZE(HANDLE,FILE_SIZE+(FIELD_SIZE*Y))
=FCLOSE(HANDLE)
ENDIF
USE &FILENAME
ENDIF
ENDIF
***********************************************************************************
*************
Esta interesante rutina permite crear un cursor VFP basandose en los contenidos de
un arreglo.
*****************************************
* Subject: Re: data from array into cursor
* Sender: George
* Date: 06/12/2004
* newsgroups: microsoft.public.fox.programmer.exchange
*****************************************
***************************************************************
* Function: Abrowse
* Convierte un arreglo en un cursor VFP, basandose en los tipos
* de datos que contiene el arreglo
* Parametros:
* anyArray: El arreglo en cuestión, debe pasarse por referencia
* cursorName: Nombre del cursor a crear
* isTraversed: Identifica si se va a crear un cursor transversal
* mente, para su uso con arreglos unidimensionales
* Ejemplo de uso:
* IF AGetFileVersion(testArray,Home()+'vfp8.exe') > 0
* IF ABROWSE(@testArray,"myTest",.T.)
* BROWSE LAST NOWAIT
* ELSE
* Messagebox("No se pudo crear el cursor")
* ENDIF
* ELSE
* Messagebox("Error al obtener datos de VFP8.exe")
* ENDIF
*
************************************************************+
FUNCTION ABROWSE
*-- Pre conditions
LPARAMETERS anyArray, cursorName, isTraversed
isArray = ( TYPE("ALEN(anyArray,1)") == "N" )
IF NOT isArray THEN
Return .F.
ENDIF
IF Vartype(cursorName)<>"C" OR Empty(cursorName) THEN
cursorName = "tempArray"
ENDIF
DIMENSION fieldTypes[colCount,3]
* First get types
FOR I = 1 TO colCount
fieldTypes[I,1] =
IIF(colCount=1,VARTYPE(anyArray[I]),VARTYPE(anyArray[1,I]))
ENDFOR
* Then get maxWidth
FOR I = 1 TO colCount
fieldTypes[I,2] = 1 && Length
fieldTypes[I,3] = 0 && Decimals
FOR J = 1 TO rowCount
anyValue =
IIF(colCount=1,TRANSFORM(anyArray[J]),TRANSFORM(anyArray[J,I]))
isMemoField = ( AT(CHR(13),anyValue)>0 )
IF isMemoField THEN
fieldTypes[I,1] = "M"
ENDIF
fieldTypes[I,2] = MAX(fieldTypes[I,2],LEN(anyValue))
IF fieldTypes[I,1] == "N" THEN
hasDecimals = ( AT(".",anyValue) > 0 )
IF hasDecimals THEN
fieldTypes[I,3] = MAX( fieldTypes[I,3], LEN(anyValue) -
AT(".",anyValue) )
ENDIF
ENDIF
ENDFOR
ENDFOR
***********************************************************************************
*************
El Script Control de Microsoft nos da la posibilidad de ejecutar código JavaScript
o VBScript desde nuestras rutinas escritas en Visual FoxPro.
Veamos un ejemplo
Sugerencia
De esta forma, para no tener que transcribir código de otro lenguaje en nuestras
rutinas VFP, podemos codificar en un archivo externo y usar FileToStr() como
argumento en la invocación del método .ExecuteStatement.
***********************************************************************************
*************
Lenguaje del Sistema Operativo
Enviado por: Luis María Guayán
Con esta API podemos saber el lenguaje por defecto del Sistema Operativo o del
Usuario.
Ejemplo:
? DefaultLanguage("SYSTEM")
? DefaultLanguage("USER")
*----------------------------------------------------
* FUNCTION DefaultLanguage(tc)
*----------------------------------------------------
* Retorna el lenguaje por defecto del SO
* USO: ? DefaultLanguage()
* PARAMETROS:
* "SYSTEM" = Retorna el lenguaje del sistema
* "USER" = Retorna el lenguaje del usuario
* RETORNA: Caracter
*----------------------------------------------------
FUNCTION DefaultLanguage(tc)
LOCAL lnIdLeng, lcLeng
IF EMPTY(tc)
tc = "SYSTEM"
ENDIF
DO CASE
CASE UPPER(tc) = "SYSTEM"
DECLARE SHORT GetSystemDefaultLangID IN kernel32
lnIdLeng = GetSystemDefaultLangID()
CASE UPPER(tc) = "USER"
DECLARE SHORT GetUserDefaultLangID IN kernel32
lnIdLeng = GetUserDefaultLangID()
OTHERWISE
RETURN ""
ENDCASE
DO CASE
CASE lnIdLeng % 256 = 0 && Neutral
lcLeng = "Neutral"
CASE lnIdLeng % 256 = 1 && Arabe
lcLeng = "Arabe"
CASE lnIdLeng % 256 = 3 && Catalán
lcLeng = "Catalán"
CASE lnIdLeng % 256 = 4 && Chino
lcLeng = "Chino"
CASE lnIdLeng % 256 = 7 && Alemán
lcLeng = "Alemán"
CASE lnIdLeng % 256 = 8 && Griego
lcLeng = "Griego"
CASE lnIdLeng % 256 = 9 && Inglés
lcLeng = "Inglés"
CASE lnIdLeng % 256 = 10 && Español
lcLeng = "Español"
CASE lnIdLeng % 256 = 12 && Francés
lcLeng = "Francés"
CASE lnIdLeng % 256 = 16 && Italiano
lcLeng = "Italiano"
CASE lnIdLeng % 256 = 17 && Japonés
lcLeng = "Japonés"
CASE lnIdLeng % 256 = 18 && Coreano
lcLeng = "Coreano"
CASE lnIdLeng % 256 = 22 && Portugues
lcLeng = "Portugués"
CASE lnIdLeng % 256 = 29 && Sueco
lcLeng = "Sueco"
CASE lnIdLeng % 256 = 86 && Gallego
lcLeng = "Gallego"
CASE lnIdLeng % 256 = 107 && Quechua
lcLeng = "Quechua"
OTHERWISE
lcLeng = "Otro lenguaje"
ENDCASE
RETURN lcLeng
ENDFUNC
*----------------------------------------------------
***********************************************************************************
*************
Este código funciona perfectamente para enviar mensajes en una red 98 o 2k es para
utilizarlo en lugar del net send o el winpopup.
*========================================================
* ENVIAR MENSAJES COMO SI FUERA NET SEND
*========================================================
LParameter tcTarget, tcSender, tcReceipient, tcMessage
*------------------------------------------------------
* Open the mailslot that is used by NET SEND
*------------------------------------------------------
#DEFINE GENERIC_WRITE 0x40000000
#DEFINE FILE_SHARE_READ 0x00000001
#DEFINE OPEN_EXISTING 3
#DEFINE FILE_ATTRIBUTE_NORMAL 0x00000080
#DEFINE INVALID_HANDLE_VALUE -1
Local lnHandle, llOK
Declare Long CreateFile in Win32API ;
String, Long, Long, Long, Long, Long, Long
lnHandle = CreateFile( ;
"\\"+m.tcTarget+"\mailslot\messngr", ;
GENERIC_WRITE, ;
FILE_SHARE_READ, ;
0, ;
OPEN_EXISTING, ;
FILE_ATTRIBUTE_NORMAL, ;
0 ;
)
llOK = (m.lnHandle#INVALID_HANDLE_VALUE)
*------------------------------------------------------
* Write the message into the mailslot.
*------------------------------------------------------
Local lcMessage, lnBytes
If m.llOK
lcMessage = m.tcSender + Chr(0) + m.tcReceipient + ;
Chr(0) + m.tcMessage + Chr(0)
Declare Long WriteFile in Win32API ;
Long, String, Long, Long@, Long
lnBytesWritten = 0
llOK = WriteFile( m.lnHandle, ;
m.lcMessage, ;
Len(m.lcMessage), ;
@lnBytes, ;
0 ;
) # 0
Endif
*------------------------------------------------------
* Close mailslot
*------------------------------------------------------
If m.lnHandle # INVALID_HANDLE_VALUE
Declare CloseHandle in Win32API Long
CloseHandle( m.lnHandle )
Endif
Return m.llOK
***********************************************************************************
*************
**********************************************************
** Form param mostrar PDF
**********************************************************
** Author : Ramani (Subramanian.G)
** FoxAcc Software / Winners Software
** Type : Freeware with reservation to Copyrights
** Warranty : Nothing implied or explicit
**********************************************************
** I used PDF reader ver 6.0.
** Should work with earlier versions also
** If necessary change suitably in the line ...
** ADD OBJECT olecontrol1 AS olecontrol WITH ;
** OLEClass = "PDF.PdfCtrl.5"
**********************************************************
PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.Show
RETURN
**********************************************************
DEFINE CLASS form1 AS form
DoCreate = .T.
Caption = "pdfForm"
Name = "Form1"
PROCEDURE Init
ThisForm.ReSize()
ENDPROC
PROCEDURE Resize
ThisForm.Olecontrol1.Height = ThisForm.Height - 60
ThisForm.Olecontrol1.Width = ThisForm.Width - 24
ThisForm.Olecontrol1.Refresh()
ENDPROC
PROCEDURE cmdfile.Click
LOCAL cFile
cFile = GETFILE([PDF])
IF !EMPTY(cFile)
THISFORM.oleControl1.LoadFile([&cFile])
ENDIF
ENDPROC
PROCEDURE cmdexit.Click
ThisForm.Release()
ENDPROC
ENDDEFINE
**********************************************************
** EOF
**********************************************************
***********************************************************************************
*************
** A simple function to do backup.
**********************************************************
** Author : Ramani (Subramanian.G)
** FoxAcc Software / Winners Software
** ramani_g@yahoo.com
** Type : Freeware with reservation to Copyrights
** Warranty : Nothing implied or explicit
**********************************************************
** You need CabArc tools for the following.
** You can download CabArc tools from...
** http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B310618
**
** How to use ....
** lcSource = "c:\myDirectory\*.*"
** lcDestination = "c:\myBack\myBack1.CAB"
** =gsCabBack(mySource,myDestination)
**********************************************************
** Instead of CAB, you can use WinZips's
** command line utility also, in which case
** change the code 'lcCmd' suitably.
**********************************************************
FUNCTION gsCabBack
LPARAMETERS lcSource, lcDestination
LOCAL lcCmd, lnSuccess, loShell
IF !EMPTY(lcDestination) OR !EMPTY(lcSource)
lcCmd = "CABARC -r -p N " + ;
lcDestination + SPACE(1) + lcSource
loShell = CREATEOBJECT("wscript.shell")
lnSuccess = loShell.Run(lcCmd,1,.t.)
IF lnSuccess = 0
=MESSAGEBOX("BackUp successful.",0+64,"Backup OK!")
ELSE
=MESSAGEBOX("BackUp failed",0+16,"Caution")
ENDIF
ENDIF
RETURN lnSuccess
**********************************************************
** EOF
**********************************************************
***********************************************************************************
*************
Sincronizar data/hora do servidor
*********************************************************
** Author : Ramani (Subramanian.G)
** FoxAcc Software / Winners Software
** Type : Freeware with reservation to Copyrights
** Warranty : Nothing implied or explicit
*********************************************************
** You can incorporate this code suitably.
** Replace 'myServer' with server name suitably
** and can be done with a function as well.
myServerName = "myServer"
lcCmd = GETENV("ComSpec") + " /C NET TIME \\"+ ;
myServerName+" /SET /YES"
loShell = CREATEOBJECT("wscript.shell")
loShell.Run(lcCmd,0,.t.)
*********************************************************
***********************************************************************************
*************
Enviar tecla para um software esterno
Listado Completo
Local lnHWND, loWSH
Secuencias de Escape
En la siguiente línea loWSH.SendKeys("140{+}200") vemos que el signo de suma está
encerrado entre llaves. Esto se debe a que está definiendo una secuencia de escape,
indicándole al WSH que debe enviar el caracter "+", y debe hacerse de esta forma ya
que un signo "+" sin llaves estaría indicando que se debe enviar la pulsación de la
tecla SHIFT (por ejemplo: "+casa", enviaría "Casa"). Vea Material Adicional para
obtener la lista completa de secuencias de escape.
Conclusión
Si bien el ejemplo es muy sencillo y probablemente nunca se nos va a ocurrir
automatizar la calculadora para hacer una suma, vale la pena analizarlo ya que
muestra claramente el uso del método SendKeys del WSH.
Material Adicional
Refiérase a http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/script56/html/wsmthsendkeys.asp para consultar las secuencias de escape
definidas para el método SendKeys del WSH.
***********************************************************************************
*************
Necesitaba una rutina que me permitiera desvincular una tabla respecto de su base
de datos asociada...
LPARAMETERS tcNombreTabla
LOCAL LnManejador, lnArea,LnPrincipio,Lnpospr,lncampos,Lccadena
*!* Abro el archivo
lnManejador = FOPEN(tcNombreTabla,2)
IF lnManejador > 0
*:* Obtengo la cadena COMPLETA con el nombre de la DBC incluido
lcCadena = FREAD(lnManejador, 32)
*!* Obtengo la cantidad de campos
Lnpospr=val(ALLTRIM ( STR (;
val(str ( ASC ( Substr ( lcCadena , 10 , 1 ) )*256 )) +;
val(str( ASC ( Substr ( lcCadena , 9 , 1 ) ) ) ) ;
)))
lnCampos=((LnposPr-296)/32)
*:* Calcuo la posicion del principio de la cadena con el nombre de la dbc
LNPrincipio= 32 + 1 + lnCampos * 32
FSEEK(lnManejador,LnPrincipio)
*:* Obtengo la cadena COMPLETA con el nombre de la DBC
lcCadena = FREAD(lnManejador, 263)
if left(lcCadena,1) == CHR(0)
lcCadena = ""
ELSE
*:* Corto la cadena hasta el primer CHR(0)
lcCadena = LEFT(lcCadena, AT(CHR(0), lcCadena) - 1)
*:* Vuelvo a posicionarme en el principio de la cadena con el nombre de la
dbc
FSEEK(lnManejador,LnPrincipio)
*:* Reemplazo el nombre de la cadena con Chr(0)
if fwrite(lnManejador,replicate(chr(0),len(lccadena)),10) < 0
messagebox("No puede desVincular la tabla")
endif
ENDIF
FCLOSE(lnManejador)
ENDIF
*************************************
***********************************************************************************
*************
Muchas veces nos encontramos que tenemos mas de 10 tablas en nuestra base de datos
y queremos Respaldarlas todas la cual tenemos que escribir un extenso codigo.
Aquí tienes un truco para Respaldar todas las tablas en unas cortas lineas:
PROCEDURE Respaldo
LOCAL lcLugar
*!*-------------------------------------------------------*!*
*!* Aqui se busca el lugar en donde se hara el respaldo *!*
*!* y crea la carpeta en caso de no existir *!*
*!*-------------------------------------------------------*!*
lcLugar = GETDIR()+ 'Respaldo\'
IF !DIRECTORY("&lclugar")
MD &lcLugar && Si el directorio no existe lo crea
ENDIF
*!*-------------------------------------------------------*!*
*!* De existir la carpeta elimina todas las tablas que *!*
*!* se encuentren dentro de esta... *!*
*!*-------------------------------------------------------*!*
DELETE FILE &lcLugar*.DBF
SET DEFAULT TO "C:\miprograma\Tablas"
CLOSE DATABASE
gndbcnumber = ADIR(gabasedatos, '*.dbf') && crea la matriz.
FOR ncount = 1 TO gndbcnumber
WAIT WINDOWS "Respaldando la tabla: " + ALLTRIM(gabasedatos(ncount,1)) NOWAIT
USE ALLTRIM(gabasedatos(ncount,1)) IN 0 && EXCLUSIVE
COPY ALL TO '&lcLugar\' + ALLTRIM(gabasedatos(ncount,1))
USE
ENDFOR
SET DEFAULT TO "C:\miprograma\"
CLOSE DATABASE
OPEN DATABASE "D:\miprograma\tablas\mibd.DBC"
ENDPROC
Fijate que con este codigo si son mil tablas, las mil se respaldan. Y tu no tienes
que sino solo correr el prg.
Saludos,
***********************************************************************************
*************
Un WAIT WINDOW centrado.
FUNCTION WaitWindowCentrado
LPARAMETERS pcmensaje, pnmodo, pnsegundos, lcarea
IF pcount() = 0 OR TYPE("pcmensaje") # "C"
RETURN("")
ENDIF
IF TYPE("pnmodo") # "N"
pnmodo = 0
ENDIF
IF TYPE("pnsegundos") # "N"
pnsegundos = 1
ENDIF
IF TYPE("lcarea") # "C"
lcarea = "_SCREEN"
ENDIF
LOCAL lnfila AS INTEGER, lncolumna AS INTEGER
LOCAL lnold_scale, lcmodo AS CHARACTER, lcresp AS CHARACTER
DO CASE
CASE pnmodo = 0
lcmodo = ""
CASE pnmodo = 1
lcmodo = "NOWAIT"
CASE pnmodo = 2
lcmodo = "TIMEOUT pnsegundos"
OTHERWISE
lcmodo = ""
ENDCASE
lnold_scale = &lcarea..SCALEMODE
&lcarea..SCALEMODE = 0
lnfila = &lcarea..HEIGHT / 2
lncolumna = ( &lcarea..WIDTH / 2 ) - LEN(pcmensaje) / 2
WAIT WINDOW pcmensaje TO lcresp AT lnfila, lncolumna &lcmodo
&lcarea..SCALEMODE = lnold_scale
RETURN(lcresp)
ENDFUNC
***********************************************************************************
*************
Rutina para obtener la configuracion regional de Windows mediante API.
DIMENSION aDatos(1)
? GetConfiRegi( @aDatos )
DISPLAY MEMORY LIKE aDatos
*-------------------------------------------------------
* Retorna en una array pasado por referencia, algunos
* valores de la configuración regional
* PARAMETROS: aDatos
* USO: DIMENSION aDatos(1)
* GetConfiRegi( @aDatos )
* DEVUELVE: aDatos(1) = Símbolo decimal
* aDatos(2) = Símbolo separador de miles
* aDatos(3) = Número de dígitos decimales
* aDatos(4) = Símbolo de signo negativo
* aDatos(5) = Formato de números negativos
*-------------------------------------------------------
FUNCTION GetConfiRegi(aDatos)
#DEFINE LOCALE_USER_DEFAULT 0x400 &&1024
#DEFINE LOCALE_SDECIMAL 0xE
#DEFINE LOCALE_STHOUSAND 0xF
#DEFINE LOCALE_IDIGITS 0x11
#DEFINE LOCALE_SNEGATIVESIGN 0x51
#DEFINE LOCALE_INEGNUMBER 0x1010
LOCAL sRetval AS STRING, nRET AS LONG
IF PCOUNT() < 1 THEN
RETURN .F.
ENDIF
DECLARE LONG GetLocaleInfo IN WIN32API LONG LOCALE, ;
LONG LCTYPE, STRING LPLCDATA, LONG CCHDATA
DIMENSION aDatos(5)
FOR nRET = 1 TO 5
m.aDatos(nRET) = ""
NEXT
m.sRetval = REPLICATE(CHR(0),256)
* Símbolo decimal
m.nRET = GetLocaleInfo(LOCALE_USER_DEFAULT, ;
LOCALE_SDECIMAL, @sRetval, LEN(m.sRetval))
IF m.nRET > 0 THEN
m.aDatos(1) = LEFT(m.sRetval,m.nRET-1)
ENDIF
m.sRetval = REPLICATE(CHR(0),256)
* Símbolo separador de miles
m.nRET = GetLocaleInfo(LOCALE_USER_DEFAULT, ;
LOCALE_STHOUSAND, @sRetval,LEN(m.sRetval))
IF m.nRET > 0 THEN
m.aDatos(2) = LEFT(m.sRetval,m.nRET-1)
ENDIF
m.sRetval = REPLICATE(CHR(0),256)
* Número de dígitos decimales
m.nRET = GetLocaleInfo(LOCALE_USER_DEFAULT, ;
LOCALE_IDIGITS, @sRetval,LEN(m.sRetval))
IF m.nRET > 0 THEN
m.aDatos(3) = LEFT(m.sRetval,m.nRET-1)
ENDIF
m.sRetval = REPLICATE(CHR(0),256)
* Símbolo de signo negativo
m.nRET = GetLocaleInfo(LOCALE_USER_DEFAULT, ;
LOCALE_SNEGATIVESIGN, @sRetval,LEN(m.sRetval))
IF m.nRET > 0 THEN
m.aDatos(4) = LEFT(m.sRetval,m.nRET-1)
ENDIF
m.sRetval = REPLICATE(CHR(0),256)
* Formato de números negativos
m.nRET = GetLocaleInfo(LOCALE_USER_DEFAULT, ;
LOCALE_SNEGATIVESIGN, @sRetval,LEN(m.sRetval))
IF m.nRET > 0 THEN
m.aDatos(5) = LEFT(m.sRetval,m.nRET-1)
DO CASE
CASE m.aDatos(5) = "0"
m.aDatos(5) = "(1.1)"
CASE m.aDatos(5) = "1"
m.aDatos(5)= " -1.1"
CASE m.aDatos(5) = "2"
m.aDatos(5) = "- 1.1"
CASE m.aDatos(5) = "3"
m.aDatos(5) = "1.1-"
CASE m.aDatos(5) = "4"
m.aDatos(5) = "1.1 -"
ENDCASE
ENDIF
ENDFUNC
***********************************************************************************
*************
Esta simple rutina determina si existe el método "primero" en un formulario.
Útil por ejemplo en un tool bar que funcione con varios formularios:
***********************************************************************************
*************
Una forma facil de enviar un mensaje a usuarios de la red es por medio del
servicio mensajero, aqui tienes el codigo para hacerlo...
netsend('ip_maquina_destino','Mensaje de prueba')
Function NetSend
Lparameters lcMaquina as String,lcMensaje as String
Local loWshShell as Object
loWshShell = CREATEOBJECT("WScript.shell")
loWshShell.Run("%COMSPEC% /C %SystemRoot%\system32\net send "+lcMaquina+"
"+lcMensaje, 0, .F.)
loWshShell = Null
Release loWshShell
EndFunc
***********************************************************************************
*************
Función recursiva que retorna el nombre de todos los subdirectorios de un
directorio pasado como parámetro.
*-----------------------------------------------------------------
* FUNCTION ASubdirectorios(taArray, tcRoot)
*-----------------------------------------------------------------
* Devuelve en un array pasado por referencia todos los nombres de
* subdirectorios del directorio "tcRoot".
* Los nombres son de la forma: [Unidad]:[\Directorio][\Subdirectorio]
* RETORNO: Cantidad de subdirectorios en el array. Si no encontró ningún
* subdirectorio o el directorio "tcRoot" no existe, retorna 0 (cero)
* EJEMPLO DE USO:
* DIMENSION laMiArray[1]
* lnC = ASubdirectorios(@laMiArray, "C:\Mis Documentos\")
* ? "Cantidad de subdirectorios:", lnC
* FOR lnI = 1 to lnC
* ? laMiArray[lnI]
* ENDFOR
*-----------------------------------------------------------------
FUNCTION ASubdirectorios(taArray, tcRoot)
IF EMPTY(tcRoot)
tcRoot = SYS(5) + CURDIR()
ENDIF
DIMENSION taArray[1]
=ARecur(@taArray, tcRoot)
IF ALEN(taArray) > 1
DIMENSION taArray[ALEN(taArray) - 1]
RETURN ALEN(taArray)
ELSE
RETURN 0
ENDIF
ENDFUNC
*-----------------------------------------------------------------
* FUNCTION ARecur(taArray, tcRoot)
*-----------------------------------------------------------------
* Funcion recursiva llamada por ASubdirectorios
*-----------------------------------------------------------------
FUNCTION ARecur(taArray, tcRoot)
PRIVATE lnI, lnCant, laAux
tcRoot = ADDBS(tcRoot)
lnCant = ADIR(laAux, tcRoot + "*.", "D")
FOR lnI = 1 TO lnCant
IF "D" $ laAux[lnI, 5]
IF laAux[lnI, 1] == "." OR laAux[lnI, 1] == ".."
LOOP
ELSE
lcSubDir = tcRoot + laAux[lnI, 1]
=ARecur(@taArray, lcSubDir)
taArray[ALEN(taArray)] = ADDBS(tcRoot + laAux[lnI, 1])
DIMENSION taArray[ALEN(taArray) + 1]
LOOP
ENDIF
ENDIF
ENDFOR
RETURN
ENDFUNC
*-----------------------------------------------------------------
***********************************************************************************
*************
Esta clase permite reindexar las tablas contenidas en una carpeta. Para ello
releva información de los índices actuales de cada tabla, los elimina y reconstruye
nuevamente, y el tiempo que consume es muy poco.
******************************************************************
DEFINE CLASS IndexManager AS SESSION
******************************************************************
*==============================================================
FUNCTION Reindexa(tcTablesPath AS STRING) AS VOID
* regenera los índices de las tablas
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LOCAL laInfo[1],;
laTagInfo[1],;
lnFiles,;
lnCounter,;
lnTagCount,;
lnTag,;
lcTable,;
lcAlias,;
lcIndexExpr,;
lcOrden,;
lOk
TRY
lOk = .T.
*** levanta info de las tablas
lnFiles = ADIR(laInfo,ADDBS(tcTablesPath) + '*.dbf')
IF EMPTY(lnFiles)
RETURN .F.
ENDIF
*** regenera
FOR lnCounter = 1 TO lnFiles
lcAlias = JUSTSTEM(laInfo[lnCounter,1])
lcTabla = ADDBS(tcTablesPath)+ laInfo[lnCounter,1]
lcDbf = ADDBS(tcTablesPath) + lcAlias
WAIT WINDOW "Procesando " + lcAlias NOWAIT
USE (lcTabla) IN 0 ALIAS (lcAlias) EXCLUSIVE
SELECT (lcAlias)
*** info sobre los índices
lnTagCount = ATAGINFO(laTagInfo)
*!* 1 Index tag name in a .cdx file
*!* 2 Index tag type
*!* 3 Index key expression
*!* 4 Filter expression
*!* 5 Index order as created (Ascending or Descending)
*!* 6 Collate sequence
IF !EMPTY(lnTagCount)
*** elimina los índices existentes
DELETE TAG ALL
FOR lnTag = 1 TO lnTagCount
cNomIndice = laTagInfo(lnTag,1)
cExpresion = laTagInfo(lnTag,3)
lcTipo = laTagInfo(lnTag,2)
lcOrden = laTagInfo(lnTag,5)
lPrimario = .F.
lCandidato = .F.
IF VERSION(3) = "34"
*--- Español
DO CASE
CASE lcTipo = "PRINCIPAL"
lPrimario = .T.
CASE lcTipo = "CANDIDATO"
lCandidato = .T.
OTHERWISE
lPrimario = .F.
lCandidato = .F.
ENDCASE
IF lcOrden = "ASCENDENTE"
lDescending = .F.
ELSE
lDescending = .T.
ENDIF
ELSE
*--- suponemos que es la versión en Inglés
DO CASE
CASE lcTipo = "PRIMARY"
lPrimario = .T.
CASE lcTipo = "CANDIDATE"
lCandidato = .T.
OTHERWISE
lPrimario = .F.
lCandidato = .F.
ENDCASE
IF lcOrden = "ASCENDING"
lDescending = .F.
ELSE
lDescending = .T.
ENDIF
ENDIF
cFiltro = laTagInfo(lnTag,4)
DO CASE
CASE lPrimario
cIndex = "alter table " + lcDbf + " add primary key " +
ALLTRIM(cExpresion) ;
+ IIF(!EMPTY(cFiltro)," for "+ALLTRIM(cFiltro),"") + " tag " +
ALLTRIM(cNomIndice)
&cIndex
CASE lCandidato
cIndex = "index on " + ALLTRIM(cExpresion) + " tag " +
ALLTRIM(cNomIndice) ;
+ IIF(!EMPTY(cFiltro)," for "+ALLTRIM(cFiltro),"") + " candidate"
&cIndex
OTHERWISE
cIndex = "index on " + ALLTRIM(cExpresion) + " tag " +
ALLTRIM(cNomIndice) + ;
IIF(!EMPTY(cFiltro)," for "+ALLTRIM(cFiltro),"") +
IIF(lDescending," descending","")
&cIndex
ENDCASE
ENDFOR
ENDIF
USE IN (lcAlias)
ENDFOR
CATCH TO oErr
* SUSPEND
lOk = .F.
cMensaje = "Error Nº : " + STR(oErr.ErrorNo) + CHR(13) +;
"Línea : " + STR(oErr.LINENO) + CHR(13) +;
"Mensaje : " + oErr.MESSAGE + CHR(13) +;
"Procedimiento : " + oErr.PROCEDURE + CHR(13) +;
"Detalles : " + oErr.Details + CHR(13) +;
"Instrucciones : " + oErr.LineContents
MESSAGEBOX(cMensaje, 64, "Error en Datos ")
FINALLY
IF lOk
MESSAGEBOX("La reindexación de archivos ha finalizado con éxito", 64,
"¡Atención!")
ELSE
MESSAGEBOX("Ha ocurrido algún problema en el proceso de reindexación", 64,
"¡Atención")
ENDIF
ENDTRY
ENDFUNC
*==============================================================
ENDDEFINE
******************************************************************
oIndex = NEWOBJECT("IndexManager","indexa.prg")
oIndex.reindexa("c:\miprograma\misbases")
***********************************************************************************
*************
Obtener la dirección IP local de la maquina.
loSock = CREATEOBJECT('MSWinsock.Winsock.1')
? loSock.LocalIP
loSock = .NULL
***********************************************************************************
*************
Función que trunca un número en "n" posiciones decimales.
Ejemplo:
? Truncar(123.456789,2)
-> 123.45
*-------------------------------------------
* FUNCTION Truncar(tnNro, tnDec)
*-------------------------------------------
* Trunca un número en "n" posiciones decimales
* USO: Truncar(nNumero, nDecimales)
* PARAMETROS:
* tnNro = Número a truncar
* tnDec = Número de cifras decimales a truncar
* RETORNO: Numérico
*-------------------------------------------
FUNCTION Truncar(tnNro, tnDec)
LOCAL ln
IF EMPTY(tnDec)
tnDec = 0
ENDIF
ln = 10 ^ tnDec
RETURN ROUND(INT(tnNro * ln) / ln, tnDec)
ENDFUNC
*-------------------------------------------
***********************************************************************************
*************
Alguna vez te ha tocado la necesidad de agregar una tabla extra a tus formularios
ya creados? Puede ser algo tedioso si se tienen muchos formularios, tener que
abrirlos uno por uno y agregar la tabla y despues guardar.
Çetin Basöz, nuestro compañero MVP de VFP nos muestra como podemos realizarlo
programáticamente desde tu mismo IDE de VFP.
***********************************************************************************
*************
Deseas conocer la dirección IP con la que se está saliendo a internet, aquí te
mostramos un sencillo código, cortesía de Hugo M. Ranea en los foros públicos de
microsoft:
***********************************************************************************
*************
En alguna ocasión puede que obtengamos un nombre de archivo en formato corto, por
ejemplo:
c:\Docum~1\epalma\Misdoc~1\
y convertirlo a
c:\Documents and Settings\epalma\Mis documentos
a continuación una función API para llegar a ello, contesía una vez más, del MVP
Çetin Basöz.
***********************************************************************************
*************
Una manera más para saber si una aplicación ya está activa, esto para evitar cargar
dos veces la misma. Cortesía del MVP turco: Çetin Basöz
Function AppAlreadyRunning
Local hsem, lpszSemName
#Define ERROR_ALREADY_EXISTS 183
Declare Integer GetLastError In win32API
Declare Integer CreateSemaphore In WIN32API ;
string @ lpSemaphoreAttributes, ;
LONG lInitialCount, ;
LONG lMaximumCount, ;
string @ lpName
lpszSemName = "CadenaUnicadetuAplicacion"
hsem = CreateSemaphore(0,0,1,lpszSemName)
Return (hsem # 0 And GetLastError() == ERROR_ALREADY_EXISTS)
***********************************************************************************
*************
Con esta rutina puedes simular el efecto de la función "Guardar cómo ... Archivo de
Texto", de los navegadores web (IE o Netscape..). Cortesía del MVP de VFP Cetín
Bazos
Local m.myHTML,m.parsed
myHTML=[This< br> is an < font color="red">< b>example< /b >< /font >< Hr>x2 < x3]
*myHTML= FileToStr(GetFile('HTM'))
parsed = ''
oParser = Createobject('myParser',m.myHTML,@m.parsed)
? m.Parsed
*StrToFile(m.Parsed,'ParseResult.txt')
Procedure Init
Lparameters tcHTML, tcParse
lcTemp = Sys(2015)+'.htm'
Strtofile(tcHTML,lcTemp)
With This.oWB
.Navigate2('file://'+Fullpath(lcTemp))
Wait window 'Parsing...' nowait
Do While .ReadyState # 4 && Wait for ready state
EndDo
Endwith
Erase (lcTemp)
tcParse = This.oWB.Document.body.innerText
Wait clear
Return .f.
Endproc
Enddefine
***********************************************************************************
*************
Un código para llevarlo a cabo. Bastante sencillo (y gratis).
iMsg = CreateObject("CDO.Message")
iMsg.From = ALLTRIM(Thisform.txtEmail.Value)
iMsg.Subject = ALLTRIM(Thisform.txtAsunto.Value)
iMsg.To = ALLTRIM(lcMailAddress)
IF !EMPTY(Thisform.txtAdjunto1.Value)
iMsg.AddAttachment(ALLTRIM(Thisform.txtAdjunto1.Value))
ENDIF
WaitWCtr("Dando formato al mensaje ....",.T.)
lcMessage = ALLTRIM(Thisform.txtPlantilla.Value)
lcMessage = "file://"+FULLPATH(ALLTRIM(lcMessage))
iMsg.CreateMHTMLBody( lcMessage,0)
WaitWCtr("Enviando mensaje....",.T.)
iMsg.Send
RELEASE iMsg
***********************************************************************************
*************
Función para validar un número de tarjeta de crédito.
Esta función es válida para casi todos los tipos de tarjetas de crédito. La función
solo comprueba que el número sea válido, no así de que tipo de tarjeta se trata, ni
la entidad que la emitió.
FUNCTION Val_TC(tcTC)
LOCAL ln, lnSuma, lnDigito
tcTC = ALLTRIM(CHRTRAN(tcTC,"- ",""))
lnSuma = 0
FOR ln = 1 TO LEN(tcTC)
lnDigito = VAL(SUBSTR(tcTC,ln,1))
IF MOD(ln,2)=0
lnSuma = lnSuma + lnDigito
ELSE
lnDigito = lnDigito * 2
lnSuma = lnSuma + IIF(lnDigito > 9, lnDigito - 9, lnDigito)
ENDIF
ENDFOR
RETURN MOD(lnSuma,10) = 0 AND lnSuma < 150
ENDFUNC
***********************************************************************************
*************
Respuesta de Alex Feldstein en el Grupo de Noticias de Microsoft en Español, a la
pregunta de como ejecutar Outlook Express desde Visual FoxPro.
***********************************************************************************
*************
Ejemplo de una pantalla de bienvenida (splash screen) en un formulario de nivel
superior que no se muestra en la barra de tareas de Windows.
El código de este ejemplo fue ligeramente modificado del Artículo 190350 de la Base
de Conocimientos de Microsoft:
LOCAL lc
SET SAFETY OFF
*-- Creo una carpeta para MiApp
IF NOT DIRECTORY("C:\MiApp")
MD "C:\MiApp"
ENDIF
*-- Creo el archivo MiApp.PRG
TEXT TO lc NOSHOW
*-- Inicio del programa MiApp.prg
LOCAL loPresenta, loPrincipal
loPresenta = NEWOBJECT("FormPresenta")
loPresenta.SHOW()
*-- Demora para mostrar el formulario Presenta
*-- En este lugar preparo mi aplicación,
*-- configuro lo necesario, etc.
FOR ln = 1 TO 30
INKEY(.1)
ENDFOR
loPrincipal = NEWOBJECT("FormPrincipal")
loPrincipal.SHOW()
RELEASE loPresenta
loPresenta = NULL
READ EVENTS
loPrincipal = NULL
CLOSE ALL
CLEAR ALL
QUIT
*-- Formulario Presenta
DEFINE CLASS FormPresenta AS FORM
ALWAYSONTOP = .T.
AUTOCENTER = .T.
WIDTH = 468
HEIGHT = 319
NAME = "Presenta"
SHOWWINDOW = 2
DESKTOP = .T.
TITLEBAR = 0
BORDERSTYLE = 1
MOUSEPOINTER = 11
ADD OBJECT imgLogo AS IMAGE WITH ;
PICTURE = HOME(2)+"Tastrade\Bitmaps\splash.bmp", ;
TOP = 0, ;
LEFT = 0
ADD OBJECT lblEspere AS LABEL WITH ;
TOP = 250, ;
LEFT = 10, ;
CAPTION = "Espere un momento...", ;
FONTSIZE = 14, ;
FONTBOLD = .T., ;
FONTNAME = "Arial", ;
AUTOSIZE = .T., ;
BACKSTYLE = 0
PROCEDURE INIT
SET CURSOR OFF
THIS.SETALL("MOUSEPOINTER", THIS.MOUSEPOINTER)
ENDPROC
PROCEDURE DESTROY
SET CURSOR ON
ENDPROC
ENDDEFINE
*-- Formulario Principal
DEFINE CLASS FormPrincipal AS FORM
CAPTION = "Formulario Principal"
SHOWWINDOW = 2
AUTOCENTER = .T.
WIDTH = 640
HEIGHT = 480
ADD OBJECT cmdSalir AS BotonSalir WITH ;
TOP = 10, ;
LEFT = 500
PROCEDURE DESTROY
CLEAR EVENTS
ENDPROC
ENDDEFINE
*-- Boton Salir
DEFINE CLASS BotonSalir AS COMMANDBUTTON
HEIGHT = 30
WIDTH = 130
CAPTION = "Salir"
PROCEDURE CLICK
THISFORM.RELEASE
ENDPROC
ENDDEFINE
*-- Fin de MiApp.prg
ENDTEXT
STRTOFILE(lc,"C:\MiApp\MiApp.prg")
*-- Creo el archivo Config.fpw
TEXT TO lc NOSHOW
SCREEN = OFF
RESOURCE = OFF
ENDTEXT
STRTOFILE(lc,"C:\MiApp\Config.fpw")
*-- Genero el PJX y EXE
BUILD PROJECT "C:\MiApp\MiApp.pjx" FROM "C:\MiApp\MiApp.prg", "C:\MiApp\Config.fpw"
BUILD EXE "C:\MiApp\MiApp.EXE" FROM "C:\MiApp\MiApp.pjx"
MESSAGEBOX("Ahora ejecute C:\MiApp\MiApp.EXE",64,"Aviso")
***********************************************************************************
*************
Un codigo bastante sencillo para llevar a cabo este cálculo...
Hace algunos dias lei en una respuesta del compañero Hugo M. Ranea, la solución a
este misterio "¿Cómo calcular la raiz cúbica?"...
Function RaizCubica
LParameters tnNumero
RETURN (tnNumero ^ (1/3))
EndFunction
***********************************************************************************
*************
Función que transforma un número hexadecimal en binaro.
? Hex2Bin("123ABC")
FUNCTION Hex2Bin(tcHex)
LOCAL lcRet, lnDec, lnI
lcRet = ""
FOR lnI = 1 TO LEN(ALLTRIM(tcHex))
lnDec = EVALUATE("0x"+SUBSTR(tcHex,lnI,1))
lcRet = lcRet + ;
IIF(BITTEST(lnDec,3),"1","0") + IIF(BITTEST(lnDec,2),"1","0") + ;
IIF(BITTEST(lnDec,1),"1","0") + IIF(BITTEST(lnDec,0),"1","0")
ENDFOR
RETURN lcRet
ENDFUNC
***********************************************************************************
*************
IMAGEM VIA XML
* Add a record
Append blank
Replace nID with Recno()
Append memo mImages from (cImage)
* receive XML
oXA.LoadXML("c:temptest.xml",.T.,.T.)
oXA.Tables.Item(1).ToCursor()
oXA.ReleaseXML(.F.)
* clean up
Release oXA
* EOF
***********************************************************************************
*************
Función que añade un caracter de Retorno de Carro [CHR(13)] en un párrafo para
separarlo en líneas de "n" caracteres sin cortar ninguna palabra.
La función recursiva CortarParrafo() prepara una cadena para luego separarla con la
función ALINES() en varias lineas de "n" o menos caracteres.
Ejemplo:
FOR ln = 1 TO ALINES(la,CortarParrafo(lcCadena,40))
? la(ln)
ENDFOR
FUNCTION CortarParrafo(tc,tn)
LOCAL lc, ln
tc = ALLTRIM(tc) + " "
lc = SUBSTR(tc,1,tn)
ln = RAT(" ",lc)
lc = SUBSTR(lc,1,ln-1)
RETURN IIF(EMPTY(lc),lc, ;
lc + CHR(13) + CortarParrafo(SUBSTR(tc,ln+1),tn))
ENDFUNC
***********************************************************************************
*************
Con Visual FoxPro 8.0 se introdujeron los campos AutoIncrementales, veremos una
forma de reiniciarlos.
El caso puede llegar en el momento en que se desea borrar todo el contenido de una
tabla con autoincrementales, pero tambien deseas que dichos incrementos inicien
como si la tabla fuera "nueva".
Está claro que lo puedes hacer mediante el diseñador de tablas, pero esta opción no
estará disponible en tiempo de ejecución ("Runtime"), lo mismo pasará en el caso de
que desees hacerlo con cursores creados con el comando CREATE CURSOR.
A continuación un código que mandé como respuesta a esta duda en el newsgroup de
microsoft, el cual ayudará a realizar esta tarea programáticamente.
****************************************************
* Procedure: ResetTables
* Author: Esparta Palma Date: 17/Mayo/2004
* Purpose: Reinicia los contadores de AutoIncrementales en un cursor
****************************************************
PROCEDURE ResetTables
LPARAMETERS tcCursor
LOCAL llError
llError = .F.
IF VARTYPE(tcCursor)="C" AND NOT EMPTY(tcCursor)
IF NOT USED(tcCursor)
TRY
USE (tcCursor) IN 0 EXCLUSIVE
CATCH TO loErrorUsing
llError = .T.
DO CASE
CASE loErrorUsing.ErrorNo = 1
lnReturnValue = -2 && The Table doesn't exists
CASE loErrorUsing.ErrorNo = 1705
lnReturnValue = -3 && Acess denied, used by another user
OTHERWISE
lnReturnValue = -4 &&Unknow Error
ENDCASE
ENDTRY
IF llError
RETURN lnReturnValue
ENDIF
ELSE
IF NOT ISEXCLUSIVE(tcCursor)
RETURN -5 && Used by this user, but not Exclusive
ENDIF
ENDIF
llError = .F.
lnChangedFields = 0
FOR lnFields=1 TO AFIELDS(laFields,tcCursor)
IF laFields[lnFields,18] # 0 &&This Field has AutoInc
TRY
ALTER TABLE (tcCursor) ALTER COLUMN (laFields[lnFields,1]);
INT AUTOINC NEXTVALUE 1 STEP (laFields[lnFields,18])
lnChangedFields = lnChangedFields + 1
CATCH TO loError
llError = .T.
?[ Error: ] + STR(loError.ErrorNo)
?[ Message: ] + loError.MESSAGE
lnReturnValue = -6 &&Error Altering the Table
ENDTRY
IF llError
RETURN lnReturnValue
ENDIF
ENDIF
ENDFOR
ELSE
RETURN -1 && Wrong parameters...
ENDIF
RETURN lnChangedFields
ENDPROC
***********************************************************************************
*************
Esta función es muy útil para establecimientos donde las monedas de centavos ya no
se usan tan frecuentemente y/o por comodidad se cobra 5 centavos arriba, es decir:
$145.02 se convierte en $145.05, $145.07 se convierte en $145.10.
function redondeoacincocentimos
lparameters m.nValor
return ceiling(m.nvalor * 20) / 20
endfunc
***********************************************************************************
*************
Muchas veces necesitamos cerrar las tablas temporales que creamos en algunos de
nuestros formularios para que no nos provoque un error cuando intentemos crearlas
con el mismo nombre en otro formulario.
DIMENSION aTablas(1)
nTablas = AUSED(aTablas)
IF nTablas > 0
FOR EACH oTabla IN aTablas
SELECT (oTabla)
USE
ENDFOR
ENDIF
***********************************************************************************
*************
Esta clase nos permite generar una cadena única de caracteres a partir de otra
cadena. Se hizo tomando como base una rutina similar enviada por Luis María, a
quien le agradezco inmensamente. Es muy util a la hora de generar claves de acceso
y/o cadenas de licencias, etc.
La clase es la siguiente.
Actualmente está diseñada para generar llaves de 8 caracteres por defecto, y hasta
10 máximo. Se puede extender a cualquier límite.
oKey = CREATEOBJECT("GenKey")
? oKey.GenKey("MiTexto", 8)
RELEASE oKey
***********************************************************************************
*************
Otra pregunta frecuente es cómo terminar los programas que están corriendo, por
ejemplo Word, Excel, etc. Y aprovecho la respuesta que le pasé a William Moreno en
el newsgroup para ponerla aquí, ya que tiene mayor persistencia.
KillProcessByName('wordpad.exe')
KillProcessByName('excel.exe')
KillProcessByName('winword.exe')
KillProcessByName('notepad.exe')
Procedure KillProcessByName(tcProcessID)
If Vartype(tcProcessID) = 'C' And Not Empty(tcProcessID)
loService = Getobject("winmgmts://./root/cimv2")
loProcesses = loService.ExecQuery([SELECT * FROM Win32_Process WHERE Name =
'] ;
+ Alltrim(tcProcessID) + ['])
For Each loProcess In loProcesses
loProcess.Terminate(0)
Next
Endif
Return
Endproc
***********************************************************************************
*************
En muchas oportunidades me han preguntado que si el CursorAdapter es similar al
DataAdapter de .Net se deberia poder trabajar con el de forma desconectada. Siempre
he respondido que si, pero las personas quedan algo dudosas y en muchas ocaciones
me dicen que no es posible que lo digo por promocionar el producto. Les envio este
pequeño ejemplo de como hacerlo.
******************************************************
Define Class OCursorAdapter As CursorAdapter
*Clase que hereda de Cursor adapter para hacer el Entorno de Trabajo
******************************************************
Protected DataSourceType , ;
Tables , ;
SendUpdates , ;
AllowDelete , ;
AllowInsert , ;
AllowUpdate , ;
WhereType , ;
KeyFieldList , ;
UpdateType , ;
BufferModeOverride
Alias = ""
Name = "OCursorAdapter"
BreakOnError = .F.
DataSourceType = ""
Tables = ""
SendUpdates = .T.
AllowDelete = .T.
AllowInsert = .T.
AllowUpdate = .T.
UpdateType = 1
WhereType = 1
KeyFieldList = ""
BufferModeOverride = 3
oADOConnection = .Null.
oADORecordset = .Null.
DataSourceType = "ADO"
updatetabla = .F.
*-------------------------------------------
Function Destroy()
*-------------------------------------------
This.Desconectar()
This.oADORecordset = Null
This.oADOConnection = Null
Endfunc
*-------------------------------------------
Protected Function AsignaCursor()
* Se conecta, y hace el Fill si Hay error al cargar los datos devuelve la
excepción, se desconecta
*-------------------------------------------
Catch To loExc
Throw
Finally
This.Desconectar()
Endtry
Return llRetVal
Endfunc
*----------------------------------------------------------------------------------
----
Protected Procedure BeforeCursorUpdate(nRows, lForce)
*----------------------------------------------------------------------------------
----
Local llRetVal As Boolean
Local loExc As Exception
llRetVal = .F.
This.updatetabla=.T.
Try
Do Case
Case This.Conectar() = .F.
Case This.CamposAct() = .F.
Otherwise
llRetVal = .T.
Endcase
Catch To loExc
Throw
Endtry
Return llRetVal
Endproc
*------------------------------------
Hidde Function Conectar()
**Función para Abrir la conexión ADO
*------------------------------------
If This.oADOConnection.State = 0
This.oADOConnection.ConnectionString = ;
"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security
Info=False;Initial Catalog=Northwind;Data Source=(local)"
This.oADOConnection.Open()
Endif
If Vartype(This.oADORecordset) <> "O"
This.oADORecordset = Createobject("ADODB.Recordset")
Endif
With This.oADORecordset
.CursorLocation = 3
.LockType = 3
.ActiveConnection = This.oADOConnection
If .State=0 And This.updatetabla
.Open()
Endif
Endwith
This.Datasource = This.oADORecordset
Catch To loExc
llRetVal = .F.
Throw
Endtry
Return llRetVal
Endfunc
*-----------------------------------------
Hidden Function Desconectar()
**Función para cerrar la conexión
*-----------------------------------------
Local llRetVal As Boolean
Local loExc As Exception
llRetVal = .T.
Try
If Vartype(This.oADOConnection) = "O" And This.oADOConnection.State = 1
This.oADOConnection.Close()
Endif
Catch To loExc
llRetVal = .F.
Throw
Endtry
This.oADOConnection=Null
Return llRetVal
Endfunc
*-------------------------------------
Protected Function CamposAct()
*--------------------------------------------------------------------------
*Función para crear la lista de campos actualizables
*--------------------------------------------------------------------------
Local llRetVal As Boolean,lnArea As Integer,lcCampos As String
Local lcNombre As String,lnCampos As Integer,loExc As Exception
Local Array laFields[1]
lcNombre = ""
lcCampos = ""
llRetVal = .F.
***********************************************************************************
*************
Nunca les pasó de querer convertir toda una selección de texto a mayúsculas o
minúsculas pulsando una tecla?
A mí ya se me dió varias veces este caso, pero nunca le pude encontrar la solución,
hasta ahora. ¡Lo que hace la necesidad!
Bueno, esta sencilla rutina es útil para llamar desde una tecla rápida (HotKey)
como F2, Ctrl+U o lo que quieran, y sirve tanto en modo de desarrollo como en
ejecución. La única condición es que esté habilitado el menú de edición de VFP.
*-- ToUpper.PRG
*-- Convierte el texto seleccionado a mayúsculas
*-- Fernando D. Bozzo
*-- Abril 2004
KEYBOARD '{CTRL+C}' PLAIN
DO WHILE CHRSAW()
DOEVENTS
ENDDO
_CLIPTEXT = UPPER(_CLIPTEXT)
KEYBOARD '{CTRL+V}' PLAIN
Luego de guardar el código anterior, se puede asignar a una tecla, como sigue:
Ahora sólo queda marcar un texto y pulsar F2 para que sea convertido a mayúsculas.
Saludos,
***********************************************************************************
*************
Calculo de idade
dBirth = DATE(1961,1,19)
oAge = Createobject("age")
*oAge.CalcAge(dBirth, dTarget)
oAge.CalcAge(dBirth)
? oAge.Years, oAge.Months, oAge.Days
? Gomonth(tdBirth, oAge.Years * 12 + oAge.Months) + oAge.Days
USE IN (SELECT("crsnp"))
CREATE CURSOR crsnp ( fecha d(8), metodo c(15) ,titulo c(100), cantidad N(10)
NULL,lugarentrega c(30),;
distribuidor c(50),moneda c(10),dto N(6,2)NULL,precio N(12,2)NULL,;
cotizacion N(10,2) NULL,;
origen N(10), codigotipostock c(10), iddistrib N(10),;
codigolibro N(10),codigo c(20), nropedido N(10) NULL,;
nrorenglon N(10) NULL, otros N(1),;
seleccion L,Marca L)
SELECT * FROM crsnp ORDER BY LugarEntrega, Metodo, DISTRIBUIDOR,titulo INTO CURSOR
crsnp READWRITE
TEXT TO lcSQL NOSHOW
SELECT codigolibro as coda,
SUM(CASE codigotipostock WHEN 'FI' THEN cantidad ELSE 0 END) AS Firme,
SUM(CASE codigotipostock WHEN 'CO' THEN cantidad ELSE 0 END) AS Consig,
SUM(CASE codigotipostock WHEN 'SV' THEN cantidad ELSE 0 END) AS Vendido,
SUM(CASE codigotipostock WHEN 'RF' THEN cantidad ELSE 0 END) AS RepFirme,
SUM(CASE codigotipostock WHEN 'RC' THEN cantidad ELSE 0 END) AS RepConsig
FROM cantidadportipodestock
WHERE codigolibro in (SELECT librosporpedido.codigolibro FROM librosporpedido
WHERE dbo.LibrosPorPedido.remanente = 1 AND
dbo.LibrosPorPedido.cantidad > 0)
GROUP BY codigolibro
ENDTEXT
qhandle = SQLCONNECT( .aconsultor(2,22))
SQLEXEC(qhandle, lcsql, "csql")
SELECT * FROM crsnp INNER JOIN csql ON crsnp.codigolibro = csql.coda ;
INTO CURSOR crsnp READWRITE
RELEASE qhandle
***********************************************************************************
*************
Este es un requisito común y muchas veces muy útil....
LOCAL loExcel
loExcel = CREATEOBJECT("Excel.Application")
loExcel.Open(lcArchivo)
loExcel.Visible = .T.
loExcel.Run(lcMacro)
CATCH To loError
MESSAGEBOX("No es posible terminar la Automatización"+;
"Error Extendido:"+loError.Message +CRLF +;
"Número de Error:" +TRANSFORM(loError.ErrorNo) ,16,"Error en la
Automatización")
FINALLY
loExcel = .NULL.
RELEASE loExcel
ENDTRY
Nota: El ejemplo utiliza los bloques TRY.. ENDTRY de Visual FoxPro 8, si tiene una
versión previa, quite esas instrucciones y utilice los métodos ya conocidos: ON
ERROR lError=.T. , etc etc
***********************************************************************************
*************
Trabajar con Información Importada desde MS-Excel, conteniendo datos tipo Fecha
Enviado por: Esparta Palma
Realmente desconozco el por qué sucede, pero cuando he importado archivos desde
Excel que contienen tipos de datos Fecha, estos se presentan de la siguiente
manera: 38007!!, cuando en realidad debería poner 24/01/2004. Veamos cómo darle la
vuelta al asunto.
Resulta que esos datos que se importan es la forma en realmente se guarda el dato
de tipo fecha, que significan esos números?, se refieren a los días transcurridos
desde el primer segundo del día primero de enero de 1900.
lcFile = GETFILE("XLS")
IF NOT EMPTY(lcFile)
IMPORT FROM (lcFile) TYPE XL5
Select *,DATETIME(1900,01,01)+TuCampodeTipoFecha-2 as NuevaFecha FROM (lcFile)
ENDIF
Notará que en la formula hay un -2, el "por qué" es sencillo o complicado según se
vea, en realidad debería ser -1, esto debido a los factores suizos de
compensaciones de formulas, pero por el hecho de que no se debe tomar en cuenta el
primer día de 1900 como ya transcurrido, pues se le restan 2, haga sus propias
pruebas, si me equivoco, podemos comentarlo.
***********************************************************************************
*************
Saludos...
Uso de la Clase:
LOCAL loJustify
loJustify = CREATEOBJECT("justify")
loJustify.cSalidaTexto = "salida.txt"
loJustify.set_textmerge_on
loJustify.dojustify(cTexto,nLong)
loJustify.set_textmerge_off
Donde:
cTexto = Texto que se quiere justificar
nLong = Longitud en caracteres a justificar
Despues Revisar el archivo salida.txt
**************************************************
*-- Class: justify
*-- ParentClass: custom
*-- BaseClass: custom
*-- Author: Oscar Gonzalez Hernandez
*
DEFINE CLASS justify AS CUSTOM
HEIGHT = 15
WIDTH = 16
*-- Contiene el texto ya justificado y se va acumulando
*-- hasta contener todo el texto justificado.
ctextoacumulado = ""
NAME = "justify"
*-- Contiene el nombre del archivo que se
*-- creará con el texto justificado.
csalidatexto = .F.
*-- Separa el texto pasado como parámetro en diferentes
*-- bloques si ses que se encuentran retornos de carro,
*-- sino regresa el texto completo.
PROCEDURE SEPARA
LPARAMETERS tcParrafo,taBloques,tbBloques
lnDimension = 0
FOR i = 1 TO LEN(tcParrafo)
IF ASC(SUBSTR(tcParrafo,i,1)) = 13
lnDimension = lnDimension + 1
DIMENSION laRetornos(lnDimension)
laRetornos(lnDimension) = i
ENDIF
ENDFOR
IF VARTYPE(laRetornos) = "U"
tbBloques = .F.
taBloques = tcParrafo
RETURN @taBloques
ENDIF
lnInicio = 1
FOR k = 1 TO ALEN(laRetornos)
DIMENSION taBloques(k)
taBloques(k) = SUBSTR(tcParrafo,lnInicio,laRetornos(k)-lnInicio)
lnInicio = laRetornos(k)+1
ENDFOR
DIMENSION taBloques(k)
taBloques(k) = SUBSTR(tcParrafo,lnInicio,LEN(tcParrafo)+1-lnInicio)
tbBloques = .T.
RETURN @taBloques
ENDPROC
*-- Ejecuta el proceso de justificado del texto separado
*-- en bloques o texto único regresado por el método separa().
PROCEDURE dojustify
LPARAMETERS tcTextoJustificar,tnLongJustificado
LOCAL lgBloques,lbBloques
THIS.SEPARA(tcTextoJustificar,@lgBloques,@lbBloques)
IF lbBloques && Se ha partido el exto en bloques
FOR lnCont = 1 TO ALEN(lgBloques)
THIS.ctextoacumulado = ""
THIS.Justificar(lgBloques(lnCont),tnLongJustificado)
TEXT
<<This.ctextoacumulado>>
ENDTEXT
ENDFOR
ELSE
THIS.ctextoacumulado = ""
THIS.Justificar(lgBloques,tnLongJustificado)
TEXT
<<This.ctextoacumulado>>
ENDTEXT
ENDIF
RETURN
ENDPROC
*-- Método recursivo que justifica párrafo por párrafo
*-- según la longitud de caracteres que se le indique.
PROCEDURE justificar
LPARAMETERS tcTexto,tnTamaño
IF EMPTY(SUBSTR(tcTexto,tnTamaño,1))
lcTextoJ = ALLTRIM(SUBSTR(tcTexto,1,tnTamaño-1))
IF EMPTY(lcTextoJ)
RETURN
ENDIF
tcTextoAlterno = SUBSTR(tcTexto,tnTamaño+1,LEN(tcTexto))
IF !EMPTY(tcTextoAlterno)
lcTextoAcumular = THIS.rellena(lcTextoJ,tnTamaño)
THIS.ctextoacumulado = THIS.ctextoacumulado + lcTextoAcumular + CHR(13)
tcTexto = SUBSTR(tcTexto,tnTamaño+1,LEN(tcTexto))
THIS.justificar(tcTexto,tnTamaño)
ELSE
lcTextoAcumular = lcTextoJ
THIS.ctextoacumulado = THIS.ctextoacumulado + lcTextoAcumular + CHR(13)
tcTexto = SUBSTR(tcTexto,tnTamaño+1,LEN(tcTexto))
THIS.justificar(tcTexto,tnTamaño)
ENDIF
ELSE
lcChar = SUBSTR(tcTexto,tnTamaño,1)
lnContador = tnTamaño
DO WHILE !EMPTY(lcChar)
lnContador = lnContador - 1
lcChar = SUBSTR(tcTexto,lnContador,1)
ENDDO
lcTextoJ = ALLTRIM(SUBSTR(tcTexto,1,lnContador))
tcTextoAlterno = SUBSTR(tcTexto,tnTamaño+1,LEN(tcTexto))
IF !EMPTY(tcTextoAlterno)
lcTextoAcumular = THIS.rellena(lcTextoJ,tnTamaño)
THIS.ctextoacumulado = THIS.ctextoacumulado + lcTextoAcumular + CHR(13)
tcTexto = SUBSTR(tcTexto,lnContador+1,LEN(tcTexto))
THIS.justificar(tcTexto,tnTamaño)
ELSE
lcTextoAcumular = lcTextoJ
THIS.ctextoacumulado = THIS.ctextoacumulado + lcTextoAcumular + CHR(13)
tcTexto = SUBSTR(tcTexto,lnContador+1,LEN(tcTexto))
THIS.justificar(tcTexto,tnTamaño)
ENDIF
ENDIF
ENDPROC
*-- Rellena el párrafo cortado por el método justificar()
*-- con el número de espacios correspondientes para crear
*-- un parrafo de la longitud deseada.
PROCEDURE rellena
LPARAMETERS tcParrafo,tnLong
IF LEN(tcParrafo) = tnLong
RETURN tcParrafo
ENDIF
lnDimension = 0
lcPalabra = ""
FOR i = 1 TO LEN(tcParrafo)
IF ASC(SUBSTR(tcParrafo,i,1)) = 32
lnDimension = lnDimension + 1
DIMENSION laEspacios(lnDimension)
laEspacios(lnDimension) = i
ENDIF
ENDFOR
IF VARTYPE(laEspacios) = "U"
RETURN tcParrafo
ENDIF
lnInicio = 1
FOR k = 1 TO ALEN(laEspacios)
DIMENSION laPalabras(k)
laPalabras(k) = SUBSTR(tcParrafo,lnInicio,laEspacios(k)-lnInicio)
lnInicio = laEspacios(k)+1
ENDFOR
DIMENSION laPalabras(k)
laPalabras(k) = SUBSTR(tcParrafo,lnInicio,LEN(tcParrafo)+1-lnInicio)
lnTotalEspacios = tnLong - LEN(tcParrafo)
lnEspaciosContados = 0
DO WHILE !EMPTY(lnTotalEspacios)
FOR l = 1 TO ALEN(laPalabras)-1
laPalabras(l) = laPalabras(l) + " "
lnTotalEspacios = lnTotalEspacios - 1
IF EMPTY(lnTotalEspacios)
EXIT
ENDIF
ENDFOR
ENDDO
lcParrafoFormateado = ""
lcParrafoFormateado = laPalabras(1)
FOR j = 2 TO ALEN(laPalabras)
lcParrafoFormateado = lcParrafoFormateado + " " + laPalabras(j)
ENDFOR
RETURN lcParrafoFormateado
ENDPROC
*-- Activa la configuración de salida del texto justificado.
PROCEDURE set_textmerge_on
SET TEXTMERGE TO (THIS.csalidatexto) NOSHOW
SET TEXTMERGE ON
ENDPROC
*-- Desactiva la configuración de salida del texto justificado.
PROCEDURE set_textmerge_off
SET TEXTMERGE TO
SET TEXTMERGE OFF
ENDPROC
ENDDEFINE
***********************************************************************************
*************
Responder
Recomendar Mensagem 1 de 2 em Discussão
Muchas veces ustedes habran querido enviar datos de su aplicación a excel, pero
muchas veces a un cliente final no le interesa mucho una tabla estática de excel,
pero cuando tiene una tabla dinámica, el puede agrupar los datos a su gusto, poner
o quitar columnas con solo arrastrar y general consultas dinámicas, con el
siguiente código que es parte de una clase que adjunto en este artículo, ustedes
podran pegarla en cualquier formulario y con solo ajustar tres propiedades podran
enviar a excel en forma de tabla dinamica cualquier tabla o consulta ya sea de
tablas nativas o de cliente servidor, y además si quieen se puede generar la
gráfica inmediatamente. La ventaja de todo esto es que esta diseñado con office
automation, por lo que les será muy fácil agregarle más funcionalidad de excel si
así lo requieren.Para que lo entiendan mejor voy a explicar algunas partes del
código.
ELSE
oPivotTable.PivotFields(m.lcCampo).ORIENTATION = 4 && datos
ENDIF
ENDIF
ENDFOR
***********/ Activar el rango seleccionado importante /****************
oTargetRange.ACTIVATE
IF THIS.PARENT.chart.VALUE=.T.
***********/ Crear el objeto gráfico /****************
ochart=oWorkbook.Charts.ADD()
***********/ Título del gráfico /****************
ochart.ChartTitle.CAPTION=ALLTRIM(vr_sp_procedures.sp_tittle)
ENDIF
**********/ Hacer visible la aplicación excel /*************
oExcel.APPLICATION.VISIBLE = .T.
**********/ Poner la ocpión de generar gráficos en falso /*************
THIS.PARENT.chart.VALUE=.F.
Les adjunto el archivo con la clase, lo único que tienen que hacer es pegarlo en
cualquier formulario y ajustar las tres propiedades y estan listos para enviar
tablas dinámicas a excel, una vez en excel solo tienen que ocultar las columnas que
no deseen en la tabla dinámica o cambiar la disposición de columnas a filas o lo
que ustedes quieran.
Ejemplo de como ajustar las propiedades desde un formulario en el que este pegada
esta clase:
THISFORM.Excel_dinamic_tables1.temporal=m.direccion_temporal
THISFORM.Excel_dinamic_tables1.chart_tittle="Cuentas por pagar Proveedores"
THISFORM.Excel_dinamic_tables1.cursor_name="Proveedores"
***********************************************************************************
*************
Esta rutina la utlizo para crear un código o identificador único de cualquier
longitud.
***********************************************************************************
*************
Como crear una vista parametrizada con condicion variable (E)
¿Estas harto de crearte un monton de vistas innecesarias para todas las consultas
que quieren hacer tus clientes?
cWhere = "cliventas>500000"
REQUERY()
Saludos !!!
***********************************************************************************
*************
Si utilizas Grids para captura en linea, quizás quieras limitar que ciertas filas
no puedan ser modificadas, es decir, dejarlas como de sólo lectura....
Quizas te resulte algo truculento, pero en realidad sirve... Puedes hacer a TODO el
grid de sólo lectura, y cuando se cambie de registro, poner en .T. o .F. el valor
de la propiedad ReadOnly (del Grid) según sea tu condición...
Veamos un ejemplo:
public oForm
oForm = CREATEOBJECT("MyForm")
oForm.Show()
DEFINE CLASS MyForm AS Form
ADD OBJECT MyGrid AS Grid
PROCEDURE LOAD
CREATE CURSOR Temp (nMes int,cMes c(15))
RAND(-1)
FOR lnCounter=1 TO 20
lnMes = RAND()*11+1
INSERT INTO temp VALUES(lnMes,cMONTH(DATE(2003,lnMes,01)))
ENDFOR
ENDPROC
PROCEDURE INIT
WITH This.MyGrid
.SetAll("DynamicBackColor", ;
"IIF(RECNO()%2 =0,RGB(255,255,255), ;
RGB(0,255,0))",;
"Column")
EndWith
ENDPROC
PROCEDURE UNLOAD
USE IN SELECT("Temp")
ENDPROC
PROCEDURE MyGrid.AfterRowColChange
LPARAMETERS nColIndex
This.ReadOnly=(RECNO()%2 # 0)
ENDPROC
ENDDEFINE
***********************************************************************************
*************
Aqui te proporcionamos una rutina de encriptado simple:
Te servira para encriptar un campo caracter, podras usar una llave de encriptación
que es un número entre el rango de 128 y 255 inclusive, esta misma sirve descriptar
lo que encriptaste, deberas usar la misma llave de encriptado con que encriptaste
para desencriptar.
FUNCTION encrip
LPARAMETERS tccodigo, tnclave
PRIVATE lnlong AS INTEGER, ;
lnii AS INTEGER, ;
lcvalor AS STRING, ;
lcletra AS CHARACTER, ;
lnnumero AS INTEGER
RETURN lcvalor
ENDFUNC
Prueba este ejemplo:
ENDFOR
ENDFOR
***********************************************************************************
*************
Esto nos ayudara a no tener mas de 2 veces nuestra aplicación activa en el mismo
computador.
LOCAL lcold_caption
lcold_caption=_screen.Caption
IF VALIDAR_PANTALLA("MI APLICACION", .T.)=.T.
_SCREEN.Caption="MI APLICACION"
=MESSAGEBOX("OK")
ENDIF
_screen.Caption=lcold_caption
FUNCTION validar_pantalla
LPARAMETERS pccaption, plmax
LOCAL lnhwnd
DECLARE INTEGER FindWindow IN Win32API STRING lpClassName, STRING lpWindowName
DECLARE INTEGER BringWindowToTop IN Win32API INTEGER HWND
DECLARE INTEGER SendMessage IN Win32API INTEGER HWND, INTEGER Msg, INTEGER
WParam, INTEGER LPARAM
lnhwnd = findwindow( 0, pccaption )
IF lnhwnd > 0
bringwindowtotop(lnhwnd) && Mandar la ventana de la aplicación al
frente
IF plmax = .T.
sendmessage(lnhwnd, 274, 61488, 0) && Maximizar la ventana de la
aplicación
ENDIF
RETURN .F.
ENDIF
RETURN .T.
ENDFUNC
Para probar generen un exe con esta rutina, coloquen un acceso directo en el
escritorio, y estando la pantalla activa vuelvan a ejecutar el programa. Veran que
no se carga nuevamente la aplicación, sino que se activa.
LOCAL lcold_caption
lcold_caption=_screen.Caption
IF VALIDAR_PANTALLA("MI APLICACION", .T.)=.T.
_SCREEN.Caption="MI APLICACION" && OJO AQUI VA EL CAPTION DE SU APLICACION.
*AQUI VA COMANDOS DE SU SISTEMA.
*ETC
*READ EVENTS
ENDIF
_screen.Caption=lcold_caption
*OTROS COMANDOS
*ETC.
***********************************************************************************
*************
Cuando diseñamos nuestra aplicacion tenemos como base una resolucion para nuestra
aplicacion, normalmente yo la diseño en 800 x 600, para garantizar el buen
funcionamiento yo le indico a los usuarios si estan usando la configuración básica
aceptable.
IF dimensiones()=.T.
=cambiar_resolucion(800,600)
ENDIF
FUNCTION dimensiones
#DEFINE h_screenwidth 0 && Screen width
#DEFINE h_screenheight 1 && Screen HEIGHT
LOCAL lnalto_screen, lnancho_screen
DECLARE INTEGER GetSystemMetrics IN Win32API;
INTEGER nIndex
lnalto_screen = getsystemmetrics(h_screenheight)
lnancho_screen = getsystemmetrics(h_screenwidth)
IF ( lnalto_screen < 600 OR lnancho_screen < 800 )
IF MESSAGEBOX("Es recomendable que la resolución "+CHR(13)+;
"de su monitor sea de 800 x 600"+CHR(13)+"Para que el sistema se ejecute
adecuadamente"+CHR(13)+CHR(13)+;
"¿ Desea cambiarla ?",4+32+0,"Verifique pregunta" ) = 6
RETURN .T.
ELSE
RETURN .F.
ENDIF
ELSE
RETURN .F.
ENDIF
#undefine h_screenwidth
#undefine h_screenheight
ENDFUNC
FUNCTION cambiar_resolucion
LPARAMETERS tnwidth, tnheight
LOCAL lnwidth, lnheight, lnmodenum, lcdevmode, lnresp
lnmodenum = 0
lcdevmode = REPLICATE(CHR(0), 156)
lnwidth = IIF(EMPTY(tnwidth), 800, tnwidth)
lnheight = IIF(EMPTY(tnheight), 600, tnheight)
DECLARE INTEGER EnumDisplaySettings IN Win32API STRING lpszDeviceName,
INTEGER iModeNum, STRING @lpDevMode
DECLARE INTEGER ChangeDisplaySettings IN Win32API STRING @lpDevMode , INTEGER
dwFlags
*!* Se usa obtener todos los modos disponibles
DO WHILE enumdisplaysettings(NULL, lnmodenum, @lcdevmode) <> 0
lnmodenum = lnmodenum + 1
ENDDO
lcdevmode = STUFF(lcdevmode, 41, 4, long2str(1572864))
lcdevmode = STUFF(lcdevmode, 109, 4, long2str(tnwidth)) && Ancho
lcdevmode = STUFF(lcdevmode, 113, 4, long2str(tnheight)) && Alto
lnresp = changedisplaysettings(@lcdevmode, 1)
IF lnresp = 0
MESSAGEBOX("La resolución de su monitor ha sido cambiada"+CHR(13)+;
"Ahora podra trabajar adecuamente",0+48+0,"atención" )
ELSE
MESSAGEBOX("No se pudo cambiar la resolución de su
monitor",0+48+0,"atención" )
ENDIF
ENDFUNC
FUNCTION long2str
LPARAMETERS lnlongval
*!* Convierte un long integer a un 4-byte character string
*!* Sintaxis: LongToStr(lnLongVal)
*!* Valor devuelto: lcRetStr
*!* Argumentos: lnLongVal
*!* lnLongVal especifica el long integer a convertir
LOCAL lncnt, lcretstr
lcretstr = ''
FOR lncnt = 24 TO 0 STEP -8
lcretstr = CHR(INT(lnlongval/(2^lncnt))) + lcretstr
lnlongval = MOD(lnlongval, (2^lncnt))
NEXT
RETURN lcretstr
ENDFUNC
*****
***********************************************************************************
*************
No me culpen a mí, pero a veces los requerimentos así lo exigen... Veamos una
manera sencilla...
***********************************************************************************
*************
Hay veces que deseamos que al salir del Form no se active el evento Valid de
cierto control....
public oForm
oForm=CREATEOBJECT("MyForm")
oForm.Show()
DEFINE CLASS MyForm AS FORM
Caption="Ejemplo para evitar Validación"
ADD OBJECT MyTextBox AS TextBox WITH Height=25
ADD OBJECT MyText2 AS TExtBox WITH Height=25, Top=60
ADD OBJECT cmdCancelar AS CommandButton WITH Top=90, Caption="Cancelar",
Height=30
PROCEDURE MyTextbox.Valid
DO CASE
CASE !Wontop(Thisform.Name)
** Activando desde otro Form, no validar
Return .T.
CASE Thisform.ReleaseType>0
** Saliendo de VFP, o haciendo clik en Cerrar. No validar
Return .T.
OTHERWISE
DO CASE
CASE Mdown()
*** Si es que esta haciendo Click en el boton Cancelar....
*** No validar, cambia el nombre de cmdCancelar si no se llamara así
loobj=Sys(1270)
IF Vartype(loObj)='O' AND lower(loObj.Name)='cmdcancelar'
loObj = NULL
Return .T.
ENDIF
CASE Lastkey()=27
*** Presionando la tecla Escape, no validar
Return .T.
ENDCASE
ENDCASE
****** Aqui se pondria el proceso normal de Validacion *******
Messagebox("Validando")
ENDPROC
PROCEDURE cmdCancelar.Click
Thisform.Release()
ENDPROC
ENDDEFINE
***********************************************************************************
*************
Es una manera de evitar las ordenes insert, update, y delete y utilizar
tableUpdate() y tableRevert()
.....
m.lcSQL = "SELECT CLienteID, Nombre, Apell1, Apell2 FROM Clientes WHERE Nombre LIKE
'A%'"
m.llRetorno = (SQLEXEC(m.lnHnd, m.lcSQL, "L_Clientes") > -1)
IF m.llRetorno
CrearCursorActualizable("L_Clientes", "Clientes", "ClienteId")
BROWSE
TABLEUPDATE(1, .T., "L_Clentes")
ENDIF
RETURN
FUNCTION CrearCursorActualizable
LPARAMETERS tcAlias, tcTabla, tcKeyList
LOCAL llRetorno, i, lcCampos, lcCamposUp
LOCAL ARRAY laEstruct(1)
IF m.llRetorno
STORE "" TO m.lcCampos, m.lcCamposUp
FOR m.i = 1 TO AFIELDS(m.laEstruct, m.tcAlias)
m.lcCampos = m.lcCampos - m.laEstruct(m.i, 1) - ","
m.lcCamposUp = m.lcCamposUp - m.laEstruct(m.i, 1) + " TASA." - ;
m.tcTabla - "." - m.laEstruct(m.i, 1) - ","
ENDFOR
m.lcCampos = LEFT(m.lcCampos, LEN(m.lcCampos) - 1)
m.lcCamposUp = LEFT(m.lcCamposUp, LEN(m.lcCamposUp) - 1)
ENDIF
m.llRetorno = m.llRetorno AND CURSORSETPROP("UpdatableFieldList", m.lcCampos)
m.llRetorno = m.llRetorno AND CURSORSETPROP("UpdateNameList", m.lcCamposUp)
IF EMPTY(m.tcKeyList)
m.llRetorno = m.llRetorno AND CURSORSETPROP("WhereType",3)
ELSE
m.llRetorno = m.llRetorno AND CURSORSETPROP("KeyFieldList", m.tcKeyList)
ENDIF
***********************************************************************************
*************
Una forma de evitar que un error se produzca si tu DLL o Servidor COM no estuviara
registrado en la PC de producción....
loRegistry = NEWOBJECT("Registry",HOME(1)+"ffcregistry.vcx")
IF loRegistry.Iskey("zipit.cgzipfiles")
*** Hacer lo propio...
ELSE
Messagebox("No está registrado el componente de Compresión")
END
***********************************************************************************
*************
Esta función te permite obtener la ruta donde se encuentra el directorio windows.
? system_dir()
FUNCTION system_dir
LOCAL lccar AS STRING, lnlongitud AS INTEGER
LOCAL lccamino AS STRING, lces AS STRING
DECLARE INTEGER GetSystemDirectory IN WIN32API STRING , INTEGER
lccar = SPACE(128)
lnlongitud = 128
lces = getsystemdirectory(@lccar, lnlongitud)
lccamino = RTRIM(LOWER(LEFT(lccar, lces )))
RETURN lccamino
ENDFUNC
***********************************************************************************
*************
GETFONT() retorna el nombre, tamaño y estilo de la fuente que se elije como una
cadena de caracteres separados por comas.
lc = GETFONT()
IF NOT EMPTY(lc)
ALINES(la,lc,",")
lcMsg = "Nombre: " + la(1) + CHR(13) + ;
"Tamaño: " + la(2) + CHR(13) + ;
"Estilo: " + la(3)
ELSE
lcMsg = "No selecciono ninguna fuente"
ENDIF
MESSAGEBOX(lcMsg,64)
***********************************************************************************
*************
A partir de la salida del Service Pack 1 de Visual FoxPro8 hubo un cambio que
podria afectar a tu sistema, revisa los detalles a continuacion...
***********************************************************************************
*************
Imprimindo com velocidade em impressoras matriciais usando o Report Designer
Pronto !
Da próxima vez que você tentar alterar a fonte de qualquer ítem do relatório, as
fontes da impressora se apresentarão. As mais comuns são : DRAFT, SANS SERIF e
ROMAN, cada uma delas disponibilizada para varios tamanhos.
Selecione qualquer caixa de texto do report e altere a fonte para qualquer uma que
aparecer uma impressora pequena ao lado esquerdo. Teste cada uma delas, pois cada
uma exibe em uma tamanho diferente dependendo da quantidade de Cpis (5 CPIs =
grande , 18 = condensado). Na tela, aparecerá uma fonte que o Windows julgar
parecida, mas cuidado ! O tamanho verdadeiro você só saberá ao imprimir cada fonte
no papel.
Obviamente, para configurar este relatório e acessar as fontes, é preciso ter uma
matricial tambem, ou então simule a impressora pelo windows.
Recomendo tambem a tradicional limpeza dentro do frx dos campos tag, tag2 e expr.
Porque? Caso utilize duas matriciais de modelos diferentes, as mesmas podem possuir
drivers distintos o que pode fazer com que uma delas não imprima como desejado.
LIMPAFRX('c:\seudiretorio\seurelatorio.frx')
Essa rotina pode ser adaptada a sua necessidade, inclusive pode ser usada em modo
de execução, caso seu sistema permita aos usuários alterarem os seus relatórios.
*-------------------------------------------------------------------------
Rotina : LIMPAFRX()
* Função : Limpar os campos EXPR, TAG e TAG2 do arquivo FRX
* Parâmetros : - Caracter
* Retorna : Nada
* Notas : Nenhuma
*-------------------------------------------------------------------------
PROCEDURE LIMPAFRX
PARAMETERS ARQUIVO
LOCAL lcARQ
IF NOT FILE(arquivo)
=MESSAGEBOX('ARQUIVO NÃO EXISTE !')
RETURN
ENDIF
lcAR1 = LEFT(ARQUIVO,LEN(ARQUIVO)-4)
IF USED(lcARQ)
SELECT &lcARQ
ELSE
SELECT 0
USE &ARQUIVO
ENDIF
USE
WAIT WINDOW 'ARQUIVO : ' + UPPER(ARQUIVO) + ' Foi atualizado com êxito !!!'
RETURN
***********************************************************************************
*************
Pues eso, aqui teneis un ejemplo de como obtener nuevos codigos (disponibles) en
una tabla cuyo indice principal sea numerico. P.E. Clientes, proveedores, etc.
Nos permite decidir el valor minimo por el que realizar la busqueda de un 'hueco'
***********************************************************************************
*************
Muy simple y lo codifica en base 64 binario. Para VFP 7/8
tupass = "PEPE"
pass_encoded = STRCONV(tupass,13)
? pass_encoded
pass_decoded = STRCONV(pass_encoded,14)
? pass_decoded
***********************************************************************************
*************
A veces necesitamos que nuestra aplicación aparezca encima de cualquier otra
aplicación existente, aquí un modo de hacerlo....
*******************************************************
* Newsgroups: microsoft.public.es.vfoxpro
* Date: 25/04/2003
* Subject: Re: Que VFP no se ponga en primer plano
* From. Pepe Llopis
*******************************************************
******************************************
*** Coloca un form por encima de todo lo que hay en windows
FUNCTION PrimerPlano
LPARAMETER nHwnd
ENDFUNC
**
Saludos
***********************************************************************************
*************
El objetivo de esta clase es obtener algunos cálculos estadísticos a partir de una
muestra (tabla o cursor) y de un nombre de campo a analizar. En el caso de Media
Ponderada se describe el ejemplo con la media de población de una provincia y
municipio, y es aplicable para otra situación.
Se puede complementar con otras funciones que no se calculan. El código fue escrito
y depurado con la participación de Fernando Puyuelo Ossorio, Juan Carlos Sanchez,
Jorge Mota y Ana María Bisbé.
* Ejemplo de llamada
oEst = CREATEOBJECT("oEstadisticas")
* Donde:
* tnMuestras - Cantidad de muestras que cumplieron las condicones. Por ej. 100
* tcCampoValor - Campo por el que se realizarán los cálculos. Por ej. 'Ventas'
**************************************************
HEIGHT = 23
WIDTH = 145
NAME = "oestadisticas"
PROCEDURE CalculosEstadisticos
*---------------------------------------------------------
* Método:
* OESTADISTICAS.CALCULOSESTADISTICOS
* Parameters:
* Objetivo:
* Obtener las estadísticas de los valores para la zona actual. Para ello
es necesario
* - Calcular Moda
* - Calcular Mediana
* - Calcular Percentil25
* - Calcular Percentil75
* - Calcular Máximo
* - Calcular Mínimo
*---------------------------------------------------------
* Descartar extremos
* Calcular Media
tnDesviacionTipica = THIS.calculardesviaciontipica(tcCursorMuestras,
tcCampoValor)
* Calcular Moda
tnModa = THIS.calcularmoda(tcCursorMuestras, tcCampoValor)
* Calcular Percentil25
* Calcular Percentil75
* Calcular Máximo
SELE (tcCursorMuestras)
* Calcular Mínimo
SELE (tcCursorMuestras)
ENDPROC
*---------------------------------------------------------
* Método:
* OESTADISTICAS.DESCARTAEXTREMOS
* Parameters:
*---------------------------------------------------------
LOCAL lnExtremos
IF lnExtremos <> 0
IF USED(tcCursorMuestras)
SELE (tcCursorMuestras)
GO TOP
IF !EOF()
DELETE NEXT lnExtremos && elimino los valores extremos en el inicio del
cursor
ENDIF
GO BOTT
IF !EOF()
SKIP - (lnExtremos - 1)
DELETE REST && elimino los valores extremos en el final del cursor
ENDIF
ENDIF
ENDIF
ENDPROC
PROCEDURE calcularmedia
*---------------------------------------------------------
* Método:
* OESTADISTICAS.CALCULARMEDIA
* Parameters:
* Objetivo:
*---------------------------------------------------------
LOCAL lnMedia
SELE (tcCursorMuestras)
RETURN lnMedia
ENDPROC
PROCEDURE calculardesviaciontipica
*---------------------------------------------------------
* Método:
* OESTADISTICAS.CALCULARDESVIACIONTIPICA
* Parameters:
* Objetivo:
*---------------------------------------------------------
LOCAL lnDesviacionTipica
SELE (tcCursorMuestras)
RETURN lnDesviacionTipica
ENDPROC
PROCEDURE calcularmoda
*---------------------------------------------------------
* Método:
* OESTADISTICAS.CALCULARMODA
* Parameters:
* tcCursorMuestras - nombre del cursor que contiene la muestra
* Objetivo:
*---------------------------------------------------------
lnRedondeo = 100 && determina el valor al que se debe redondear (se puede
pasar como parámetro)
IF _TALLY <> 0
GO TOP
lnModa = valor
ENDIF
RETURN lnModa
ENDPROC
PROCEDURE calcularpercentil
*---------------------------------------------------------
* Método:
* OESTADISTICAS.CALCULARPERCENTIL
* Parameters:
* tnPercentil - 25 / 50 / 75
* Objetivo:
*---------------------------------------------------------
lccampo = tcCursorMuestras+'.'+tcCampoValor
IF _TALLY <> 0
IF lnValor = 0
GO TOP
ELSE
GO lnValor
ENDIF
RETURN lnPercentil
ENDPROC
PROCEDURE calcularmediaponderada
*---------------------------------------------------------
* Método:
* OESTADISTICAS.CALCULARMEDIAPONDERADA
* Parameters:
* Objetivo:
*---------------------------------------------------------
AVG(curMuestraEstadis.valor) AS MediaMuni ;
GROUP BY municipi.municipiid ;
IF _TALLY <> 0
ENDIF
USE IN SELECT('tempMedia')
SELECT curPoblacion
GO TOP
SCAN
ENDSCAN
ENDIF
RETURN lnMediaPonderada
ENDPROC
ENDDEFINE
Curiosamente, el Framework Microsoft .NET tiene una clase nativa para el manejo de
pilas (Stacks), a partir de esa idea me di a la labor de tener una clase que
manejara este concepto, es perfectible, así que podrían usarla según sus
necesidades. Se aceptan tambien críticas y sugerencias....
Esta versión fue desarrollada tomando en cuenta la compatibilidad con versiones 6,7
y 8. En breve habrá una versión exclusiva de VFP8, donde se hará uso de varias
características que harán más efectivo el trabajo y practicamente ilimitado (esta
versión solo puede manejar 65,000 elementos en la pila).
Metodos:
Propiedades:
Ejemplo de uso...
loStack = CREATEOBJECT("Stack")
loStack.Push(10)
loStack.Push($50)
loStack.Push("hola Mundo")
loStack.Push(.T.)
DO while !loStack.IsEmpty()
?loStack.Pop()
ENDDO
*******************************************
* Clase Stack
* Autor: Espartaco Palma
* Fecha: Acapulco, Guerrero, México 10/08/2003
*******************************************
PROCEDURE Pop
LOCAL luRetValue
IF This.nElements > 0
luRetValue = This.aElements[This.nElements]
This.nElements = This.nElements - 1
this.Counter = this.nElements
DIMENSION this.aElements[IIF(This.nElements==0,1,This.nElements)]
ELSE
luRetValue = NULL
ENDIF
RETURN luRetValue
ENDPROC
PROCEDURE Push
LPARAMETERS tuValue
This.nElements = This.nElements + 1
this.Counter = this.nElements
DIMENSION this.aElements[This.nElements]
this.aElements[this.nElements]=tuValue
RETURN this.Counter
ENDPROC
PROCEDURE PopAsString
LPARAMETERS tcFormatCodes
RETURN This.ReturnAsString(This.Pop(),tcFormatCodes)
ENDPROC
ENDDEFINE
DEFINE CLASS eBaseClass as Relation
PROTECTED aElements[1]
PROTECTED nElements
Counter = 0
PROCEDURE Init
this.nElements = 0
this.aElements[1] = NULL
ENDPROC
PROCEDURE Counter_Assing
LPARAMETERS tuNewValue
NODEFAULT
ENDPROC
PROCEDURE ReturnAsString
LPARAMETERS tuValue,tcFormatCodes
RETURN TRANSFORM(tuValue,tcFormatCodes)
ELSE
RETURN TRANSFORM(tuValue)
ENDIF
ENDPROC
PROCEDURE IsEmpty
Return (this.Counter==0)
ENDPROC
PROCEDURE CountElements
RETURN this.Counter
ENDPROC
ENDDEFINE
***********************************************************************************
*************
oForm=CREATEOBJECT("MyTextEditor",GETFILE(),"Editando Archivo",2)
oForm.SHow(1)
PROCEDURE INIT
DODEFAULT(tcSourceFile)
WITH This
.WindowState=IIF(VARTYPE(tnWindowState)='N' AND
INLIST(tnWindowState,0,1,2),tnWindowState,0)
.cmdClose.Caption="Cerrar"
.cmdSave.Caption="Guardar como"
.cmdFonts.Caption="Fuentes"
.chkReadOnly.Caption="Sólo lectura"
ENDWITH
ENDPROC
PROCEDURE Activate
This.Resize()
DODEFAULT()
ENDPROC
ENDDEFINE
Como idea adicional, podrías utilizar tu propio método para generar un reporte o
mandar tu reporte a ASCII (REPORT FORM < TuReporte > TO FILE ASCII ) , pasarlo a
archivo y mostrarlo....
lcFile = SYS(2015)+".txt"
SET TEXTMERGE ON
lcTitle="Reporte de Clientes"
IF !USED("Customer")
USE Customer IN 0
ENDIF
SELECT Customer
SCAN
< < Cust_id > > < < Company > > < < Contact > >
ENDSCAN
SET TEXTMERGE TO
oForm=CREATEOBJECT("MyTextEditor",lcFile,lcTitle,2)
oForm.Show(1)
***********************************************************************************
*************
Obtiene un identificador único de 38 caracteres.
FOR i = 1 TO 10000
RETURN ;
[{] +;
RIGHT(SYS(2015),7) + [-] +;
RIGHT(SYS(2015),4) + [-] +;
RIGHT(SYS(2015),4) + [-] +;
RIGHT(SYS(2015),4) + [-] +;
[}]
ENDPROC
***********************************************************************************
*************
Este es un Ejemplo de Como Aprovechar la Nueva Clase "Empty" que nos proporciona
VFP8.
Esta Rutina, nos permite Leer Los Nombres de las variables que usaremos en Nuestro
Programa,
en una Tabla y su Respectivo Valor, para No Tener que recompilar el programa cada
vez que
tengamos que cambiar el valor de una variable.
En Lugar de Variables Publicas, podemos tener un Objeto Global, que contendra una
propiedad
por cada Registro que encuentre en la tabla, y su valor correspondiente.
El Codigo Es Este:
Procedure LeerConf
Return .F.
Endif
Use In Select('Origen')
cCad=',.*+/- =()[]{}<>^&%$#"!@)(¿?'+"'"
If Reccount('CurProp')>0
oProp = Createobject("Empty")
Select CurProp
Scan
AddProperty(oProp, Alltrim(CurProp.cOpcion),'')
Do Case
Case Alltrim(Upper(transform(curprop.uValor)))='.NULL'
Case Type(Evaluate("curprop.uValor"))='L'
cCad = [Store ]+ Upper(Transform(CurProp.uValor))+[ to
Oprop.]+Alltrim(CurProp.cOpcion)
Case Type(Evaluate([curprop.uValor]))='N'
Otherwise
Endcase
&cCad
Endscan
Endif
Use In Select('CurProp')
Use In Select('Origen')
Return oProp
Endproc
Enddefine
Hariamos
Set Library to oEntorno.prg &&donde oEntorno.prg es el nombre con que grabaron esta
rutina
Local oEnt
Public oGlobal
oEnt = CreateObject("oEntorno")
oGlobal = oEnt.LeerConf("C:configuravariables.dbf","Nombre","Valor")
NOTA: Ambos campos tienen que ser Caracter. La rutina intenta detectar el tipo de
dato que es, para las variables de tipo Date, debe ir almacenada en el formato
AAAA/MM/DD. Acepta registros con campo =Null para los valores.
Esta son dos respuestas que se publicaron en el grupo de noticias para contestar la
pregunta:
EJ:
? TieneNumeros("VFP")
? TieneNumeros("VFP8")
***********************************************************************************
*************
Cuando necesitemos saber que usuarios estan conectados a una base de datos de MS
SQL Server 2000 podemos usar este procedmiento almacenado.
begin
set nocount on
exec sp_who
from tbl_usuarios_conectados
return
end
***********************************************************************************
*************
Proceso para encriptar datos.
FUNCTION Encriptar
PARAMETER vtexto
LOCAL vlong,vcadena,vconlet,vencrip
IF TYPE('vtexto')<>'C' OR TYPE('vtexto')='U'
RETURN ''
ENDIF
vencrip=''
vcadena=''
vconlet=0
vlong=LEN(vtexto)
vcadena=vcadena+PADL(ALLTRIM(STR(ASC(SUBSTR(vtexto,i,1))+3)),3,'0')
vconlet=vconlet+1
IF vconlet=3 OR i=vlong
vencrip=vencrip+BINTOC(VAL(vcadena))
vcadena=''
vconlet=0
ENDIF
ENDFOR
vencrip=STUFF(vencrip,1,0,BINTOC(064051048))
RETURN vencrip
ENDFUNC
***********************************************************************************
*************
Una fácil manera de hacer una barra de progreso con código puro de Visual FoxPro.
*-- Ejemplo
lo.SHOW(2)
FOR ln = 1 TO 100
lo.Actualizar(ln)
INKEY(.05)
ENDFOR
MESSAGEBOX("Proceso terminado",64)
lo = .NULL.
*--------------------------------------
*--------------------------------------
DOCREATE = .T.
HEIGHT = 72
WIDTH = 375
BORDERSTYLE = 2
TITLEBAR = 0
WINDOWTYPE = 0
AUTOCENTER = .T.
NAME = "Termometro"
AnchoAux = 0
*--
PROCEDURE INIT
LPARAMETERS tcTitulo
SYS(2002)
THIS.CrearObjetos(tcTitulo)
THIS.AnchoAux = THIS.CNT.CNT.WIDTH
THIS.Actualizar(0)
ENDPROC
*--
PROCEDURE DESTROY
SYS(2002,1)
ENDPROC
*--
PROCEDURE actualizar
LPARAMETERS tnPorc
tnPorc = MAX(MIN(tnPorc,100),0)
STORE TRANSFORM(tnPorc,"999")+"%" TO ;
THIS.CNT.lbl.CAPTION, ;
THIS.CNT.CNT.lbl.CAPTION
THIS.DRAW
ENDPROC
*--
PROCEDURE CrearObjetos
LPARAMETERS tcTitulo
THIS.ADDOBJECT("lblTitulo","label")
WITH THIS.lblTitulo
.FONTBOLD = .T.
.ALIGNMENT = 2
.CAPTION = IIF(EMPTY(tcTitulo),;
.LEFT = 0
.TOP = 10
.WIDTH = 375
.VISIBLE = .T.
ENDWITH
THIS.ADDOBJECT("cnt","container")
WITH THIS.CNT
.TOP = 36
.LEFT = 9
.WIDTH = 360
.HEIGHT = 26
.SPECIALEFFECT = 1
.BACKCOLOR = RGB(255,255,255)
.VISIBLE = .T.
.ADDOBJECT("lbl","label")
WITH .lbl
.FONTBOLD = .T.
.ALIGNMENT = 2
.BACKSTYLE = 0
.CAPTION = "100%"
.HEIGHT = 20
.LEFT = 0
.TOP = 6
.WIDTH = 360
.VISIBLE = .T.
ENDWITH
.ADDOBJECT("cnt","container")
WITH .CNT
.TOP = 2
.LEFT = 2
.WIDTH = 356
.HEIGHT = 22
.BORDERWIDTH = 0
.BACKCOLOR = RGB(0,0,255)
.ADDOBJECT("lbl","label")
.VISIBLE = .T.
WITH .lbl
.FONTBOLD = .T.
.ALIGNMENT = 2
.BACKSTYLE = 0
.CAPTION = "100%"
.HEIGHT = 20
.LEFT = 0
.TOP = 4
.WIDTH = 356
.FORECOLOR = RGB(255,255,255)
.VISIBLE = .T.
ENDWITH
ENDWITH
ENDWITH
ENDPROC
ENDDEFINE
*--------------------------------------
***********************************************************************************
*************
as colecciones comúnmente almacenan instancias de cosas, en su mayoría objetos.
VFP8 nos ha entregado una clase nativa llamada Collection, la cual contiene unas
pocas propiedades, métodos y eventos. A través de esta nueva clase, podemos crear
poderosos objetos que a la larga reemplazaran las matrices que hemos venido
utilizando en versiones anteriores.
If Empty(lcDirectory) Then
Return .F.
Endif
If !Directory(lcDirectory) Then
Return .F.
Endif
? loItem.FileName
? loItem.FileSize
? loItem.DateLastModified
? loItem.TimeLastModified
? loItem.Fullpath
? loItem.Extension
? loItem.Drive
? loItem.Stem
? loItem.Fname
? loItem.ShortPath
? loItem.ShortName
? loItem.IsHidden
? loItem.IsReadOnly
? loItem.IsSystem
? loItem.IsFolder
? [==========================] + Chr(13)
Endfor
*Variables locales
nDlls = Adlls(laDlls)
If nDlls = 0 Then
This.LoadGetShortPathName()
Else
This.LoadGetShortPathName()
Endif
Endif
For i = 1 To j
lcBuffer = Space(511)
lnBufferSize = 511
lnShortPathLen = GetShortPathName(lcFullPath, @lcBuffer, @lnBufferSize)
loProperties = Createobject([Properties])
With loProperties
.FileName = laDir[i,1]
.FileSize = laDir[i,2]
.DateLastModified = laDir[i,3]
.TimeLastModified = laDir[i,4]
.Fullpath = lcFullPath
.Extension = Justext(lcFullPath)
.Drive = Justdrive(lcFullPath)
.Stem = Juststem(lcFullPath)
.Fname = Justfname(lcFullPath)
.ShortPath = lcShortPath
.ShortName = Justfname(lcShortPath)
Endwith
This.Add(loProperties ,laDir[i,1])
Endfor
Endproc
Procedure LoadGetShortPathName
string @cLongPath, ;
string @cShortPathBuff, ;
integer nBuffSize
Endproc
Enddefine
*Objeto propiedades
FileName = []
FileSize = 0
DateLastModified = {}
TimeLastModified = []
Fullpath = []
Extension = []
Drive = []
Stem = []
Fname = []
ShortPath = []
ShortName = []
IsHidden = .F.
IsReadOnly = .F.
IsSystem = .F.
IsFolder = .F.
Enddefine
***********************************************************************************
*************
Formularios Esta funcion permite controlar la apertura de formularios en una sola
instancia.
****************
Function OpenForm
LPARAMETER cForm
LOCAL i, lOk
lOk = .F.
FOR i = 1 TO _SCREEN.FormCount
IF PEMSTATUS(_SCREEN.Forms[m.i],'cFormName',5)
IF _SCREEN.Forms[m.i].cFormName == cForm
_SCREEN.Forms[m.i].Show()
lOk = .T.
ENDIF
ENDIF
NEXT i
IF !lOk
IF !PEMSTATUS(_SCREEN.Forms[m.i],'cFormName',5)
_SCREEN.Forms[m.i].AddProperty('cFormName')
ENDIF
_Form.cFormName = cForm
_Form.Show()
ENDIF
**
***********************************************************************************
*************
Amigos, humildemente, propongo una rutinita recursiva para recorrer un Arbol
Treeview, no es gran cosa, pero por ahí a alguien le puede venir bien.
*-------------------------------------------------------*
*- CASO 1 - Le paso como NODO el primer Hijo del Nodo en el que estoy
posicionado.
EXCLUYE).
o=thisform.otree
o.selecteditem
primerhijo=o.selecteditem.child)
ver_rama(primerhijo)
*-------------------------------------------------------*
INCLUYE).
o=thisform.otree
o.selecteditem
ver_rama2(o.selecteditem)
*-------------------------------------------------------*
PROCEDURE ver_rama(onodo)
LOCAL hnodo,next_nodo,t,nhijos
IF ISNULL(onodo)
RETURN
ENDIF
MESSAGEBOX(onodo.text)
nhijos=onodo.children
IF nhijos>0
hnodo=onodo.child
ver_rama(hnodo)
endif
next_nodo=onodo.next
IF ISNULL(next_nodo)
RETURN
ELSE
ver_rama(next_nodo)
ENDIF
RETURN
*-------------------------------------------------------*
PROCEDURE ver_rama2(onodo)
LOCAL hnodo,next_nodo,t,nhijos
IF ISNULL(onodo)
RETURN
ENDIF
MESSAGEBOX(onodo.text)
nhijos=onodo.children
IF nhijos>0
hnodo=onodo.child
ver_rama(hnodo)
endif
RETURN
*-------------------------------------------------------*
***********************************************************************************
*************
Averigua el estado de SET PRINTER TO, el dispositivo de salida de la impresora...
Esto puede ser hacia un fichero o hacia una impresora. La siguiente rutina devuelve
el tipo de salida(Fichero o Impresora), el nombre de la impresora o del Fichero y
el Puerto o Ruta.
******************************************************************************
*
* Función: INFO_IMPRE
* Fecha: 28/07/2003
******************************************************************************
* Ejemplo:
LOCAL aPTR
DIMENSION aPTR(1)
=INFO_IMPRE(@aPTR)
?aPTR(1)
?aPTR(2)
?aPTR(3)
**********************
FUNCTION INFO_IMPRE(aTMP)
* Si NO es un fichero...
sDevice="Impresora"
&& se desea la
predeterminada de Windows, cambiar
&& por
SET( 'PRINTER',2 ).
DIMENSION aPRS(1)
=APRINTERS(aPRS)
IF UPPER(aPRS(nH,1))==sName THEN
sPuerto_Ruta="Puerto: "+aPRS(nH,2)
EXIT
ENDIF
NEXT
ELSE
sDevice="Fichero"
ENDIF
DIMENSION aTMP(3)
aTMP(1)="Dispositivo: "+sDevice
aTMP(2)="Nombre: "+sName
aTMP(3)=sPuerto_Ruta
ENDFUNC
***********************************************************************************
*************
API Para forzar la salida de Windows desde Visual FoxPro
* Por defecto - Cierra todas las aplicaciones y reinicia Windows sin preguntar.
* Obtenida de UniversalThread
* Parámetros:
* Esta función permite cerrar o reiniciar Windows desde VFP; hace las llamadas
necesarias
* Probado en las plataformas WinNT 4.0 SP6, Win2K Pro, Win98 y WinME.
* Definición de constantes
#DEFINE SIZEOFTOKENPRIVILEGE 16
INTEGER lpSystemName, ;
STRING @ lpPrivilegeName, ;
STRING @ pluid
INTEGER hProcess, ;
INTEGER dwDesiredAccess, ;
INTEGER @ TokenHandle
INTEGER bDisableAllPrivileges, ;
STRING @ NewState, ;
INTEGER dwBufferLen, ;
INTEGER PreviousState, ;
INTEGER @ pReturnLength
ENDIF
IF OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY +
TOKEN_ADJUST_PRIVILEGE , @nhToken) = 0
ENDIF
* de los permisos.
cTokenPrivs = CHR(1) + REPL(CHR(0),3) + cLUID + CHR(SE_PRIVILEGE_ENABLED)
+ REPL(CHR(0), 3)
ENDIF
ENDIF
DO CASE
nFlag = EWX_SHUTDOWN
CASE tlShutdownRequested
CASE tlInteractiveShutdown
nFlag = EWX_REBOOT
OTHERWISE
ENDCASE
ENDFUNC
***********************************************************************************
*************
Otra forma muy sencilla de enviar Email desde VFP es una el componente ASPEMAIL
(www.aspemail.com).
Este te permite enviar correo de forma sencilla via SMTP y sin mayor
inconvenientes.. y con muchas posibilidades (imagenes embebidas en los emails,
encriptación, autenticación, muchos adjuntos)
Mail = CreateObject("Persits.MailSender")
Mail.ResetAll
Mail.Host = "prepago.celcaribe.net.co"
Mail.Port = 25
Mail.isHTML = .F.
Mail.From = "dav_amador@celcaribe.net.co"
Mail.AddAttachment(Getfile())
Mail.Send
***********************************************************************************
*************
Artículos A partir de VFP8 ya puedes enlazar eventos en tiempo de ejecución, de que
nos servirá esto?... Exploraremos algunos ejemplos prácticos.
PUBLIC oForm
oHandler = CREATEOBJECT("myHandler")
oForm = CREATEOBJECT("MyForm",oHandler)
oForm.Show()
Width = 400
Height = 225
Height=30
PROCEDURE INIT
LPARAMETERS toHandler
This.AddProperty("oHandler",toHandler)
ENDPROC
PROCEDURE LOAD
USE customer
ENDPROC
PROCEDURE UNLOAD
USE IN "Customer"
ENDPROC
PROCEDURE myCmdButton.Click
Thisform.EnlazaEvento()
ENDPROC
PROCEDURE EnlazaEvento
DO CASE
CASE UPPER(loControls.BaseClass)="HEADER"
BINDEVENT(loControls,"DblClick",this.oHandler,"DobleClick")
CASE UPPER(loControls.BaseClass)="TEXTBOX"
BINDEVENT(loControls,"DblClick",this.oHandler,"MuestraValor")
ENDCASE
ENDFOR
ENDFOR
ENDPROC
ENDDEFINE
PROCEDURE DobleClick
AEVENTS(laEventos,0)
MESSAGEBOX("Lllamado desde:"+laEventos[1].Parent.ControlSource)
ENDPROC
PROCEDURE MuestraValor
AEVENTS(laEventos,0)
MESSAGEBOX(EVALUATE(laEventos[1].ControlSource))
ENDPROC
ENDDEFINE
***********************************************************************************
*************
i deseas que se seleccione el Formulario para inicar a moverlo, puedes utilizar
esta API
=SendMessage(thisform.hWnd, WM_LBUTTONUP, 0, 0)
Hace tiempo programaba en lenguajes (basic, cobol, pascal, etc) y hay ahi una
funcion que hace esto y como creo que es muy util pues me hice la mia, a mi me ha
ayudado mucho y ademas la uso en otras funciones que tengo creadas.
SelOp(5,"Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic")
-----> Regresa "May"
* Notas .........: Si se usa en un metodo de formularios, solamente convierte
a comentario
* la primera linea agregandole un "*" al inicio y la
llamas con "Objeto.SelOp(,)"
*
-----------------------------------------------------------------------------------
---------------------------------------
Function
SelOP(Opcion,Pr1,Pr2,Pr3,Pr4,Pr5,Pr6,Pr7,Pr8,Pr9,Pr10,Pr11,Pr12,Pr13,Pr14,Pr15,Pr16
,Pr17,Pr18,Pr19,Pr20,Pr22,Pr22,Pr23,Pr24,Pr25)
Local Resp,TipResp
TipResp=VarType(Pr1)
If Opcion>(PCount()-1).Or.Opcion>25.Or.Opcion<1
If TipResp="C"
Retu ""
Else
If TipResp="N"
Retu 0
Else
Retu .F.
EndIF
EndIf
Else
Resp="Pr"+Allt(Str(Opcion))
Retu &Resp
EndIf
***********************************************************************************
*************
ROTINA PARA BUSCA NO GOOGLE
clear
#DEFINE READYSTATE_COMPLETE 4
oIE = CreateObject("InternetExplorer.Application")
lcphone="(251) 602-5611"
lcURL="http://www.google.com/search?hl=en&lr=&ie=ISO-8859-1&q="+;
lcphone+;
"&btnG=Google+Search"
oIE.Navigate(lcURL)
lcInnerText = oIE.Document.Body.InnerText
ln=occur(lcphone,lcInnerText)
if ln>=1
=alines(aa,lcInnerText)
for ia=1 to alen(aa)
if lcphone$aa[ia] and aa[ia]#"Searched the web"
?aa[ia]
endif
endfor
else
*NOT FOUND
endif
oIE.Quit
oIE=.NULL.
release oIE
***********************************************************************************
*************
Deleting a Directory And SubDirectories How can you get the same functionality of
DOS's DELTREE command in VFP?
oFSO = CREATEOBJECT('Scripting.FileSystemObject')
lcdir = GETDIR()
oFolder = oFSO.GetFolder(lcdir)
oFolder.Delete(.T.)
***********************************************************************************
*************
Getting Data from Microsoft Access in VFP
store SQLSTRINGCONNECT(;
'DBQ='+fullpath('accessfile.mdb')+';'+;
'DefaultDir=c:\;'+;
'Driver={Microsoft Access Driver (*.mdb)}');
to gnConnHandle
? SQLEXEC( gnConnHandle, ;
"SELECT * from Access_table_name","tempcurs")
=sqldisc(0)
***********************************************************************************
*************
Determining a computer's IP Address
How can you get the IP address for the local computer?
loSock = CREATEOBJECT('MSWinsock.Winsock.1')
? loSock.LocalIP
***********************************************************************************
*************
Este es un Ejemplo sencillo de como podemos inhabilitar el teclado y el mouse de
una pc.
Puede Adaptarse para que busque en una tabla digamos y vea si tiene que
activar/desactivar el teclado y el mouse. y tener en otra pc, un modulo que
habilite/deshabilite por pc, en la tabla.
Public oFrm
oFrm=Newobject("Form_blk")
oFrm.Show
Return
Top = 0
Left = 0
Height = 96
Width = 375
DoCreate = .T.
Name = "Form1"
Top = 48, ;
Left = 324, ;
autosize = .T.,;
Interval = 3000, ;
Name = "Timer1"
Caption = "Label1", ;
Left = 204, ;
Top = 60, ;
autosize = .T.,;
TabIndex = 2, ;
Name = "Label1"
Height = 23, ;
Left = 24, ;
TabIndex = 1, ;
Top = 12, ;
Width = 336, ;
Name = "Text1"
Left = 96, ;
Top = 60, ;
autosize = .T.,;
Name = "Label2"
Procedure Init
Thisform.AddProperty('valor',0)
Endproc
Procedure timer1.Timer
With Thisform
If .valor = 0
.valor = 1
Else
.valor = 0
Endif
.label1.Caption = Alltrim(Str(.valor))
BlockInput(.valor)
Endwith
Endproc
Enddefine
***********************************************************************************
*************
uve que escribir una funcion similar a displaypath para usar en VFP6. Aunque
formatea distinto, puede servir.
Function DisplayPath
*- JARSoft
*- Prg. Alberto Rodriguez (jarargentina@hotmail.com)
*- DisplayPath
*- Mostrar un path con un largo determinado (emulación de la funcion DisplayPath de
*- VFP7 (aunque esta función, siempre envia el largo deseado por la llamada, no así
*- la funcion original de vfp7 cuyo largo es incalculable porque formatea de modo
*- diferente.
Bueno pues esta función relizada con WSH lo hace para ti.
Function WSHListDrives
LOCAL loFSO, loDrivesCol, loDrive, ;
llIsReadyDrive, lnDriveType, lcDriveType, lnWait
loFSO = CREATEOBJECT('Scripting.FileSystemObject')
loDrivesCol = loFSO.Drives
llIsReadyDrive = loDrive.IsReady
? IIF( llIsReadyDrive=.T., [El Drive esta listo.],[El drive no esta
listo.])
IF llIsReadyDrive
? "Espacio disponible: " + ALLTRIM(STR(loDrive.AvailableSpace)) +
[ bytes.]
? "Espacio Libre: " + ALLTRIM(STR(loDrive.FreeSpace)) +
[ bytes.]
? "Tamaño total: " + ALLTRIM(STR(loDrive.TotalSize))
+ [ bytes.]
? "Ruta: " + loDrive.Path
? "Nombre del volumen: " + loDrive.VolumeName
ENDIF
IF lnDriveType=3
? "Nombre compartido: " + loDrive.ShareName
ELSE
IF lnDriveType=2
? "Nombre compartido: " + RTRIM(LEFT(SYS(0),15))
ENDIF
ENDIF
WAIT
CLEAR
NEXT
Endfunc
***********************************************************************************
*************
Método para apagar servidores de Terminal Services
Enviado por: drogdon
El método normal para apagar un servidor no se recomienda para los servidores que
están corriendo Terminal Services.
El método normal para apagar un servidor (el cual es Inicio | Apagar y hacer clic
en la opción Apagar del menú) no se recomienda para los servidores que están
corriendo Terminal Services (TS).
***********************************************************************************
*************
Volver a unir las partes en el archivo original dividido con el programa
partir.prg. enviado en el articulo anterior.
*- UnirArchivo_01.prg
*- JARSoft Argentina
*- Prog. Alberto Rodiriguez - jarargentina@hotmail.com
*- Ultima modificacion: Abr. 2003
*-
*- Unir las piezas de n bytes creados con partirarchivo_01.prg
*- Unir Devuelve .t. si tubo exito.
*-
*- ej. de uso:
*- lExito = unirarchivo_01('c:tmp', 'c:tmpRespaldos.zip', .t.)
*-
Lparameters tcOrigen, tcDestino, tlBorrarPartes
tcOrigen = Lower(Addbs(tcOrigen))
*--------------------------------------------------------------------------
*- como el programa parte en extenciones de 00n no se permiten unir en
*- archivos con estas extenciones.
cAux = Justext(tcDestino)
If Len(cAux) = 3 && si es # 3 no hay problema, pueden convivir.
For x = 1 To Len(cAux)
If !Isdigit(Substr(cAux, x, 1))
lOk = .T.
Exit
Endif
NEXT
ELSE
lOk = .T.
Endif
*- continuar si la extencion no tiene solo numeros.
If !lOk
Messagebox('No se permiten unir archivos con extenciones que puedan ser iguales '+;
'a las partes.',16,'Excepción')
Return .f.
Endif
*--------------------------------------------------------------------------
*- crear destino
nManFinal = Fcreate(tcDestino,0)
If nManFinal < 0
Messagebox('No se puede crear '+tcDestino,16,'')
Return .F.
Endif
Function WSHCopyFile(FilePath,FolderPath)
OldError=ON("ERROR")
loFSO = CREATEOBJECT('Scripting.FileSystemObject')
lcDrive = loFSO.GetDriveName(FilePath)
loDrive = loFSO.GetDrive(lcDrive)
If loDrive.IsReady
ldDrive = loFSO.GetDriveName(FolderPath)
ldDrive = loFSO.GetDrive(ldDrive)
if ldDrive.IsReady
lError=.F.
on error lError=.T.
if lError Then
endif
On error &OldError
Endif
Endif
RELEASE loFSO
Endfunc
***********************************************************************************
*************
Bases de Datos No sabes que Versión de MS-SQLServer está ejecutandose?, deseas
saber que Service Pack está instalado? aqui te decimos cómo saberlo.
Ha habido y considero seguirá habiendo una serie de virus que se aprovechan de las
vulnerabilidades de este software de Microsoft, el último virus fue corregido por
el SP3, tambien a veces algunas mejoras en el producto son introducidos (y quizás
removidos) en diferentes versiones y service Packs, así que a veces es necesiario
saber a que versión de SQLServer se está conectado para saber de la misma manera
cuál fué su ultimo Service Pack instalado.
lcServerName = "MiServidor"
lnHandle =SQLStringConnect([server=]+lcServerName+[;driver={SQL
Server};Trusted_Connection=Yes])
IF lnHandle > 0
[+ CAST(SERVERPROPERTY('productlevel') AS VARCHAR) +
' (' ]+;
IF SQLEXEC(lnHandle,lcQueryVersion,"cRes") > 0
Brow
ELSE
IF AERROR(laError) > 0
"Causa:"+laError[2],16,"Error Msg")
ENDIF
ENDIF
SQLDISCONNECT(lnHandle)
ELSE
IF AERROR(laError) > 0
"Causa:"+laError[2],16,"Error Msg")
ENDIF
ENDIF
Producto Versión
RTM (Ready To Manufacture). 2000.80.194
SQL Server 2000 SP1 2000.80.384
SQL Server 2000 SP2 2000.80.534
SQL Server 2000 SP3 2000.80.760
***********************************************************************************
*************
Este ejemplo nos Permite Ver como Limitar el area en la que se puede mover el
mouse.
Numd2Word
Este Procedimiento Permite emular una Estructura, (necesaria para "Encerrar").
nRepEstru
Nos Permite Obtener el Valor de un elemento de la estructura, devuelta por alguna
API,
o bien creada con Numd2Word (necesaria para "Encerrar").
Public oFrm_Limitar
oFrm_Limitar=Newobject("Frm_Limitar")
oFrm_Limitar.Show
Return
Height = 144
Width = 456
ShowWindow = 2
DoCreate = .T.
AutoCenter = .T.
Name = "Frm_Limitar"
Top = 48, ;
Left = 127, ;
AutoSize = .T., ;
BackStyle = 0, ;
Value = .F., ;
Name = "chkBarra"
Add Object Liberar As CommandButton With ;
Autosize=.T.,;
Top = 74, ;
Left = 250, ;
Caption = "Liberar", ;
Name = "Liberar"
Height = 23, ;
Left = 129, ;
Top = 22, ;
Width = 294, ;
Name = "cTitulo"
AutoSize = .T., ;
BackStyle = 0, ;
Left = 12, ;
Top = 24, ;
Name = "Label1"
autosize = .T.,;
Top = 74, ;
Left = 130, ;
Caption = "Limitar", ;
Name = "Limitar"
Top = 48, ;
Left = 312, ;
AutoSize = .T., ;
BackStyle = 0, ;
Value = .F., ;
Name = "chkMenu"
Procedure nRepEstru
nEmp=((nValor-1)*4)+1
cCadena = Substr(cEstructura,nEmp,4)
Endproc
Procedure Numd2Word
Lparameter nNumero
Local c0,c1,c2,c3
cResultado= Chr(0)+Chr(0)+Chr(0)+Chr(0)
c3 = Chr(Int(nNumero/(256^3)))
nNumero = Mod(nNumero,256^3)
c2 = Chr(Int(nNumero/(256^2)))
nNumero = Mod(nNumero,256^2)
c1 = Chr(Int(nNumero/256))
c0 = Chr(Mod(nNumero,256))
cResultado= c0+c1+c2+c3
Endif
Return cResultado
Endproc
Procedure Encerrar
nHandle=FindWindow(.Null.,ctitulo)
If nHandle =0
Return .F.
Endif
nEspacio=0
BringWindowToTop(nHandle)
cRect = Replicate(Chr(0),16)
With This
GetClientRect(nHandle, @cRect)
If lBarra
nEspacio=Sysmetric(9)+Iif(lMenu,Sysmetric(20),0)
cRect=.Numd2Word(.nRepEstru(cRect,1))
+.Numd2Word(.nRepEstru(cRect,2))+;
.Numd2Word(.nRepEstru(cRect,3))
+.Numd2Word(.nRepEstru(cRect,4)+nEspacio)
Else
nEspacio =Iif(lMenu,Sysmetric(20),0)
Endif
cArea= Substr(cRect,1,8)
ClientToScreen(nHandle, @cArea)
ClipCursor(cRect)
Endwith
Return .T.
Endproc
Procedure Unload
ClipCursor(0)
Endproc
Procedure Moved
Thisform.Encerrar(Alltrim(Thisform.Caption),Thisform.chkbarra.Value,
Thisform.chkmenu.Value)
Endproc
Procedure Resize
Thisform.Encerrar(Alltrim(Thisform.Caption),Thisform.chkbarra.Value,
Thisform.chkmenu.Value)
Endproc
Procedure Init
Endproc
Procedure Liberar.Click
ClipCursor(0)
Endproc
Procedure ctitulo.Init
This.Value= Thisform.Caption
Endproc
Procedure Limitar.Click
Thisform.Encerrar(Alltrim(Thisform.ctitulo.Value),Thisform.chkbarra.Value,
Thisform.chkmenu.Value)
Endproc
Enddefine
***********************************************************************************
*************
Con el FileSystem es posible crear archivos de texto de una manera fácil.
En la siguiente función muestro la manera de hacerlo
Function CreaArchivoTexto()
Local fso, tf
fso = CreateObject("Scripting.FileSystemObject")
tf = fso.CreateTextFile("c:mitexto.txt", .T.)
tf.WriteLine("Probando 1, 2, 3.")
tf.WriteBlankLines(3)
tf.Close
Endfunc
***********************************************************************************
*************
Por Medio de este codigo podemos saber el Handle de la ventana que estamos usando,
y su titulo, muy util, si queremos loguear los nombres de las aplicaciones que el
usuario uso. o bloquear el acceso a alguna Aplicacion en Especifico.
Public oForm
oForm=Newobject("Info_Ventana")
oForm.Show
Return
Top = 0
Left = 0
Height = 110
Width = 460
ShowWindow = 2
DoCreate = .T.
BorderStyle = 1
HalfHeightCaption = .T.
MaxButton = .F.
MinButton = .F.
AlwaysOnTop = .T.
Name = "Form1"
Top = 0, ;
Left = 0, ;
Interval = 500, ;
Name = "Timer1"
Left = 68, ;
Top = 2, ;
Width = 388, ;
Name = "nHandle"
Left = 68, ;
Top = 24, ;
Width = 388, ;
Name = "cTitulo"
Caption = "Handle", ;
Left = 12, ;
Top = 4, ;
Name = "Label1"
Left = 12, ;
Top = 27, ;
Name = "Label2"
Top = 48, ;
Left = 432, ;
Height = 12, ;
Width = 24, ;
Caption = ">>", ;
Name = "Mas"
FontBold = .T.
Left = 66, ;
Top = 60, ;
Width = 120, ;
Name = "nIzquierda"
Left = 66, ;
Top = 82, ;
Width = 120, ;
Name = "nDerecha"
Left = 284, ;
Top = 61, ;
Width = 120, ;
Name = "nArriba"
Left = 284, ;
Top = 83, ;
Width = 120, ;
Name = "nAbajo"
Caption = "Izquierda", ;
Left = 7, ;
Top = 66, ;
Name = "Label3"
Caption = "Derecha", ;
Left = 6, ;
Top = 84, ;
Name = "Label4"
Caption = "Arriba", ;
Left = 204, ;
Top = 65, ;
Name = "Label5"
Caption = "Abajo", ;
Left = 204, ;
Top = 86, ;
Name = "Label6"
Procedure obt_valor
nEmp=((nValor-1)*4)+1
cCadena = Substr(cEstructura,nEmp,4)
Endproc
Procedure Load
This.Height = 60
Endproc
Procedure timer1.Timer
ctitulo =Space(255)
cRect = Space(17)
nhandle = GetForegroundWindow()
GetWindowRect(nhandle,@cRect)
With Thisform
.ctitulo.Value = ctitulo
.nhandle.Value = nhandle
.nizquierda.Value = .obt_valor(cRect,1)
.narriba.Value = .obt_valor(cRect,2)
.nderecha.Value = .obt_valor(cRect,3)
.nabajo.Value = .obt_valor(cRect,4)
Endwith
Endproc
Procedure mas.Click
If Thisform.Height = 60
Thisform.Height = 110
this.Caption = '<<'
Else
Thisform.Height = 60
this.Caption = '>>'
Endif
Endproc
Procedure Init
this.SetAll('Autosize',.t.,'label')
this.SetAll('backstyle',0,'label')
this.SetAll('height',22,'textbox')
this.BackColor =16441261
EndProc
Enddefine
***********************************************************************************
*************
La rutina que a continuación les presento nos da la facilidad de saber si es que
nuestra unidad existe, pasando como argumento la unidad como una sola letra o como
prompt:
Ejemplos:
Function DriverExist(lcDriveOrPathExist)
loFSO = CREATEOBJECT('Scripting.FileSystemObject')
Result=loFSO.DriveExists(lcDriveOrPathExist)
RELEASE loFSO
Return Result
Endfunc
***********************************************************************************
*************
Este es un ejemplo de como podemos obtener por medio de apis estadistica de los
paquetes icmp
enviados y recibidos en la maquina.
Public oFrm
oFrm=Newobject("ICMP_Data")
oFrm.Show
Return
Height = 280
Width = 500
Desktop = .T.
DoCreate = .T.
AutoCenter = .T.
BorderStyle = 0
ControlBox = .T.
Closable = .T.
MaxButton = .F.
MinButton = .F.
ClipControls = .F.
AlwaysOnTop = .F.
BackColor = Rgb(203,230,241)
Name = "ICMP_Data"
ColumnWidths = "250,100,100", ;
Height = 271, ;
Left = 6, ;
Sorted = .F., ;
Top = 2, ;
Width = 483, ;
DisabledItemBackColor = Rgb(102,130,200), ;
DisabledItemForeColor = Rgb(255,255,0), ;
DisabledForeColor = Rgb(255,0,0), ;
Name = "lst_datos"
Top = 36, ;
Left = 408, ;
Height = 23, ;
Width = 23, ;
Interval = 560, ;
Name = "Timer1"
Procedure Estadisticas()
ICMP = Space((13*4*2)+1)
If GetIcmpStatistics(@ICMP) = 0
With Thisform.lst_datos
For nCiclo = 1 To 13
.AddListItem(Alltrim(Str(.Parent.nRepStruct(ICMP,nCic
lo))),nCiclo+1,2)
.AddListItem(Alltrim(Str(.Parent.nRepStruct(ICMP,nCic
lo+13))),nCiclo+1,3)
Endfor
Endwith
Else
Endif
Endproc
Procedure nRepStruct
nEmp=((nValor-1)*4)+1
cCadena = Substr(cEstructura,nEmp,4)
Endproc
Procedure Load
Endproc
Procedure lst_datos.Init
With This
.Clear()
.AddListItem('Parametros',1,1)
.AddListItem('Recibidos',1,2)
.AddListItem('Enviados',1,3)
.AddListItem('Mensajes',2,1)
.AddListItem('Errores',3,1)
.AddListItem('Destino inaccesible',4,1)
.AddListItem('Tiempo agotado',5,1)
.AddListItem('Problema de Parametros',6,1)
.AddListItem('Redirecciones',8,1)
.AddListItem('Echos',9,1)
.AddListItem('Respuestas de Eco',10,1)
.AddListItem('Fechas',11,1)
.AddListItem('Respuestas de fecha',12,1)
.AddListItem('Máscaras de direcciones',13,1)
Endwith
Thisform.Estadisticas()
Endproc
Procedure timer1.Timer
Thisform.Estadisticas()
Endproc
Enddefine
***********************************************************************************
*************
Partir un archivo en n bytes con fox. Esto es parte de utilidades de backups. (Les
envio el programa para volver a unir las piezas en la proxima noticia)
*- JARSoft Argentina
*- Prog. Alberto Rodiriguez - jarargentina@hotmail.com
*- Ultima modificacion: Abr. 2003
*-
*- Partir el archivo en piezas de n bytes
*- ADVERTENCIA.!! todos los archivos de extencion nnn de tcDestino se eliminan.!!
*-
Lparameters tcArchivo, tnBytes, tcDestino
*- Devuelve el nro de pedazos en que se partio el archivo o cero
*- si no se pudo completar la operacion o -1 si hubo algun error.
*- Ej. de uso:
*- nPedazos = partirarchivo_01('c:tmpRespaldos.zip', 1457664, 'c:tmp')
*- Este ejemplo divide respaldos.zip en 1.40 Mg para que las partes quepan en
*- disquetes y las pone en c:tmp
If PCOUNT() # 3 Or Vartype(tcArchivo) # 'C' Or Vartype(tnBytes) # 'N' Or ;
Messagebox('Error de llamada.',16,'')
Return -1
Endif
If Val(Left(Version(4),2)) < 7
'version',16,'Version no soportada')
Return -1
Endif
tcDestino = Lower(Addbs(tcDestino))
*--------------------------------------------------------------------------
cAux = Justext(tcArchivo)
For x = 1 To Len(cAux)
If !Isdigit(Substr(cAux, x, 1))
lOk = .T.
Exit
Endif
NEXT
ELSE
lOk = .T.
Endif
If !lOk
Return -1
Endif
*--------------------------------------------------------------------------
cFlog = Sys(3)+'.log'
cAntesSafe = Set("Safety")
nDevolver = 0
If !File(tcArchivo)
Return -1
Endif
tcArchivo = Lower(Locfile(tcArchivo))
If Adir(aInfoFilePartir1, tcArchivo)#1
Return -1
Endif
Return -1
Endif
Set Safety Off
*- directorio destino)
If File(cAux)
Endif
Next
Endif
nNroDisco = 1
nMan = Fopen(tcArchivo)
If nMan < 0
Return -1
Endif
nDevolver = -1
Messagebox('Demasiados archivos',16,'')
Exit
Endif
cFileDestino = tcDestino + ;
Forceext(Justfname(tcArchivo), Transform(nNroDisco, @L 999'))
nManParte = Fcreate(cFileDestino)
If nManParte < 0
nDevolver = -1
Exit
Endif
nEspacio = tnBytes
If nBytesEscritos = 0
nDevolver = -1
Exit
Endif
Enddo
Fclose(nManParte)
nDevolver = nNroDisco
If nTamanio <= 0
Exit
Endif
nNroDisco = nNroDisco + 1
Enddo
Fclose(nMan)
*- fin partir
Release aInfoFilePartir1
Return nDevolver
*- usar: unirarchivo_01.prg
*- JARSoft Argentina
***********************************************************************************
*************
Este codigo nos permitira mostrar las dll's que han sido cargadas por nuestro
programa, ya sea
directa o indirectamente, por ejemplo si declaramos una funcion contenida en una
Dll
esta dll sera cargada por nuestro programa,
Public oForm
oForm=Newobject("Lst_Dep")
oForm.Show
Return
Autocenter = .t.
Height = 204
Width = 702
DoCreate = .T.
Caption = "Dependecias"
Name = "Frm_Lst_Dep"
Left = 554, ;
Height = 27, ;
Width = 144, ;
Name = "Command1"
ColumnCount = 2, ;
ColumnWidths = "120,510", ;
RowSourceType = 1, ;
RowSource = "", ;
FirstElement = 1, ;
Height = 169, ;
Left = 0, ;
NumberOfElements = 0, ;
Top = 1, ;
Width = 696, ;
Name = "List1"
Procedure num2dword
Lparameter tnNum
Local c0,c1,c2,c3
lcresult = Chr(0)+Chr(0)+Chr(0)+Chr(0)
c3 = Chr(Int(tnNum/(256^3)))
tnNum = Mod(tnNum,256^3)
c2 = Chr(Int(tnNum/(256^2)))
tnNum = Mod(tnNum,256^2)
c1 = Chr(Int(tnNum/256))
c0 = Chr(Mod(tnNum,256))
lcresult = c0+c1+c2+c3
Endif
Return lcresult
Endproc
Procedure Load
Endproc
Procedure command1.Click
cProc =Space(549)
lProcessID = GetCurrentProcessId()
hSnapshot = CreateToolhelp32Snapshot(8, 0)
With Thisform
.LockScreen = .t.
.list1.Clear()
cProc = .num2dword(548)+.num2dword(0)+.num2dword(0)+;
+.num2dword(0)+.num2dword(0)+.num2dword(0)+.num2dword(0)+;
+.num2dword(0)+Space(256)+Space(260)
cCadena =Space(255)
nCiclo =0
nCiclo = nCiclo +1
cCadena=Substr(cProc,33,255)
.list1.AddListItem(Substr(cCadena,1,At(Chr(0),cCadena)-
1),nCiclo,1)
cCadena=Substr(cProc,290,259)
.list1.AddListItem(Substr(cCadena,1,At(Chr(0),cCadena)-
1),nCiclo,2)
Enddo
.LockScreen = .F.
Endwith
Endproc
Enddefine
***********************************************************************************
*************
API Este ejemplo nos muestra como podemos saber por medio del handle de una
ventana, obtenido
por API, si aun existe.
nHandle=FindWindow(.null.,"Calculadora")
?ExisteV(nHandle)
?ExisteV(nHandle)
********************
*Ejemplos:
?ExisteV(_screen.HWnd )
?ExisteV(_vfp.HWnd )
?ExisteV(456464)
********************
Function ExisteV(nHandle)
Return isWindow(nHandle) = 1
EndFunc
***********************************************************************************
*************
Este ejemplo muestra como averiguar si la maquina esta conectada a alguna red.
NETWORK_ALIVE_AOL = 0x4
NETWORK_ALIVE_LAN = 0x1
NETWORK_ALIVE_WAN = 0x2
nRet = 0
IsNetworkAlive(@nRet)
If nRet = 0 Then
Return
Endif
If nRet =NETWORK_ALIVE_WAN
Endif
If nRet =NETWORK_ALIVE_AOL
Endif
If nRet =NETWORK_ALIVE_LAN
Endif
***********************************************************************************
*************
Este codigo permite Poner el texto que querramos en El Beton Inicio (en realidad
se crea un boton con el texto indicado, sobre el boton del menu inicio)
WS_CHILD = 0x40000000
WM_LBUTTONDOWN = 0x201
WM_LBUTTONUP = 0x202
SW_HIDE = 0
SW_NORMAL = 1
Declare Long FindWindowEx in "user32" Long Handle, Long hWnd2, String lpsz1, String
lpsz2
Long y, Long nWidth, Long nHeight, Long hWndParent, Long hMenu, Long
hInstance, Integer lpParam
cRect= Space(40)
GetWindowRect(bWnd, @cRect)
hInst =GetWindowWord(_screen.HWnd,-6)
(buf2dword(Substr(cRect,9,4)))-(buf2dword(Substr(cRect,1,4))),;
(buf2dword(Substr(cRect,13,4)))-(buf2dword(Substr(cRect,5,4))),;
tWnd, 0, hInst , 0)
ShowWindow(ncWnd, SW_NORMAL)
ShowWindow(bWnd, SW_HIDE)
local cMsg
cMsg = Space(40)
ShowWindow(bWnd, SW_NORMAL)
?buf2dword(Substr(cmsg,5,4))
DestroyWindow(ncWnd)
Endfunc
***********************************************************************************
*************
Este Ejemplo muestra como por medio de API como podemos obtener la Estadistica de
los
datagramas UDP.
netstat -e -p udp -s 5
Public oFrm_UDP
oFrm_UDP=Newobject("frm_udp")
oFrm_UDP.Show
Return
Procedure timer1.Timer
cUDP =Space(21)
If GetUdpStatistics(@cUDP) = 0
With Thisform
.nrecibidos.Value = .buf2dword(Substr(cUDP,1,4))
.nenviados.Value = .buf2dword(Substr(cUDP,13,4))
.nerror.Value = .buf2dword(Substr(cUDP,9,4))
.nsinpuerto.Value = .buf2dword(Substr(cUDP,5,4))
Endwith
Else
Wait Window "No es Posible obtener Estadisticas UDP!"
Endif
Endproc
Enddefine
***********************************************************************************
*************
Con esta función, podrás conocer los datos de la unidad pasada como parámetro de
texto, tales como espacio disponible, espacio libre y tamaño total.
Su forma de uso:
GetDrive([cunidad])
Ejemplo:
=GetDrive("c:")
Procedure GetDriver(cGetDriver)
loFSO = CREATEOBJECT('Scripting.FileSystemObject')
loDrive =loFSO.GetDrive(cGetDriver)
lcDriveLetter = loDrive.DriveLetter
lnAvailableSpace = loDrive.AvailableSpace
lnFreeSpace = loDrive.FreeSpace
lnTotalSize = loDrive.TotalSize
? lnAvailableSpace
? lnFreeSpace
? lnTotalSize
RELEASE loFSO
Endfunc
***********************************************************************************
*************
Una función simple para generar contraseñas aleatorias.
*------------------------------------------------
* FUNCTION GenPass(tnLargo)
*------------------------------------------------
* Genera una contraseña aleatoria de longitud
* 'tnLargo' y conteniendo mayusculas, minusculas,
* numeros y simbolos especiales
* PARAMETROS: tnLargo: largo de la contraseña
* RETORNA: Caracter
* USO: ? GenPass(15)
*------------------------------------------------
FUNCTION GenPass(tnLargo)
IF EMPTY(tnLargo)
tnLargo = 10
ENDIF
RAND(-1)
ln = LEN(CARACTERES)
lc = ""
FOR lnI = 1 TO tnLargo
lc = lc + SUBSTR(CARACTERES, INT(RAND() * ln ) + 1, 1)
ENDFOR
RETURN lc
ENDFUNC
*------------------------------------------------
***********************************************************************************
*************
Siguiendo con los filesystem, aqui tienes la forma de crear un archivo de texto.
Function crearArchivo()
Local fso, fldr
fso = CreateObject("Scripting.FileSystemObject")
fldr = fso.CreateTextFile("C:prueba.txt")
Endfunc
***********************************************************************************
*************
Siguiendo con el tema de filesystem, aqui les presento la rutina para escribir en
el registro.
Function EntradaReg
loWSH = CREATEOBJECT("wscript.shell")
loWSH.RegWrite("HKEY_CURRENT_USERSoftwarecesa","Autorizado")
loWSH.RegWrite("HKEY_CURRENT_USERSoftwarecesadata","ESAPAH")
endfunc
***********************************************************************************
*************
FUNCTION TiraAcento
Parameters cExpressao
cProcurarPor = "ÁÉÍÓÚáéíóúÀÈÌÒÙàèìòùÂÊÎÔÛâêîôûÄËÏÖÜäëïöüÃÕãõÇçÑñº"
cSubstituirPor = "AEIOUaeiouAEIOUaeiouAEIOUaeiouAEIOUaeiouAOaoCcNno"
cExpressaoRetorno = CHRTRAN(cExpressao,cProcurarPor,cSubstituirPor)
RETURN(cExpressaoRetorno)
***********************************************************************************
*************
Desabilitar item do combo/listbox
***********************************************************************************
*************
Bueno, ya se ha visto en este foro como se hacen algunas tareas con las APIS, así
que para no redundar yo colaboraré con algunas funciones para los filesystem.
La presente función borra una carpeta de la unidad especificada.
Function Borrarcarpeta()
Local fso as object
fso = CreateObject("Scripting.FileSystemObject")
fldr = fso.DeleteFolder("C:borrame")
Endfunc
***********************************************************************************
*************
Esta función permite abrir el cuadro de diálogo conectar a unidad de red o
impresora
#DEFINE RESOURCETYPE_DISK 1
#DEFINE RESOURCETYPE_PRINT 2
***********************************************************************************
*************
Después de que un cliente me pidió crear una notificación de los eventos
importantes del aplicativo decidí hacerla tipo Messenger incluyendo el sonido
característico que este utiliza pues bien aquí les deje el código espero que les
sea útil.
Ahora declaramos la API que vamos a utilizar la colocamos en el evento Load del
formulario:
*- esto nos permitira abrir el formulario sin que nos afecte otra ventana.
=SetWindowPos(this.HWnd, -1, 0, 0, 0, 0, 1 + 2 )
lcWaveFile =""
*-- defino la ruta del sonido a emitir
lcWaveFile = ruta + "Librerias\newemail.wav"
Y listo ya tenemos nuestro mensaje tipo Messenger el diseño corre por cuenta de
ustedes.
***********************************************************************************
*************
Este Ejemplo permite hacer Parpadear un Form de la misma manera que lo hace
el Microsoft Messenger, cuando llega un nuevo mensaje, y no esta activa la ventana
en ese momento, y que para cuando se Activa.
Procedure Num2dWord
Lparameter tnNum
Local c0,c1,c2,c3
lcresult = Chr(0)+Chr(0)+Chr(0)+Chr(0)
If tnNum < (2^31 - 1) then
c3 = Chr(Int(tnNum/(256^3)))
tnNum = Mod(tnNum,256^3)
c2 = Chr(Int(tnNum/(256^2)))
tnNum = Mod(tnNum,256^2)
c1 = Chr(Int(tnNum/256))
c0 = Chr(Mod(tnNum,256))
lcresult = c0+c1+c2+c3
Endif
Return lcresult
Endproc
***********************************************************************************
*************
Muchas veces desde el menu de nuestra aplicacion tenemos una instruccion como
esta:
do Form Nombre_DelForm
... Esta función, permite evitar eso, si el form ya ha sido cargado lo mostrara, en
lugar de cargarlo de nuevo. su uso es sencillo:
_form= Carga_Form("nombre_del_archivo")
Function Carga_Form(cNombre)
Local oForm
Activate Screen
If Type('&cNombre')<>'U' And Isnull(&cNombre)
Release (cNombre)
Endif
If Type(cNombre)<>'O'
Public (cNombre)
Do Form (cNombre) Name (cNombre) Linked
EndIf
oForm =Evaluate(cNombre)
oForm.WindowState =0
oForm.Show
Return oForm
Endfunc
***********************************************************************************
*************
Este Ejemplo nos muestra como podemos usar el fondo de windows, para fondo de
nuestro Form, o bien, del _Screen.
Solo hay que indicar que cada vez que se cambie de tamaño o se redibuje, hay que
decirle que vuelva a colocar el fondo.
esto podria hacerce desde el evento Resize.
Public oFrm_Fondo
oFrm_Fondo=Newobject("oFrm_Fondo")
oFrm_Fondo.Show
Return
Procedure command1.Click
Declare Long PaintDesktop In "user32" Long hdc
Declare Long GetDC In "user32" Long Handle
Local nRet As Long
nRet= GetDC(Thisform.HWnd)
=PaintDesktop(nRet)
Thisform.SetAll("Visible",.T.)
Endproc
Enddefine
***********************************************************************************
*************
Cuantas veces no hemos querido ingresar un registro en blanco en alguna posicion
especifica de una tabla ?
GO 3
INSERT BLANK BEFORE
***********************************************************************************
*************
Siempre nos ha inquietado las vistas preliminares de los informes en VFP, ya que
estas tienen muy poco control con el teclado y se debe de recurrir al mouse (a la
gran mayoria no nos gusta).
Dando alguna que otra vueltas, ha salido la siguiente rutina. No es que sea la
panacea universal, pero algo de control dá.
A ver si entre todo la mejoramos un poco:
SET RESOURCE OFF
PUSH KEY
POP KEY
SET RESOURCE ON
***********************************************************************************
*************
Esta funcion permite saber el tamaño de un archivo en especifico (en bytes), por
medio de api.
Function GetInfoF(cFile)
Declare Long _lopen In "kernel32" As lOpen String lpPathName, Long iReadWrite
Declare Long _lclose In "kernel32" As lclose Long hFile
Declare Long GetFileSize In "kernel32" Long hFile, Long @lpFileSizeHigh
Local nArchivo As Long, nLongitud As Long
Local lpMax As Long
lpMax =1
nArchivo= lOpen(cFile, OF_READ)
nLongitud = GetFileSize(nArchivo, @lpMax )
lclose(nArchivo)
Return nLongitud
Endfunc
***********************************************************************************
*************
Esta API NO documentada nos permite preguntar al usuario si desea cerrar la sesion
si el usuario responde si, se cerrara la sesion.
***********************************************************************************
*************
No todas las instalaciones del sistema operativo se hacen sobre la ruta C:/Windows,
algunas veces cambia, ¿Necesita saber donde se instalo?, aqui mencionamos cómo
hacerlo.
***********************************************************************************
*************
Este ejemplo nos permite saber cuando cambia el valor de una clave dada en el
registry.
Podemos ver de una clave en especifico y ver subclaves (como por ejemplo de
HKEY_CURRENT_USER)
o bien de una clave abierta con la api OpenKey
Public oForm
oForm=Newobject("Frm_Reg")
oForm.Show
Return
Procedure Load
oWsh = Createobject("WScript.shell")
owhs =
oWsh.RegWrite("HKEY_CURRENT_USERpaginaDireccion","www.portalfox.com")
Wait Window "Valor en: HKEY_CURRENT_USERpaginaDireccion
"+oWsh.REGREAD("HKEY_CURRENT_USERpaginaDireccion") Nowait
HKEY_CLASSES_ROOT = 0x80000000
HKEY_CURRENT_USER = 0x80000001
HKEY_LOCAL_MACHINE = 0x80000002
HKEY_CURRENT_CONFIG = 0x80000005
REG_NOTIFY_CHANGE_NAME = 0x1
REG_NOTIFY_CHANGE_ATTRIBUTES = 0x2
REG_NOTIFY_CHANGE_LAST_SET = 0x4
REG_NOTIFY_CHANGE_SECURITY = 0x8
REG_NOTIFY_ALL = (REG_NOTIFY_CHANGE_NAME +REG_NOTIFY_CHANGE_ATTRIBUTES
+REG_NOTIFY_CHANGE_LAST_SET +REG_NOTIFY_CHANGE_SECURITY)
Declare Long RegNotifyChangeKeyValue In "advapi32" Long hKey,Long
bWatchSubtree, Long dwNotifyFilter, Long hEvent , Long fAsynchronous
Declare Long RegOpenKey In "advapi32.dll" Long hKey, String lpSubKey,
Long @phkResult
Declare Long RegCloseKey In "advapi32.dll" Long hKey
Local nClave As Long, otro As Long, nRet As Long
nClave = 0
nRet =RegOpenKey(HKEY_CURRENT_USER, "pagina",@nClave)
RegNotifyChangeKeyValue(@nClave, 1, REG_NOTIFY_ALL , 0,0 )
Messagebox("Registry changed")
RegCloseKey(nClave)
This.Caption = oWsh.REGREAD("HKEY_CURRENT_USERpaginaDireccion")
Endproc
Enddefine
***********************************************************************************
*************
Cuantas veces usted a necesitado cambiar el código escrito en los métodos del
dataenviroment de un reporte en tiempo de ejecución y el comando MODIFY REPORT no
se lo permite.
**JGS:21/03/2003
**Programa que permite la modificación del código interno de un reporte
**en tiempo de ejecución
Local ltemp_rep As String
ltemp_rep=Getfile('frx')
Use (ltemp_rep) Alias rep_temp In 0 Exclusive
Select rep_temp
Goto Top In rep_temp
Locate For objtype=25
If Found('rep_temp')
Modify Memo rep_temp.Tag
Use In rep_temp
Compile Report <emp_rep
Endif
If Used('rep_temp')
Use In rep_temp
Endif
***********************************************************************************
*************
Cansado de codificar largas y tediosas instrucciones INSERT para utilizarlas via
SPT?, aquí te decimos como hacerlo un poco mas fácil.
Select MiCursor
SCATTER MEMVAR
SQLExec(lnConnHandle,"INSERT INTO miTablaSQL FROM MEMVAR")
MiTabla (iID int, dFecha date, iClienteID int, iSeccionID int, yImporte Y)
USE miTabla IN 0
lcInsert = CrearInsert("Mitabla","Ventas")
USE MiTabla IN 0
lcInsert = CrearInsert("Mitabla","Ventas")
lcRegistros = trans( RECCOUNT("MiTabla"))
SCAN
WAIT WINDOW "Insertando registro " + TRANS(recno())+ "/"+lcRegistros NOWAIT
=SQLExec(lnConnHandle,lcInsert)
ENDSCAN
WAIT WINDOW "Proceso Finalizado"
***********************************************************************************
*************
A veces puede resultarnos necesario una lista de servidores MS-SQLServer, igual a
la que aparece cuando damos de alta un nuevo ODBC basado en este producto....
***********************************************************************************
*************
Esta Api, permite crear una propiedad a un form o al _screen por medio de su Handle
(disponible a partir de VFP 7.0 +) y tambien podemos leer su valor, por otra api, o
bien removerla.
***********************************************************************************
*************
Si necesitas saber en que fecha fué creado un archivo o directorio, aquí explicamos
cómo hacerlo.
FUNCTION CreationDate
LPARAMETER tcFileorDir,;
tlIsDir
LOCAL loFso, ;
loFileorDir
***********************************************************************************
*************
Otra forma de llamar la ventana de seleccion de colores mediante API.
DO DECL
#DEFINE CC_RGBINIT 1
#DEFINE CC_FULLOPEN 2
#DEFINE CC_PREVENTFULLOPEN 4
#DEFINE CC_SHOWHELP 8
#DEFINE CC_SOLIDCOLOR 128
#DEFINE CC_ANYCOLOR 256
#DEFINE CC_WIDE 32
#DEFINE CHOOSECOLOR_SIZE 36
#DEFINE COLORREF_ARRAY_SIZE 64
hWindow = GetActiveWindow()
lnInitColor = RGB(128,0,0)
#DEFINE GMEM_FIXED 0
lnCustColors = GlobalAlloc(GMEM_FIXED, COLORREF_ARRAY_SIZE)
= ZeroMemory(lnCustColors, COLORREF_ARRAY_SIZE)
lnFlags = CC_FULLOPEN + CC_RGBINIT
lcBuffer = num2dword(CHOOSECOLOR_SIZE) +;
num2dword(hWindow) +;
num2dword(0) +;
num2dword(lnInitColor) +;
num2dword(lnCustColors) +;
num2dword(lnFlags) +;
num2dword(0) +;
num2dword(0) +;
num2dword(0)
IF ChooseColor(@lcBuffer) <> 0
? "Color selected:", buf2dword(SUBSTR(lcBuffer, 13,4))
? "Custom colors stored:"
lcCustColors = REPLI(CHR(0), COLORREF_ARRAY_SIZE)
= Heap2Str(@lcCustColors, lnCustColors, COLORREF_ARRAY_SIZE)
FOR ii=1 TO 16
? ii, buf2dword(SUBSTR(lcCustColors, (ii-1)*4+1, 4))
ENDFOR
ENDIF
=GlobalFree(lnCustColors)
FUNCTION num2dword(lnValue)
#DEFINE m0 256
#DEFINE m1 65536
#DEFINE m2 16777216
LOCAL b0, b1, b2, b3
b3 = INT(lnValue/m2)
b2 = INT((lnValue - b3*m2)/m1)
b1 = INT((lnValue - b3*m2 - b2*m1)/m0)
b0 = MOD(lnValue, m0)
RETURN CHR(b0)+CHR(b1)+CHR(b2)+CHR(b3)
ENDFUNC
FUNCTION buf2dword (lcBuffer)
#DEFINE MAX_DWORD 4294967295 && 0xffffffff
#DEFINE MAX_LONG 2147483647 && 0x7FFFFFFF
LOCAL lnResult
lnResult = ASC(SUBSTR(lcBuffer, 1,1)) + ;
ASC(SUBSTR(lcBuffer, 2,1)) * 256 +;
ASC(SUBSTR(lcBuffer, 3,1)) * 65536 +;
ASC(SUBSTR(lcBuffer, 4,1)) * 16777216
RETURN IIF(lnResult>MAX_LONG, lnResult-MAX_DWORD, lnResult)
ENDFUNC
PROCEDURE DECL
DECLARE INTEGER ChooseColor IN comdlg32 STRING @lpcc
DECLARE INTEGER GetActiveWindow IN user32
DECLARE INTEGER GlobalFree IN kernel32 INTEGER HMEM
DECLARE RtlZeroMemory IN kernel32 AS ZeroMemory;
INTEGER DEST, INTEGER numBytes
***********************************************************************************
*************
Bueno, esta API nos permite saber si 2 rutas de archivos estan en el mismo disco.
***********************************************************************************
*************
Bueno aqui os envio un ejemplo de como iniciar una sesión en OpenOffice, crear un
documento
en el Writer, guardar el documento y terminar la sesión.
Para terminar la sesión es posible que haya una forma mejor pero yo solo he
encontrado esa, si alguien sabe de alguna mejor y no le importa :) q la comente.
*!*
*!* Creamos un nuevo documento
*!*
loDocument = loDesktop.LoadComponentFromUrl( "private:factory/swriter", "_blank",
0, @laPropertyValue )
comarray( loDocument, 10 )
loCursor = loDocument.TEXT.CreateTextCursor()
loDocument.TEXT.InsertString( loCursor, "Hola desde VFP" , .F. )
*!*
*!* Salvamos el documento
*!*
laPropertyValue[1] = createStruct( @loReflection,
"com.sun.star.beans.PropertyValue" )
laPropertyValue[1].NAME = "Overwrite"
laPropertyValue[1].VALUE = .T.
loDocument.storeAsURL( "file:///c:/test.sxw", @laPropertyValue )
*!*
*!* Terminamos la sesión en OpenOffice
*!*
loDesktop.TERMINATE()
***********************************************************************************
*************
Una forma bonita de darle un fondo a nuestras aplicaciones es por medio de esta
Api.
DO decl
#DEFINE LR_LOADFROMFILE 16
LOCAL lcBitmap
lcBitmap = "C:Windowsbosque.bmp"
IF hBitmap <> 0
= ShowBitmap (hBitmap, lnX,lnY)
= DeleteObject (hBitmap)
ELSE
= MessageB (lcBitmap + Chr(13) + Chr(13) +;
"Check if this is a valid BMP file.",;
32, " Unable to load an image from file")
ENDIF
#DEFINE AC_SRC_OVER 0
#DEFINE AC_SRC_ALPHA 1
#DEFINE AC_SRC_NO_ALPHA 2
#DEFINE SRCCOPY 13369376
hWnd = GetActiveWindow()
hDC = GetWindowDC (hWnd)
hMemDC = CreateCompatibleDC(hDC)
= SelectObject (hMemDC, hBitmap)
lnAlphaBlend = lnBlendOp +;
BitLShift(lnBlendFlags, 8) +;
BitLShift(lnSrcConstAlpha, 16) +;
BitLShift(lnAlphaFormat, 24)
IF lnResult = 0
? "Error:", GetLastError()
ENDIF
= DeleteDC(hMemDC)
= ReleaseDC (hWnd, hDc)
RETURN .T.
PROCEDURE decl
DECLARE INTEGER CreateCompatibleDC IN gdi32 INTEGER hdc
DECLARE INTEGER DeleteDC IN gdi32 INTEGER hdc
DECLARE INTEGER GetActiveWindow IN user32
DECLARE INTEGER GetWindowDC IN user32 INTEGER hwnd
DECLARE INTEGER ReleaseDC IN user32 INTEGER hwnd, INTEGER dc
DECLARE INTEGER DeleteObject IN gdi32 INTEGER hObject
DECLARE INTEGER SelectObject IN gdi32 INTEGER hdc, INTEGER hObject
***********************************************************************************
*************
Algunas veces necesitamos crear un arbol de directorio completo, pero a veces
existe hasta cierto nivel el arbol, y necesitamos ir viendo si el primer nivel
existe, si no existe lo creamos, si no creamos el del siguiente nivel...
***********************************************************************************
*************
Una forma diferente de realizar un formulario con Scroll.
PUBLIC oForm
oForm = CreateObject("Tform")
oForm.Visible = .T.
PROCEDURE Init
THIS.decl
THIS.CreateSource
PROCEDURE Destroy
* releasing system resources
= ReleaseDC(THIS.hForm, THIS.hFormDC)
= DeleteObject(THIS.hMemBmp)
= DeleteDC(THIS.hMemDC)
PROCEDURE Activate
IF ThisForm.hForm = 0
* retrieving window handle and device context for the form
ThisForm.hForm = GetFocus()
ThisForm.hFormDC = GetWindowDC(ThisForm.hForm)
ENDIF
PROCEDURE tm.timer
ThisForm.CopyToTarget && refreshing display window
PROCEDURE ogSpeed.InteractiveChange
* changing scroll speed
DO CASE
CASE THIS.Value = 1
ThisForm.tm.interval = 0
CASE THIS.Value = 2
ThisForm.tm.interval = 100
CASE THIS.Value = 3
ThisForm.tm.interval = 50
CASE THIS.Value = 4
ThisForm.tm.interval = 20
CASE THIS.Value = 5
ThisForm.tm.interval = 10
CASE THIS.Value = 6
ThisForm.tm.interval = 5
ENDCASE
PROCEDURE CreateSource
* creating compatible device context and placing text on it
DECLARE INTEGER GetDesktopWindow IN user32
DECLARE INTEGER CreateCompatibleDC IN gdi32 INTEGER hdc
DECLARE INTEGER CreateCompatibleBitmap IN gdi32;
INTEGER hdc, INTEGER nWidth, INTEGER nHeight
= DeleteObject(SelectObject(THIS.hMemDC, THIS.hMemBmp))
PROCEDURE CopyToTarget
* copying smaller portions from memory device context to the target
#DEFINE SRCCOPY 13369376
LOCAL hTarget, hTargetDC, x,y
IF hTarget <> 0
= ReleaseDC(hTarget, hTargetDC)
ENDIF
PROCEDURE decl
DECLARE INTEGER GetFocus IN user32
DECLARE INTEGER GetActiveWindow IN user32
DECLARE INTEGER DeleteDC IN gdi32 INTEGER hdc
DECLARE INTEGER DeleteObject IN gdi32 INTEGER hObj
DECLARE INTEGER GetWindowDC IN user32 INTEGER hwnd
DECLARE INTEGER CreateSolidBrush IN gdi32 LONG crColor
DECLARE INTEGER ReleaseDC IN user32 INTEGER hwnd, INTEGER hdc
DECLARE INTEGER SetBkColor IN gdi32 INTEGER hdc, LONG crColor
DECLARE INTEGER SelectObject IN gdi32 INTEGER hdc, INTEGER hObj
DECLARE INTEGER SetBkMode IN gdi32 INTEGER hdc, INTEGER iBkMode
DECLARE INTEGER SetTextColor IN gdi32 INTEGER hdc, INTEGER crColor
PROCEDURE Init
LOCAL ii, obj, nTop
nTop = 5
FOR ii=1 To 6
obj = Eval("THIS.Option" + LTRIM(STR(ii)))
WITH obj
.Top=nTop
.Autosize=.T.
nTop = nTop + 20
ENDWITH
ENDFOR
ENDDEFINE
***********************************************************************************
*************
Si necesitan buscar parte de un código dentro de un procedimiento almacenado en
SQL SERVERS, aqui la solución.
***********************************************************************************
*************
Con Este codigo, podemos Ver Modificar la configuracion de colores de Windows. al
estilo del plus! de Microsoft o bien cuando damos Click derecho sobre el Escritorio
Propiedades/Apariencia
Public oForm
oForm=Newobject("Colores_Windows")
oForm.Show
Return
Define Class Colores_Windows As Form
Top = 41
Left = 37
Height = 452
Width = 527
DoCreate = .T.
Caption = "Jugando con los colores de Windows"
TitleBar = 1
Name = "FrmColores_Windows"
Add Object cmdmostrar As CommandButton With ;
Top = 24, ;
Left = 396, ;
Height = 49, ;
Width = 126, ;
WordWrap = .T., ;
Caption = "
Name = "cmdMostrar"
Add Object cmdaplicar As CommandButton With ;
Top = 72, ;
Left = 396, ;
Height = 49, ;
Width = 126, ;
WordWrap = .T., ;
Caption = "
Enabled = .F., ;
Name = "cmdAplicar"
Procedure ver_colores
Local nCiclo, oBarra, oEtiqueta, nX, cNombre, aListado
Dimension aListado [19,2]
nX = 20
aListado[1,2] = 'Barra de Desplazamiento'
aListado[2,2] = 'Fondo'
aListado[3,2] = 'Barra de Titulo Ventana Activa'
aListado[4,2] = 'Barra de Titulo Ventana Inactiva'
aListado[5,2] = 'Menú'
aListado[6,2] = 'Ventana'
aListado[7,2] = 'Marco de la Ventana'
aListado[8,2] = 'Texto de Menú'
aListado[9,2] = 'Texto de Ventana'
aListado[10,2] = 'Texto de Barra de Titulo'
aListado[11,2] = 'Borde Ventana Activa'
aListado[12,2] = 'Borde Ventana Inactiva'
aListado[13,2] = 'Area de Trabajo de la Aplicacion'
aListado[14,2] = 'Seleccion'
aListado[15,2] = 'Texto Seleccionado'
aListado[16,2] = 'Color Objeto 3D'
aListado[17,2] = 'Sombra Objeto 3D'
aListado[18,2] = 'Texto Gris'
aListado[19,2] = 'Texto del Objeto 3D'
For nCiclo = 1 To 19
aListado[nciclo,1]=nCiclo-1
cNombre ="Barra_"+Alltrim(Str(nCiclo))
If Type('thisform.'+cNombre)<>'O'
Thisform.AddObject(cNombre,'Barra_color')
EndIf
oBarra = Evaluate("thisform."+cNombre)
cNombre ="lbl_barra_"+Alltrim(Str(nCiclo))
If Type('thisform.'+cNombre)<>'O'
Thisform.AddObject('lbl_barra_'+Alltrim(Str(nCiclo)),'Label')
EndIf
oEtiqueta = Evaluate('Thisform.'+cNombre)
oBarra.BackColor = getsyscolor(aListado[nciclo,1])
oBarra.Left = 50
oBarra.Top = nX
oEtiqueta.BackStyle = 0
oEtiqueta.AutoSize = .T.
oEtiqueta.Caption =Alltrim(aListado[nciclo,2])
oEtiqueta.Top = nX
oEtiqueta.Left = oBarra.Left + oBarra.Width +15
oEtiqueta.Visible = .T.
oBarra.Visible= .T.
nX= nX +oBarra.Height +3
EndFor
Thisform.cmdaplicar.Enabled = .T.
EndProc
Procedure establecer_colores
Local nCiclo, oBarra, nNumero, nValor
For nCiclo = 1 To 19
oBarra = Evaluate("thisform.Barra_"+Alltrim(Str(nCiclo)))
nNumero= nCiclo -1
nValor = oBarra.BackColor
If nValor <> getsyscolor(nNumero)
SetSysColors(1,@nNumero,@nValor)
EndIf
EndFor
EndProc
Procedure Load
Declare Long GetSysColor In "user32" Long nIndex
Declare Long SetSysColors In "user32" Long nChanges, Long @lpSysColor,
Long @lpColorValues
EndProc
Procedure cmdmostrar.Click
Thisform.ver_colores
EndProc
Procedure cmdaplicar.Click
Thisform.establecer_colores
EndProc
EndDefine
***********************************************************************************
*************
Algunas veces en las aplicaciones multiusuario se requiere limpiar o modificar
ciertas tablas (dbf) en tiempo de ejecución. El problema es como determinar si esta
tabla esta siendo ocupada por algún usuario en otra estación en ese momento???...
ya que para realizar estas operaciones es necesario tomar en forma exclusiva estos
archivos. Aqui les entrego una función muy sencilla y para determinar si el archivo
esta siendo utilizado o no.
Ojala les sirva !!!
Saludos
*********************************************************************
* FUNCION : Determinar si una tabla esta en uso
* PARAMETROS : Nombre Archivo (expresion caracter)
* Ej1: "x:tablastabla1.dbf"
* Ej2: "tabla1.dbf"
* VALORES DEVUELTOS : 0 = El archivo no esta en uso
* 1 = El archivo esta en uso
* 2 = ERROR
* AUTOR : romovi
*********************************************************************
Parameters cArchivo
Store 0 to ValRet
SetTalk = Set("Talk")
Set Talk Off
IF TYPE("cArchivo")#"C"
Wait wind "Parametro mal definido"
ValRet = 2
ELSE
IF !FILE(cArchivo)
Wait wind "El archivo indicado no existe!!!"
ValRet = 2
ENDIF
ENDIF
IF ValRet=0
idFile = fopen(cArchivo,12)
=fclose(idFile)
ValRet = Iif(idFile<>-1,0,1)
ENDIF
SET TALK &SetTalk
Return ValRet
***********************************************************************************
*************
Necesita renombrar directorios?, aqui le mencionamos cómo hacerlo.
******************************************************************
* ---- Renombrar Directorio ----- Rename Directory
* ---- Author: Espartaco Palma Martinez esparta@NO_SPAMportalfox.com
* ---- FUNCTION: renamedir
* ---- RETURNS: 1 If Directory rename sucess
* ---- -1 If no Source Directory parameter
* ---- -2 If no Target Directory parameter
* ---- -3 If the Directory doesn't exist
* ---- -4 If source directory is Current Directory
* ---- RETORNA: -1 Renombrado de directorio con exito
* ---- -1 Si no se especifico parametro de Directorio fuente
* ---- -2 Si no se especifico parametro de Directorio Destino
* ---- -3 Si el directorio no existe
* ---- -4 Si el directorio actual es el directorio fuente
* ---- PARAMETERS: tcSource - TYPE: Character, Source Directory
* ---- tcTarget - TYPE: Character, Target Directory
* ---- PARAMETROS: tcSource - TIPO: Caracter, ruta completa del directorio fuente
* ---- tcTarget - TIPO: Caracter, ruta completa del directorio Destino
* ---- DATE: 16/Mar/2004 For Use in Visual FoxPro.
* ---- Sample/Ejemplo:
* ---- ltFecha = creationDate("C:/prueba","C:/prueba2")
******************************************************************
FUNCTION RenameDir
LPARAMETERS tcSource, tcTarget
LOCAL lfso &&FileSystem Object
DO CASE
CASE (VARTYPE(tcSource)#"C" or EMPTY(tcSource))
**** Falta Parametro Directorio Origen
**** Needs Source Parameter
RETURN -1
CASE (VARTYPE(tcTarget)#"C" or EMPTY(tcTarget))
**** Falta Parametro Directorio Destino
**** Needs Target Parameter
RETURN -2
CASE !DIRECTORY(tcSource)
**** No se encuentra el directorio Origen
**** Source Directory no found
RETURN -3
CASE SYS(5)+SYS(2003)==UPPER(tcSource)
**** El directorio Actual no puede ser renombrado
**** Current Dir cannot be renamed
RETURN -4
ENDCASE
lfso = CREATEOBJECT("Scripting.FileSystemObject")
lfso.MoveFolder(tcSource,tcTarget)
RETURN 1
***********************************************************************************
*************
Para que puedan verificar si un correo electrónico fue escrito correctamente.
***************************************************************************
***************************************************************************
*** Sintaxis:
*** DireccionEmail("tumail@elservidor.com")
***
*** Valores Devueltos tipo Lógicos .T. o .F.
*** .T. = el nombre es correcto y .F. si tuvo algun problema con el nombre.
***
*** Autor: J. Enrique Ramos Menchaca.
*** E-Mail: jermmx@NOSPAMhotmail.com
*** Fecha: 19 de febrero del 2003.
***************************************************************************
***************************************************************************
FUNCTION DireccionEmail(cemail)
lcMail = cemail
lcNombre = SPACE(0)
lcHost = SPACE(0)
nTAMAÑO = LEN(lcMail)
set library to SYS(2003)+''+'foxtools'
local lnPalabras, lapalabras(1), i, sep
sep=@
lnPalabras=words(lcMail, sep)
dimension lapalabras(lnPalabras)
for i=1 to lnPalabras
lapalabras[i]=wordnum(lcMail, i, sep)
next i
lcNombre = laPalabras[1]
lcHost = laPalabras[2]
*** Verifico el Nombre del mail ***
llNombreCorrecto = VerificarNombreMail(lcNombre)
llHostCorrecto = VerificarHostMail(lcHost)
IF llNombreCorrecto = .F.
MESSAGEBOX("El Nombre del usuario de correo electrónico es
incorrecto.")
ENDIF
IF llHostCorrecto = .F.
MESSAGEBOX("El Nombre del servidor de correo electrónico es
incorrecto.")
ENDIF
RETURN IIF(llNombreCorrecto = .T. .AND. llHostCorrecto = .T., .T., .F.)
ENDFUNC
FUNCTION VerificarNombreMail(lcPalabra)
llVerificado = .T.
lnPalabra = LEN(lcPalabra)
I = 1
FOR I = 1 TO lnPalabra
lcCaracter = SUBSTR(lcPalabra, I,1)
llVerificado = IIF(BETWEEN(lcCaracter,'0','9'), .T., ;
IIF(BETWEEN(lcCaracter,'a','z'), .T., ;
IIF(BETWEEN(lcCaracter,'A','Z'), .T., .F.)))
IF llVerificado = .F.
EXIT
ENDIF
ENDFOR
DO CASE
CASE INLIST(lcPalabra,'..', '.-', '-.', '._', '_.')
llVerificado = .F.
CASE INLIST(lcPalabra,'--', '-_', '_-')
llVerificado = .F.
CASE INLIST(lcPalabra,'__', ' ')
llVerificado = .F.
ENDCASE
IF llVerificado = .T.
lcCaracter = SUBSTR(lcPalabra,1,1)
llVerificado = IIF(BETWEEN(lcCaracter,'0','9'), .T., ;
IIF(BETWEEN(lcCaracter,'a','z'), .T., ;
IIF(BETWEEN(lcCaracter,'A','Z'), .T., .F.)))
lcCaracter = SUBSTR(lcPalabra,lnPalabra,1)
llVerificado = IIF(BETWEEN(lcCaracter,'0','9'), .T., ;
IIF(BETWEEN(lcCaracter,'a','z'), .T., ;
IIF(BETWEEN(lcCaracter,'A','Z'), .T., .F.)))
ENDIF
RETURN llVerificado
ENDFUNC
FUNCTION VerificarHostMail(lcPalabra)
llVerificado = .T.
lnPalabra = LEN(lcPalabra)
I = 1
FOR I = 1 TO lnPalabra
lcCaracter = SUBSTR(lcPalabra, I,1)
llVerificado = IIF(BETWEEN(lcCaracter,'0','9'), .T., ;
IIF(BETWEEN(lcCaracter,'a','z'), .T., ;
IIF(BETWEEN(lcCaracter,'A','Z'), .T., ;
IIF( '.' $ lcCaracter, .T., .F.))))
IF llVerificado = .F.
EXIT
ENDIF
ENDFOR
DO CASE
CASE INLIST(lcPalabra,'..', '.-', '-.', '._', '_.')
llVerificado = .F.
CASE INLIST(lcPalabra,'--', '-_', '_-')
llVerificado = .F.
CASE INLIST(lcPalabra,'__', ' ')
llVerificado = .F.
ENDCASE
IF llVerificado = .T.
lcCaracter = SUBSTR(lcPalabra,1,1)
llVerificado = IIF(BETWEEN(lcCaracter,'0','9'), .T., ;
IIF(BETWEEN(lcCaracter,'a','z'), .T., ;
IIF(BETWEEN(lcCaracter,'A','Z'), .T., .F.)))
lcCaracter = SUBSTR(lcPalabra,lnPalabra,1)
llVerificado = IIF(BETWEEN(lcCaracter,'0','9'), .T., ;
IIF(BETWEEN(lcCaracter,'a','z'), .T., ;
IIF(BETWEEN(lcCaracter,'A','Z'), .T., .F.)))
x = SUBSTR(lcPalabra,lnPalabra-2,1)
y = SUBSTR(lcPalabra,lnPalabra-3,1)
llVerificado = IIF(SUBSTR(lcPalabra,lnPalabra-3,1) = '.' .OR.
SUBSTR(lcPalabra,lnPalabra-2,1) = '.', .T., .F.)
ENDIF
RETURN llVerificado
ENDFUNC
***********************************************************************************
*************
Listado de DSN con sus parametros
#DEFINE ANSI_CHARSET 0
#DEFINE OUT_DEFAULT_PRECIS 0
#DEFINE OUT_DEVICE_PRECIS 5
#DEFINE OUT_OUTLINE_PRECIS 8
#DEFINE CLIP_DEFAULT_PRECIS 0
#DEFINE CLIP_STROKE_PRECIS 2
#DEFINE DEFAULT_QUALITY 0
#DEFINE PROOF_QUALITY 2
#DEFINE DEFAULT_PITCH 0
#DEFINE FW_BOLD 700
#DEFINE TRANSPARENT 1
#DEFINE OPAQUE 2
DO decl
ii = ii - 30
= _print (lcText, Rgb(80,80,80), -ii)
ENDFOR
= _print (lcText, Rgb(164,0,0), 0)
hwnd = GetActiveWindow()
hdc = GetWindowDC (hwnd)
* the printing
= TextOut (hdc, 50, 100, lcText, Len(lcText))
PROCEDURE decl
DECLARE INTEGER GetActiveWindow IN user32
DECLARE INTEGER GetWindowDC IN user32 INTEGER hwnd
***********************************************************************************
*************
Es algo diferente, no ?
PUBLIC obj
obj = CreateObject("Tform")
obj.Visible = .T.
PROCEDURE Activate
IF THIS.hdr.hWindow = 0
THIS.CreateHeader
ENDIF
PROCEDURE CreateHeader
THIS.hdr.CreateHeader
THIS.hdr.AddItem ("Id", 50, 0)
THIS.hdr.AddItem ("First name", 150, 1)
THIS.hdr.AddItem ("Last name", 150, 2)
THIS.hdr.AddItem ("Dept.", 150, 3)
WITH THIS.lst
.RowsourceType=2
.RowSource="csList"
.ColumnCount=4
.ColumnWidths="47,147,147,147"
.ListIndex = 1
ENDWITH
ENDDEFINE
PROCEDURE Destroy
THIS.ReleaseHeader
PROCEDURE CreateHeader
#DEFINE WS_CHILD 1073741824 && 0x40000000
#DEFINE WS_BORDER 8388608 && 0x00800000L
#DEFINE HDS_BUTTONS 2
#DEFINE GWL_HINSTANCE -6
#DEFINE HWND_BOTTOM 1
#DEFINE SWP_SHOWWINDOW 64
#DEFINE ANSI_CHARSET 0
#DEFINE OUT_OUTLINE_PRECIS 8
#DEFINE CLIP_STROKE_PRECIS 2
#DEFINE PROOF_QUALITY 2
#DEFINE DEFAULT_PITCH 0
#DEFINE WM_SETFONT 48
THIS.ReleaseHeader
* positioning
DECLARE INTEGER SetWindowPos IN user32;
INTEGER hwnd, INTEGER hWndInsertAfter,;
INTEGER x, INTEGER y, INTEGER cx, INTEGER cy,;
INTEGER wFlags
= SetWindowPos(THIS.hWindow, HWND_BOTTOM,;
THIS.hdrLeft, THIS.hdrTop,;
THIS.hdrLeft+THIS.hdrWidth-1, THIS.hdrTop+THIS.hdrHeight-1,;
SWP_SHOWWINDOW)
PROCEDURE ReleaseHeader
IF THIS.hWindow <> 0
THIS.RemoveItems
lcBuffer = num2dword(HDI_TEXT+HDI_WIDTH+HDI_ORDER) +;
num2dword(lnWidth) + num2dword(lnItemPtr) +;
num2dword(0) + num2dword(Len(lcItem)) +;
num2dword(0) + num2dword(0) + num2dword(0) +;
num2dword(lnOrder)
***********************************************************************************
*************
No se si les pasó a ustedes el tener que repetir una y otra vez el alta de las
mismas tablas en el entorno de datos para similares ABM de datos, al crear un form
de datos fijos repetitivos como clientes, proveedores, localidades, etc.
Si hacia una clase para cada una de estas tablas para luego crear el form de
nuestro cliente derivado de la clase escrita, siempre me faltaba algo. Trabajar en
los campos. (agregarlos en el form, o editar su controlsource) y crear el entorno
de datos en el formulario.
Todos los proveedores tienen campos similares, nombre, domicilio, etc. Y todas esas
tablas se llaman igual. ¿Por qué no crear entonces un entorno de datos en la clase?
-Tablas similares deben usarse con un mismo nombre (aunque pertenezcan a bases de
datos distintas) Ej. articulos.dbf, rubros.dbf, etc.
-Estas tablas tienen siempre similares estructuras. (en algunos casos se agregan o
quitan campos)
-Ubicaciones en directroios diferentes y nombre de bases de datos diferentes.
1 - Cree una clase no visual visible para todos los formularios:
With Thisform.DataEnvironment
.CloseTables() && libera el entorno de datos cargado
.AddObject("CurProveedores", "Cursores_01", ‘proveedores’)
.AddObject("CurLocalidades", "Cursores_01", ‘Localidades’)
*- ... etc. y todas las tablas que se necesitan en el form.
.OpenTables()
Endwith
Return This.nError = 0
*- Fin Load.
(a partir de aqui esta clase ya puede tener todos los campos y sus controlsource
establecidos en tiempo de diseño y funcionará sin ninguna modificacion adicional en
el formulario que, de entrada no tendrá ni una linea de codigo y funcionará.)
3 - Crear el form derivado de esta clase de abm y establecer datasession = 2
Quitar campos:
No implica problema en los pocos casos en que esto suscede se puede usar la prop.
Visible del campo. La tabla no hay porque modificarla.
Saludos.
***********************************************************************************
*************
API Aqui hay una bonita forma de escribir en el screen un texto de entrada o salida
de una aplicacion, dara una impresion muy profesional.
PUBLIC frm
frm = CreateObject("Tform")
frm.Visible = .T.
Width=700
Height=250
mouseX=0
mouseY=0
BorderStyle=2
hFontHeader=0
hFontMemo=0
Top=THIS.txt.Top, Left=THIS.txt.Left+THIS.txt.Width+5,;
Height=THIS.txt.Height, Width=50,;
Default=.T., Caption="Click"
Top=THIS.txt.Top, Left=THIS.cmdClip.Left+THIS.cmdClip.Width+15,;
PROCEDURE Load
DO decl
PROCEDURE Init
THIS.createFont
PROCEDURE Destroy
THIS.releaseFont
PROCEDURE DblClick
THIS.removeRegion
PROCEDURE MouseDown
IF nButton = 1
ThisForm.mouseX = lnX
ThisForm.mouseY = lnY
ENDIF
PROCEDURE MouseMove
IF nButton = 1
ENDIF
PROCEDURE cmdClip.Click
ThisForm.clipText
PROCEDURE createFont
#DEFINE ANSI_CHARSET 0
#DEFINE OUT_OUTLINE_PRECIS 8
#DEFINE CLIP_STROKE_PRECIS 2
#DEFINE PROOF_QUALITY 2
#DEFINE DEFAULT_PITCH 0
THIS.hFontHeader = CreateFont (;
OUT_OUTLINE_PRECIS, CLIP_STROKE_PRECIS,;
THIS.hFontMemo = CreateFont (;
PROCEDURE releaseFont
= DeleteObject (THIS.hFontMemo)
= DeleteObject (THIS.hFontHeader)
PROCEDURE clipText
#DEFINE TRANSPARENT 1
#DEFINE OPAQUE 2
#DEFINE RGN_COPY 5
hwnd = GetFocus()
= BeginPath (hdc)
THIS._print (hdc, 15,125, " Double click to restore the original view ")
= EndPath (hdc)
PROCEDURE removeRegion
LOCAL hwnd
hwnd = GetFocus()
= SetWindowRgn (hwnd, 0, 1)
PROCEDURE _move
ThisForm.mouseX = lnX
ThisForm.mouseY = lnY
ENDIF
ENDDEFINE
PROCEDURE decl
INTEGER fdwCharSet,;
INTEGER fdwOutputPrecision,;
INTEGER fdwClipPrecision,;
INTEGER fdwQuality,;
INTEGER fdwPitchAndFamily,;
STRING lpszFace
LOCAL lcBuffer
lcBuffer = Repli(Chr(0), 8)
= GetCursorPos (@lcBuffer)
x = buf2dword(SUBSTR(lcBuffer, 1,4))
y = buf2dword(SUBSTR(lcBuffer, 5,4))
***********************************************************************************
*************
Otra manera de ver las fuentes del PC
DO decl
#DEFINE GMEM_FIXED 0
#DEFINE LF_FACESIZE 32
#DEFINE FW_NORMAL 400
#DEFINE DEFAULT_CHARSET 1
#DEFINE OUT_DEFAULT_PRECIS 0
#DEFINE CLIP_DEFAULT_PRECIS 0
#DEFINE DEFAULT_QUALITY 0
#DEFINE DEFAULT_PITCH 0
#DEFINE CF_SCREENFONTS 1
#DEFINE CF_INITTOLOGFONTSTRUCT 64
#DEFINE CF_EFFECTS 256
#DEFINE CF_FORCEFONTEXIST 65536
LOCAL lcChooseFont, lcLogFont, hLogFont, lcFontFace
lcLogFont = num2dword(16) +;
num2dword(0) +;
num2dword(0) +;
num2dword(0) +;
num2dword(FW_NORMAL) +;
Chr(1) +;
Chr(0) +;
Chr(0) +;
Chr(DEFAULT_CHARSET) +;
Chr(OUT_DEFAULT_PRECIS) +;
Chr(CLIP_DEFAULT_PRECIS) +;
Chr(DEFAULT_QUALITY) +;
Chr(DEFAULT_PITCH) +;
PADR("Times New Roman"+Chr(0),32)
lnLogFontSize = 60
hLogFont = GlobalAlloc(GMEM_FIXED, lnLogFontSize)
lcChooseFont = num2dword(60) +;
num2dword(0) +;
num2dword(0) +;
num2dword(hLogFont) +;
num2dword(0) +;
num2dword(CF_SCREENFONTS + CF_EFFECTS +;
CF_INITTOLOGFONTSTRUCT + CF_FORCEFONTEXIST) +;
num2dword(0) +;
num2dword(0) +;
num2dword(0) +;
num2dword(0) +;
num2dword(0) +;
num2dword(0) +;
num2dword(0) +;
num2dword(0) +;
num2dword(0)
?
? "*** LOGFONT Structure:"
? "Font Weight:", buf2dword(SUBSTR(lcLogFont, 17,4))
? "Italic: ", Iif(Asc(SUBSTR(lcLogFont, 21,1))=0, "No","Yes")
? "Underline: ", Iif(Asc(SUBSTR(lcLogFont, 22,1))=0, "No","Yes")
? "Strikeout: ", Iif(Asc(SUBSTR(lcLogFont, 23,1))=0, "No","Yes")
= GlobalFree (hLogFont)
RETURN
PROCEDURE decl
DECLARE INTEGER ChooseFont IN comdlg32 STRING @lpcf
DECLARE INTEGER GlobalFree IN kernel32 INTEGER hMem
DECLARE INTEGER GlobalAlloc IN kernel32;
INTEGER wFlags,;
INTEGER dwBytes
***********************************************************************************
*************
* 2 dicas para obter o diretorio do window
1.) GETENV("SystemRoot")
2.)
WshShell = CreateObject( "WScript.Shell" )
Dir_Win = WshShell.ExpandEnvironmentStrings("%WINDIR%")
***********************************************************************************
*************
Remove Buttons from the Print Preview Toolbar
LOCAL lcResourceFileStem
IF '05.'$VERSION() && Foxtools required in VFP5
SET LIBRARY TO HOME()+'foxtools.fll'
ENDIF
SET SAFETY OFF
lcResourceFileStem = ADDBS(JUSTPATH(SYS(2005)))+JUSTSTEM(SYS(2005))
SET RESOURCE OFF
* Copy the current resource file to NoPrint which is
* used to store changes to the Print Preview toolbar.
COPY FILE (lcResourceFileStem + ".dbf") ;
TO noprint.DBF
COPY FILE (lcResourceFileStem + ".fpt") ;
TO noprint.fpt
* Create a table to use for a simple report and put some data in it.
DELETE FILE PrintTest.DBF
CREATE TABLE PrintTest (NAME C(30), Address C(20), City C(20), State C(2))
INSERT INTO PrintTest VALUES ("Jodie Garber", "1234 Jones St", "Phoenix", "AZ")
INSERT INTO PrintTest VALUES ("Holly Johnson", "675 Smith St", "Chicago", "IL")
INSERT INTO PrintTest VALUES ("Jack Reacher", "968 Duvall Street", "Key West",
"FL")
INSERT INTO PrintTest VALUES ("Beau Borken", "1515 Main St", "York", "MT")
Right-click the Title bar of the Print Preview toolbar, and then click Customize.
If the Print Preview toolbar is docked, you can right-click between the buttons of
the toolbar.
Under Categories, click Print Preview, and then click the Print button and drag it
off the toolbar.
Click the Close button to close the Customize Toolbar dialog box.
Click the Close button on the Print Preview toolbar to close the Print Preview
toolbar.
Type the following command in the Command window:
SET RESOURCE OFF
***********************************************************************************
*************
Algunas veces nos puede interesar Saber el Estado que Tiene Alguna ventana, como
por ejemplo, si es visible, Minimizada, maximizada.
Public oForm
oForm=Newobject("form1")
oForm.Show(1)
Return
***********************************************************************************
*************
Cansado de codificar largas y tediosas instrucciones INSERT para utilizarlas via
SPT?,
aquí te decimos como hacerlo un poco mas fácil.
Select MiCursor
SCATTER MEMVAR
SQLExec(lnConnHandle,"INSERT INTO miTablaSQL FROM MEMVAR")
MiTabla (iID int, dFecha date, iClienteID int, iSeccionID int, yImporte Y)
USE miTabla IN 0
lcInsert = CrearInsert("Mitabla","Ventas")
USE MiTabla IN 0
lcInsert = CrearInsert("Mitabla","Ventas")
lcRegistros = trans( RECCOUNT("MiTabla"))
SCAN
WAIT WINDOW "Insertando registro " + TRANS(recno())+ "/"+lcRegistros NOWAIT
=SQLExec(lnConnHandle,lcInsert)
ENDSCAN
WAIT WINDOW "Proceso Finalizado"
***********************************************************************************
*************
Public oForm
oForm=Createobject("form1")
oForm.Show
Return
***********************************************************************************
*************
Funcion de Extraccion de Caracteres. Maneja una Cadena como si fuera un arreglo
de elementos separados por un separador.
**
** Libreria de Desarrollo: lmLIBRE. Enero de 1997.
** AUTHOR: Lucindo Mora. lucindom@yahoo.com
** Lenguaje: CLIPPER 5.01, Foxpro 2.6. - Visual Foxpro6 y 7.
** Rutina: Funcion de Extraccion de Caracteres.
** Maneja una Cadena como si fuera un arreglo
** de elementos separados por un separador.
** Ejemplo: lmStrExt("UNO,DOS,TRES,CUATRO", ",", 3) devolvera la cadena "TRES".
FUNCTION lmStrExt
PARA lmmsg, lmsrc, lmpos
LOCAL lmex0, lmex1, lmex2
lmpos = Max(floor(lmpos),1)
lmex0 = IIF(lmpos>1,ATC(lmsrc, lmmsg, lmpos-1)+lenc(lmsrc),1)
lmex1 = ATC(lmsrc, lmmsg, lmpos) -1
IF lmex1 < 0 .AND. (lmex0 > 1 .OR. lmpos = 1)
lmex1 = LEN(lmmsg)
ENDIF
RETURN SUBS( lmmsg, MIN(lmex0,LEN(lmmsg)), MAX(lmex1-lmex0+1,0))
ENDFUNC
***********************************************************************************
*************
Hace unos dias vi una pregunta que me llamo la atencion en el foro de
SQL Server, alguien pregunto como podia hacer para buscar fragmentos de codigo
dentro de todos los procedimientos almacenados de una base de datos,
bueno, escribi este codigo que hace eso, espero les ayude, a mi ya me sirvio mucho,
jeje.
Close Lista
Deallocate Lista
***********************************************************************************
*************
Cuando estamos trabajando en C/S y queremos enviar una sentencia SQL al servidor
debemos disponer de una conexión. Esta rutina intenta obtenerla desde las áreas ya
abiertas.
function GetConnHandle()
local lnConn
lnConn = -1
for i = 1 to aused( laOpenView )
if cursorgetprop('SourceType', laOpenView[i,1]) = 2 && vista remota
lnConn = cursorgetprop('ConnectHandle', laOpenView[i,1])
exit
endif
endfor
return m.lnConn
endfunc
***********************************************************************************
*************
Recientemente me tope con un Caso, en el que necesitaba extraer el Ciertas Partes
de una Pagina HTML de un servidor web.
Mi Primer Problema era como poder obtener el codigo dicho archivo, como hago para
guardarlo Con Formato HTML y como Hago Para Quitar todo el formato HTML y obtener
una version Solo Texto.
Aca Pongo una Funcion que pasandole como Primer Parametro La url y dependiendo de
lo que necesitemos, 1 para el html y 2 version solo texto, nos ayudara en esta
tarea.
Strtofile(Verhtml('www.portalfox.com',1), "c:portalfox.htm",0)
*Strtofile(Verhtml('www.portalfox.com',2), "c:portalfox.txt",0)
Function Verhtml
Lparameters cUrl, nOpcion
Local Texto, oIE, cResul, oDoc
If Type("oIE")<>'O'
oIE = Createobject("internetexplorer.application")
Endif
oIE.Navigate("about:blank")
oIE.navigate(cUrl)
Texto ='Cargando Pagina'
Do While oIE.busy
Wait Window Texto Time(0.1)
Enddo
oDoc = oIE.Document
Texto = Type('oDoc.body')
If nOpcion=1
cResul = oDoc.body.innerHTML()
Else
cResul = oDoc.body.innerText()
ENDIF
oDoc = .null.
Release oDoc
oIE.Quit
Release oIE
Return cResul
***********************************************************************************
*************
Con esta API sabremos como inicio Windows.
#DEFINE SM_CLEANBOOT 67
INIWIN = GetSystemMetrics(SM_CLEANBOOT)
IF INIWIN=1
MESSAGEBOX("No se puede ejecutar el sistema bajo Modo a Prueba de
Fallos",48,"ERROR")
QUIT
ELSE
IF INIWIN=2
MESSAGEBOX("No se puede ejecutar el sistema bajo Modo a Prueba de
Fallos",48,"ERROR")
QUIT
ENDIF
ENDIF
***********************************************************************************
*************
Esta es una manera simple de hacer que tu aplicación se actualice a si misma. No
requiere de un lanzador o "laucher".
IF oSistema.HayNuevaVersion()
* El ejecutable (actual) del sistema
cParams = Sistema.DirectorioSistema+"EPF.exe"
* Ejecuto un actualizador
RUN /N Actualizador.exe "&cParams"
LPARAMETERS ExeSistema
Local ExeRespaldo, Exenuevo
ExeNuevo = JUSTPATH(ExeSistema)+"nuevo.exe"
WAIT WINDOW "Actualizando la versión "+exesistema + "/"+exenuevo
INKEY(2) && Espero un tiempo para que el sistema que lo llamó se haya
terminado.
exeRespaldo = JUSTPATH(ExeSistema)+"Old.exe"
IF !FILE(ExeSistema) OR !FILE(Exenuevo)
*Aqui hay que enviar error
QUIT
ENDIF
***********************************************************************************
*************
Aqui esta el código para hacerlo mediante API.
DECLARE Integer SQLConfigDataSource IN odbccp32.dll ;
Integer, Short, String @, String @
ODBC_ADD_SYS_DSN = 1
***********************************************************************************
*************
Algunos Softwares escriben en el Archivo de configuraciones del Win.ini que es el
archivo de configuraciones de windows. Este archivo contiene mucha informacion
importante en el sistema, este se encuentra en c:/windows/win.ini en Win9x y en
c:/Winnt/win.ini en windows NT+
Para Escribir
?GetProfileInt("PortalFox", "Pagina", 0)
***********************************************************************************
*************
Algunas veces necesitamos saber si por ejemplo el nombre del archivo que nos da el
usuario cumple con algun criterio para nombres que deseamos mantener.
Digamos:
Usuario="2002_123.Ext"
y nuestro criterio es:
Criterio ="????-???.*"
como saber si se cumple ?
Declare long PathMatchSpec IN "shlwapi.dll" string pszFile, string pszSpec
?PathMatchSpec("C:/dir/archivo.txt","*.t?t")
?PathMatchSpec("C:/dir/archivo.tft","*.t?t")
?PathMatchSpec("archivo.tft","*.t?t")
?PathMatchSpec("C:/dir/archivo.txr","*.t?t")
?PathMatchSpec("archivo.txr","*.t?t")
El archivo, puede o no existir, lo que esta api hace es realizar una busqueda como
la que se hace en DOS con el dir, digamos DIR ???_*.txt
Lo cual nos devolveria todos los archivos que empiezen con 3 caracteres cualquiera,
que el cuarto sea un "_", el resto no importaria, pero de extension TXT.
***********************************************************************************
*************
Esta API nos permite saber si un directorio esta vacio o no.
Variable="c:/uno"
if Directory(variable)
? PathIsDirectoryEmpty(Variable)
else
mkdir &variable
? PathIsDirectoryEmpty(Variable)
endif
***********************************************************************************
*************
Esta Función sirve para encriptar.
Posee dos parametros
1º cadena a encriptar
2º Es la opción para encriptar o desencriptar se maneja con un 1 (uno) o un 2 (dos)
*****************************
FUNCTION CRYPT(ORIGEN,OPCION)
*****************************
DECLARE A[10]
IF OPCION=1
A[1]=CHR(ASC(SUBSTR(ORIGEN,1,1))+100)
A[2]=CHR(ASC(SUBSTR(ORIGEN,2,1))+101)
A[3]=CHR(ASC(SUBSTR(ORIGEN,3,1))+103)
A[4]=CHR(ASC(SUBSTR(ORIGEN,4,1))+109)
A[5]=CHR(ASC(SUBSTR(ORIGEN,5,1))+111)
A[6]=CHR(ASC(SUBSTR(ORIGEN,6,1))+112)
A[7]=CHR(ASC(SUBSTR(ORIGEN,7,1))+102)
A[8]=CHR(ASC(SUBSTR(ORIGEN,8,1))+105)
A[9]=CHR(ASC(SUBSTR(ORIGEN,9,1))+116)
A[10]=CHR(ASC(SUBSTR(ORIGEN,10,1))+104)
ELSE
A[1]=CHR(ASC(SUBSTR(ORIGEN,1,1))-100)
A[2]=CHR(ASC(SUBSTR(ORIGEN,2,1))-101)
A[3]=CHR(ASC(SUBSTR(ORIGEN,3,1))-103)
A[4]=CHR(ASC(SUBSTR(ORIGEN,4,1))-109)
A[5]=CHR(ASC(SUBSTR(ORIGEN,5,1))-111)
A[6]=CHR(ASC(SUBSTR(ORIGEN,6,1))-112)
A[7]=CHR(ASC(SUBSTR(ORIGEN,7,1))-102)
A[8]=CHR(ASC(SUBSTR(ORIGEN,8,1))-105)
A[9]=CHR(ASC(SUBSTR(ORIGEN,9,1))-116)
A[10]=CHR(ASC(SUBSTR(ORIGEN,10,1))-104)
ENDIF
***********************************************************************************
*************
Oi Pedro,
A função ALINES() pode fazer o parsing da string para você. Ela provê inclusive a
facilidade de definir o caractere delimitador dos valores. O código abaixo coloca
os valores de "lcString" em um array chamado "laValores":
lcString = "18,21,33,45,150,999"
ALINES(laValores, lcString, .T., ",")
***********************************************************************************
*************
Deseas saber que puertos tienes disponibles en tu Pc ?
DO decl
? "Testing port COM1:", TestPort("COM1")
? "Testing port COM2:", TestPort("COM2")
? "Testing port COM3:", TestPort("COM3")
? "Testing port COM4:", TestPort("COM4")
LOCAL hPort
hPort = CreateFile (lcPort, GENERIC_READ, 0,0,;
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0)
= CloseHandle(hPort)
RETURN (hPort <> INVALID_HANDLE_VALUE)
PROCEDURE decl
DECLARE INTEGER CreateFile IN kernel32;
STRING lpFileName, INTEGER dwAccess, INTEGER dwShareMode,;
INTEGER lpSecurityAttr, INTEGER dwCreationDisp,;
INTEGER dwFlagsAndAttr, INTEGER hTemplateFile
***********************************************************************************
*************
Este Ejemplo Demuestra Lo Facil que es por medio de api saber cuantos Milisegundos
tomo llevar a cabo X Accion. Util para mostrar tiempos al usuario.
***********************************************************************************
*************
Con estas sencillas lineas podremos obtener la IP de una URL mediante uan
instancia del control ActiveX Winsock
olSocket = CREATEOBJECT('MSWinsock.Winsock')
olSocket.LocalPort = 80
olSocket.RemotePort = 80
olSocket.RemoteHost = 'www.portalfox.com'
olSocket.Connect
0 = Cerrado (Predeterminado)
1 = Abierto
2 = Escuchando
3 = Conexion Pendiente
4 = Resolviendo Host
5 = Host Resuelto
6 = Conectando
7 = Conectado
8 = Cerrando la Conexion
9 = Error
Puedes leer mas en la ayuda del control Winsock, que seguramente esta
instalado con tu VFP.
***********************************************************************************
*************
Cuantas veces no hemos querido ir a una pagina web desde un boton, imagen o
cualquier otro objeto ?
Cuantas veces no hemos querido mostrar nuestra pagina web despues de realizar la
instalacion del programa ?
ShellExecute(0,"open","http://www.misitio.com","","",1)
***********************************************************************************
*************
Esto es una parte del código, de mucha ayuda para calcular el número de meses
entre dos fechas:
ldDate1 = DATE(2002,12,01)
ldDate2 = DATE(2003,05,15)
? (YEAR(ldDate2) + MONTH(ldDate2) / 12 ;
- YEAR(ldDate1) - MONTH(ldDate1) / 12) * 12
***********************************************************************************
*************
Cuando hacemos aplicaciones que envian Emails de notificacion, nuestra carpeta de
elementos enviados se llena y es dificil de los mensajes salgan con el tiempo.
#DECLARE O_INBOXFOLDER
#DECLARE O_DELETEDITEMS
LOCAL loOutlook, loSpace, loInbox, loDeletedItems
loOutlook= CREATEOBJECT("Outlook.Application")
loSpace = loOutlook.GetNameSpace("MAPI")
loInbox = loSpace.GetDefaultFolder(O_INBOXFOLDER)
The default Inbox folder
loDeletedItems = loSpace.GetDefaultFolder(O_DELETEDITEMS)
FOR EACH loMsg IN loInbox.Items
* poner aqui las condiciones que se deseen
loMsg.Move(loDeletedItems)
ENDFOR
***********************************************************************************
*************
Una manera de ver los contactos de OutLook (Por Alex Feldstein)
#define olFoldersContacts 10
#define olContactItem 2
oOutlook = CreateObject("Outlook.Application")
oNameSpace = oOutlook.GetNameSpace("MAPI")
oContacts = oNameSpace.GetDefaultFolder(olFoldersContacts)
***********************************************************************************
*************
En esta ocasion envio un pequeño programa que nos permite habilitar /deshabilitar
cualquier ventana buscandola por medio de su Caption, y tambien podemos cambiar el
Caption de cualquier ventana!!!
Al Deshabilitar una ventana no podremos dar Click ni escribir nada en esa ventana,
ni siquiera restaurarla o maximizarla, cerrarla, moverla, minimizarla, etc. (útil
si queremos que no puedan cerrar X ventana mientras corremos un proceso)
Solo hay que tener cuidado cuando busquen la ventana, tiene que ir exactamente
igual que como aparece en el título de la misma, mayúsculas y minúsculas.
Aquí el código:
Public oFormulario
oFormulario=Newobject("Ventanas")
oFormulario.Show
Return
Procedure Load
Declare Long IsWindowEnabled In "user32" Long handle
Declare Long EnableWindow In "user32" Long handle, Long fEnable
Declare Integer FindWindow In WIN32API String cNULL, String cWinName
Declare Long SetWindowText In "user32" Long handel, String lpString
Endproc
Procedure deshabilita.Click
Local Estado, retval As Long, handle As Long
handle = FindWindow(.Null.,Alltrim(Thisform.Titulo_ventana.Value))
If handle=0 Or Empty(Thisform.Titulo_ventana.Text)
Wait Window 'Ventana no Encontrada'
Return
Endif
retval = EnableWindow(handle, 0)
Estado= IsWindowEnabled(handle)
If Estado=0
Thisform.Estado.Caption =Alltrim(Thisform.Estado.Tag)+'
Deshabilitada'
Else
Thisform.Estado.Caption =Alltrim(Thisform.Estado.Tag)+'
Habilitada'
Endif
Endproc
Procedure Habilitar.Click
Local Estado, retval As Long, handle As Long
handle = FindWindow(.Null.,Alltrim(Thisform.Titulo_ventana.Value))
If handle=0 Or Empty(Thisform.Titulo_ventana.Text)
Wait Window 'Ventana no Encontrada'
Return
Endif
retval = EnableWindow(handle, 1)
Estado= IsWindowEnabled(handle)
If Estado=0
Thisform.Estado.Caption =Alltrim(Thisform.Estado.Tag)+'
Deshabilitada'
Else
Thisform.Estado.Caption =Alltrim(Thisform.Estado.Tag)+'
Habilitada'
Endif
Endproc
Procedure Cambiar.Click
Local Estado, retval As Long, handle As Long
handle = FindWindow(.Null.,Alltrim(Thisform.Titulo_ventana.Value))
If handle=0
Wait Window 'Ventana no Encontrada'
Return
Endif
If Empty(Thisform.Nuevo_Titulo.Text) Or
Empty(Thisform.Titulo_ventana.Text)
Wait Window 'Debe escribir un Caption valido'
Return
Endif
SetWindowText(handle, Alltrim(Thisform.Nuevo_Titulo.Text))
Estado= IsWindowEnabled(handle)
If Estado=0
Thisform.Estado.Caption =Alltrim(Thisform.Estado.Tag)+'
Deshabilitada'
Else
Thisform.Estado.Caption =Alltrim(Thisform.Estado.Tag)+'
Habilitada'
Endif
Endproc
Enddefine
***********************************************************************************
*************
Con esta API, podemos saber si una determinada PC esta activa en la red y ver si
es accesible.
? IsDestinationReachable("Nombre_Maquina", 0 )
***********************************************************************************
*************
Para variar más de APIS como dice uno de nuestros colegas. Aquí les presento una
función que es capáz de detectar si existe tarjeta de sonido instalada en nuestro
sistema.
Resultado = waveOutGetNumDevs()
If Resultado > 0 Then
Messagebox( "Posee tarjeta de sonido" )
Else
Messagebox( "No Posee tarjeta de sonido" )
Endif
***********************************************************************************
*************
Muchos de nosotros estamos cansados de los tipicos pormularios rectangulares,
SIEMPRE LO MISMO!!
#DEFINE C_ALTERNATE 1
#DEFINE C_WINDING 2
cPoints = num2dword(0)+num2dword(0);
+num2dword(THIS.Width+(sysmetric(13)*1));
+num2dword(THIS.Height+sysmetric(9)+(sysmetric(12)*2));
+num2dword(0)+num2dword(THIS.Height+sysmetric(9)+(sysmetric(12)*2))
lnw = _WFindTitl(THIS.Caption)
lnh = _WhToHWnd(lnw)
lnr = CreatePolygonRgn(@cPoints, 3, C_WINDING)
SetWindowRgn(lnh, lnr, 1)
return
procedure Num2dword
lparameter tnNum
local c0,c1,c2,c3
lcresult = chr(0)+chr(0)+chr(0)+chr(0)
if tnNum < (2^31 - 1) then
c3 = chr(int(tnNum/(256^3)))
tnNum = mod(tnNum,256^3)
c2 = chr(int(tnNum/(256^2)))
tnNum = mod(tnNum,256^2)
c1 = chr(int(tnNum/256))
c0 = chr(mod(tnNum,256))
lcresult = c0+c1+c2+c3
else
* no es un numero valido para DWORD
endif
return lcresult
***********************************************************************************
*************
Preciso baixar da Net uns arquivos. Precisa ser via http.
Que componente devo usar ?
WebBrowser ?
ITP ?
Como fazer ?
***
LOCAL loXMLHTTP as "MSXML2.XMLHTTP"
loXMLHTTP = CREATEOBJECT("MSXML2.XMLHTTP")
loXMLHTTP.open("GET", "http://www.intranet.com.br/arquivo.zip",.F.)
loXMLHTTP.Send()
strtofile(loXMLHTTP.responseBody,"arquivo.zip")
***
Oi, Fabiano.
loXMLHTTP.open("GET", "http://www.intranet.com.br/arquivo.zip",.F.)
para um arquivo existente e funcionou que foi uma maravilha.
Fiz outro teste mudando para um arquivo cujo site exige senha de acesso e ficou
simplesmente travado.
PERGUNTO:
Há um meio de passar o login e senha para o método OPEN ?
***********************************************************************************
*************
Esta API nos permite saber si el Internet Explorer esta trabajando con conexion a
Internet
o el usuario marco la casilla que indica "Trabajar sin conexion" lo que impide que
una pagina web cargue.
Si nos devuelve 0, es que el Internet Explorer esta trabajando con conexion, si nos
devuelve 1 o mas, es que NO tiene conexion.
? InetIsOffline(0)
***********************************************************************************
*************
Muchas veces requerimos realizara cálculos estadísticos dentro de FOX, aqui les
remito unas formulas que implemente, espero les sean de apoyo.
Como por todos es sabido, se requiere que pasen como parametro un arreglo con los
datos.
Function Media(Datos)
Local T, Num, Med
T=0, Num=Len(Datos)
Med=0.0
For t=1 to Num
Med=Med+Datos[t]
Next
Med=Med/Num
Return Med
Function Desv_est(Datos)
Local Num, t, Dest, Med, Temp
Num=Len(Datos)
t=0
Dest=0
Med=0.0
Temp=0
Med=Media(Datos)
For t=1 to Num
Dest=Dest+((Datos[t]-Med)*(Datos[t]-Med))
Next
Dest=Dest/num
Dest=Sqrt(Dest)
Return Dest
Function Mediana(Datos)
Local Num, dtemp
Num=Len(Datos)
*-- Clonamos los datos
=ACOPY(datos, dTemp)
Rapido(dTemp)
** Aqui utiliza tu método favorito para ordenar
** Si quieres implemetarlo la fórmula es
** n + 2 * (n / 2) + 4 * (n / 4) + 8 * (n / 8) + ... + n * (n / n)
Return dtemp[Num/2]
Function Encontrar_Moda(Datos)
Local AntModa, AntCont, Num, t
AntModa=0
AntCont=0
Num=Len(Datos)
cont=1
For t=1 to Num
md=Datos[t]
cont=1
For w=t+1 to num
if (md==datos[w]) Then
cont=Cont+1
endif
Next
if (Cont > Antcont)
antmoda=md
antcont=cont
endif
Next
Return AntModa
***********************************************************************************
*************
Existe una manera facil y practica de mostrar las ventanas de Windows, asi nos es
muy util trabajar con configuraciones personalizadas y atajos interesantes.
***********************************************************************************
*************
Este codigo nos permite modificar el menu que aparece cuando damos click sobre el
icono que aparece en la izquierda de la barra de titulo, o bien cuando damos click
derecho en la barra de tareas sobre nuestra aplicacion.
Este ejemplo quita las opciones Cerrar y Restaurar de dicho menu, adicional a ello
agrega unas opciones y separadores
Tambien, hago uso de una API, que sirve para mostrar el menu contextual de alguna
ventana
TrackPopupMenuex en la posicion que le indiquemos. Tal como se ve ese menu,
aparecera en el menu de control.
HSYSMENU = GETSYSTEMMENU(APPLICATION.HWND, 1)
ALGO = CREATEOBJECT("BARRAS_PLANAS")
ALGO.VISIBLE = .T.
READ EVENTS
DEFINE CLASS BARRAS_PLANAS AS form
showwindow = 2
autocenter = .t.
Top = 0
Left = 0
Height = 192
Width = 289
ScrollBars = 3
Caption = "BARRAS PLANAS"
Name = "BARRAS_PLANAS"
ALTOB= 25
ANCHO = 50
ULTIMO = 20
ADD OBJECT IZQUIERDA AS COMMANDBUTTON WITH ;
Top = 105, ;
Left = 920, ;
Height = 31, ;
Width = 133, ;
Caption = "A LA IZQUIERDA: 920", ;
Name = "IZQUIERDA"
PROCEDURE IZQUIERDA.CLICK()
CLEAR EVENTS
THISFORM.Release
ENDPROC
PROCEDURE INIT
LOCAL CICLO
FOR CICLO = 1 TO 10
THIS.ADDOBJECT("COMMAND"+ALLTRIM(STR(CICLO)),"BOTON")
ENDFOR
THISFORM.SETALL('VISIBLE', .T.)
this.SetViewPort(this.Width, this.Height)
ENDPROC
PROCEDURE activate
WS_VSCROLL = 0X200000
WS_HSCROLL = 0X100000
GWL_STYLE = (-16)
WSB_PROP_CYVSCROLL = 0X1
WSB_PROP_CXHSCROLL = 0X2
WSB_PROP_CYHSCROLL = 0X4
WSB_PROP_CXVSCROLL = 0X8
WSB_PROP_CXHTHUMB = 0X10
WSB_PROP_CYVTHUMB = 0X20
WSB_PROP_VBKGCOLOR = 0X40
WSB_PROP_HBKGCOLOR = 0X80
WSB_PROP_VSTYLE = 0X100
WSB_PROP_HSTYLE = 0X200
WSB_PROP_WINSTYLE = 0X400
WSB_PROP_PALETTE = 0X800
WSB_PROP_MASK = 0XFFF
FSB_FLAT_MODE = 2
FSB_ENCARTA_MODE = 1
FSB_REGULAR_MODE = 0
SB_HORZ = 0
SB_VERT = 1
SB_BOTH = 3
FALSE = 0
TRUE = 1
ESB_ENABLE_BOTH = 0X0
ESB_DISABLE_BOTH = 0X3
ESB_DISABLE_LEFT = 0X1
ESB_DISABLE_RIGHT = 0X2
ESB_DISABLE_UP = 0X1
ESB_DISABLE_DOWN = 0X2
ESB_DISABLE_LTUP = ESB_DISABLE_LEFT
ESB_DISABLE_RTDN = ESB_DISABLE_RIGHT
SIF_RANGE = 0X1
SIF_PAGE = 0X2
SIF_POS = 0X4
SIF_ALL = (SIF_RANGE + SIF_PAGE + SIF_POS)
Declare LONG GetWindowLong IN "user32" long handle, LONG nIndex
Declare LONG SetWindowLong IN "user32" LONG HANDLE, LONG nIndex, LONG
dwNewLong
Declare LONG InitializeFlatSB IN "comctl32" LONG HANDLE
Declare LONG UninitializeFlatSB IN "comctl32" LONG HANDLE
Declare LONG FlatSB_SetScrollProp IN "comctl32" LONG HANDLE, LONG
Nindex, LONG newValue, INTEGER fRedraw
Declare LONG FlatSB_EnableScrollBar IN "comctl32" LONG HANDLE, LONG
wSBflags, LONG wArrows
Declare LONG FlatSB_SetScrollPos IN "comctl32" LONG HANDLE, LONG
codIGO, LONG nPos, LONG fRedraw
Declare LONG FlatSB_SetScrollRange IN "comctl32" LONG HANDLE, LONG
CODIGO,LONG nMinPos, LONG nMaxPos, LONG fRedraw
Declare FlatSB_ShowScrollBar IN "comctl32" LONG HANDLE,LONG CODIGO,LONG
fShow
InitializeFlatSB(this.hWnd)
FlatSB_SetScrollProp(this.hWnd, WSB_PROP_VSTYLE, FSB_FLAT_MODE, False)
FlatSB_EnableScrollBar(THIS.hWnd, SB_VERT, ESB_ENABLE_BOTH )
FlatSB_SetScrollRange(THIS.hWnd, SB_VERT, 20, 80, False)
FlatSB_SetScrollPos(THIS.hWnd, SB_VERT, 60, FALSE)
FlatSB_ShowScrollBar(THIS.hWnd, SB_HORZ, TRUE)
LOCAL Ret As Long
Ret = GetWindowLong(THIS.hWnd, GWL_STYLE)
Ret = Ret +WS_VSCROLL +WS_HSCROLL
SetWindowLong(THIS.hWnd, GWL_STYLE-1, Ret)
IF this.ShowWindow = 2
this.ScrollBars = 0
endif
this.VScrollSmallChange =10
IF this.ultimo <>20
this.SetViewPort(this.Width, this.Height)
this.ultimo = 20
endif
ENDPROC
PROCEDURE Scrolled
LPARAMETERS nDirection
THISFORM.Refresh
ENDPROC
PROCEDURE UNLOAD
CLEAR EVENTS
ENDPROC
ENDDEFINE
DEFINE CLASS 'BOTON' AS CommandButton
PROCEDURE Click
CLEAR EVENTS
THISFORM.Release
ENDPROC
PROCEDURE Init
THIS.Height = THIS.PARENT.ALTOB
THIS.Width = THIS.PARENT.ANCHO
THIS.Left = 58
THIS.Top = THIS.Parent.ULTIMO
THIS.Parent.ULTIMO = THIS.Parent.ULTIMO+THIS.Parent.ALTOB+5
THIS.Caption = ALLTRIM(STR(THIS.TOP))
THIS.Visible = .T.
ENDPROC
ENDDEFINE
Las variables definidas alli, son las propiedades que podemos modificar por ejemplo
el color de la barra horizontal, usaremos esta variable
WSB_PROP_HBKGCOLOR
en el segundo parametro en FlatSB_SetScrollProp
Saludos desde Guatemala. Sigan disfrutando de las APIs, que aun no me aburro de
buscar novedades jeje ;)
***********************************************************************************
*************
Usando la API de Windows es así ...
Esto se puede implementar mejor, colocando este código en una función y pasando por
parámetros el comando a ejecutar y el forma de visualización.
Los comandos a ejecutar pueden ser de DOS o WINDOWS.
***********************************************************************************
*************
Mostrar la ventana Acerca de... propia de Windows pero con el icono personalizado.
cruta = cfileexe+chr(0)
tnHWnd = _screen.hwnd
nicon = ExtractIcon(@tnHWnd, @cruta, 0)
endproc
***********************************************************************************
*************
Esta es una Funcion que busca una ventana en base a su Caption, y la hace
parpadear.
Escrito para VFP6 (me imagino que correra con VFP5). Escribi esto, ya que hasta
VFP7 se da soporte al handle de los forms.
Adapte la rutina de Luis María Guayán que servia para evitar que una aplicacion se
cargara mas de una vez, para poder obtener el handle de la ventana.
LONG handle,;
Long bInvert
STRING cNULL, ;
STRING cWinName
if !F_ActivaWin("Calculadora")
ENDIF
FUNCTION F_ActivaWin(cCaption)
LOCAL nHWD
IF nHWD > 0
FlashWindow(nHWD, .t.)
RETURN .T.
ELSE
RETURN .F.
ENDIF
***********************************************************************************
*************
Dos formas de abrir archivos de Excel desde Visual FoxPro.
lcFile = GETFILE("XLS")
loShell = CREATEOBJECT("Shell.Application")
loShell.ShellExecute(lcFile)
RELEASE loShell
2. Mediante Automation
lcFile = GETFILE("XLS")
loExcel = CREATEOBJECT("Excel.Application")
loExcel.Workbooks.Open(lcFile)
loExcel.Application.Visible = .T.
RELEASE loExcel
***********************************************************************************
*************
Quien no ha visto esas animaciones que tienen algunas aplicaciones cuando inician o
terminan?
objeto = CREATEOBJECT("ANIMACIONES")
objeto.visible =.t.
READ EVENTS
ENDDEFINE
***********************************************************************************
*************
Esta API nos permite bajarnos un archivo cualquiera de Internet de una manera facil
sin complicarnos.
La URL que le pasemos, debe ir en formato Unicode, por eso se le pasa el parametro
12 al STRCONV.
DoFileDownload(STRCONV("http://guatemala.portalfox.com/PortalFoxGuate.gif",12))
***********************************************************************************
*************
Recientemente encontré un inconveniente trabajando con un form de nivel superior
que contenía una barra de herramientas. Si se quería cerrar el form desde la barra
de herramientas se colgaba el Fox. Con este método se soluciona el problema (Tips
Por Jorge Mota, y uso de funciones API por Pablo Almunia Sanz )
----------------------------------------------------
_screen.Tag=ThisForm.Caption
If Type("ThisForm.cToolbar")!="O"
ThisForm.cToolBar=CREATEOBJECT("MiToolBar",ThisForm)
ThisForm.cToolBar.Dock(0)
ThisForm.cToolBar.Show
Endif
----------------------------------------------------
Creamos ahora una nueva clase toolbar llamada "MiToolBar", con la propiedad
ShowWindow establecida en "1" (En Formulario de nivel superioor)
-----------------------------------------------
Parameters oForm
ThisForm.oFormRef=oForm
----------------------------------------------
--------------------------------------------------------
#DEFINE WM_CLOSE 16
DECLARE ;
INTEGER FindWindow ;
IN WIN32API ;
STRING cClassName, ;
STRING cWindName
DECLARE ;
Integer PostMessage ;
IN WIN32API ;
Integer nWnd, ;
Integer nMsg, ;
Integer nParam, ;
Integer nParam
nHwndNote = FindHwnd( ThisForm.oFormRef.Caption)
----------------------------------------------------------
------------------------------------------------------
PROCEDURE FindHwnd
LPARAMETER cTitle
RETURN aFindHwnd[nCont,2]
ENDIF
NEXT
RETURN 0
*** Constantes
#define GW_HWNDFIRST 0
#define GW_HWNDNEXT 2
#define GW_OWNER 4
#define GW_CHILD 5
PROCEDURE ATask
DECLARE ;
Integer GetWindow ;
IN WIN32API ;
Integer nHwnd, ;
Integer nCmd
DECLARE ;
Integer GetWindowText ;
IN WIN32API ;
Integer nHwnd, ;
String @cString, ;
Integer nMaxCount
DECLARE ;
Integer GetWindowTextLength ;
IN WIN32API ;
Integer nWnd
DECLARE ;
Integer IsWindowVisible ;
IN WIN32API ;
Integer nWnd
DECLARE ;
Integer GetDesktopWindow ;
IN WIN32API
PUBLIC (cMatriz)
nHwnd = GetDesktopWindow()
nCont = 0
DO WHILE nCurrWnd # 0
IF GetWindow(nCurrWnd, GW_OWNER) = 0
nLength=GetWindowTextLength(nCurrWnd)
IF nLength > 0
nCont = nCont + 1
DIMENSION &cMatriz.[nCont,2]
&cMatriz.[nCont,2] = nCurrWnd
ENDIF
ENDIF
ENDIF
RETURN nCont
----------------------------------------------------
***********************************************************************************
*************
Con esta API podemos bloquear la estación de trabajo.
LockWorkStation()
***********************************************************************************
*************
Esta API nos permite simular un "Crasheo" de nuestra aplicación.
Usarlo con cuidado, puede causar corrupción en datos, ya que se cierra abruptamente
***********************************************************************************
*************
Para saber si el usuario logueado actualmente tiene permisos admistrativos en la
pc.
?IsNTAdmin(0,0)
***********************************************************************************
*************
Cuantas veces hemos visto luego de instalar algún programa que Windows pregunta si
deseamos reiniciar para que los cambios surtan efecto? ¿o luego de instalar se nos
reinicia la PC, sin preguntar ?
Bueno, la forma de hacerlo es ...
SetupPromptReboot(0, _screen.hWnd, 0)
***********************************************************************************
*************
Con la introduccion del Active Directory en Windows 2000 se nos abre una puerta de
oportunidades como: validar usuario y contraseña contra el servidor de dominio, ver
el listado de los usuarios, crear usuarios...
DOMINIO = GETOBJECT("WinNT://atisa")
DIMENSION LISTADO[1]
DOMINIO.FILTER = LISTADO
FOR EACH ELEMENTO IN DOMINIO
IF UPPER(ELEMENTO.CLASS) = "USER" THEN
? ELEMENTO.NAME
ENDIF
NEXT
en la parte de
DOMINIO = GETOBJECT("WinNT://Dominio_O_MaquinaW2k")
En este ejemplo listamos los Usuarios, para listar los servicios basta con
reemplazar la linea
por
Este Codigo lo probe desde Windows 2000 Professional, y me logre conectar con exito
a un
***********************************************************************************
*************
Este efecto es muy comun en las aplicaciones hoy en dia tal, como MSN. que cuando
nos escriben un mensaje, parpadea el titulo de una ventana en la barra de tareas.
Desde VFP podemos hacerlo. La función que nos permite hacerlo la declaramos asi:
FlashWindow(application.hWnd,.t.)
FlashWindow(thisform.HWnd,.t.)
NOTA: FlashWindow solo hará que la ventana parpadee una sola vez, si queremos que
el parpadeo persista, deberemos colocar el código en un Timer, y en el evento
Activate del Form, desactivar el Timer, o que el Timer lo ejecute X veces.
El segundo parámetro nos permite decirle si queremos que parpadee si esta activada
o no. Al pasarle .T. la ventana parpadeara una sola vez, este o no activada, si le
pasamos .F. parpadeara solo si la ventana esta inactiva y quedara de otro color el
boton en la barra de tareas.
Este código esta en VFP 7. Si quieren ejecutarla desde VFP 6 deberan obtener el
handle de la ventana a la que le quieran aplicar el efecto. En PortalFox esta la
función para hacerlo. Creo que son estas APIs:
GetWindow
FindWindow
***********************************************************************************
*************
Este codigo nos muestra cada uno de los archivos que componen un proyecto. para
saber que tipo es el archivo, basta con consultar la tabla que esta al final.
_SCREEN.ADDPROPERTY('NUMERO',1)
LOCAL NUMERO, CADENA, CICLO, SELECCION
CLEAR
CADENA = ''
NUMERO = APPLICATION.PROJECTS.COUNT
SELECCION = 0
IF NUMERO = 0
WAIT WINDOW "NO HAY NINGUN PROJECTO ABIERTO"
RETURN
ENDIF
IF NUMERO > 1
OBJETO = CREATEOBJECT('FORM')
OBJETO.WINDOWTYPE = 1
OBJETO.AUTOCENTER = .T.
OBJETO.HEIGHT = 135
OBJETO.WIDTH = 380
OBJETO.CAPTION = 'Proyectos Activos'
OBJETO.ADDOBJECT('ETIQUETA','LABEL')
OBJETO.ADDOBJECT('COMBO1','COMBOBOX')
OBJETO.ADDOBJECT('aceptar','aceptar')
OBJETO.ETIQUETA.CAPTION = 'Por Favor Seleccione el Proyecto que desea
mostrar'
OBJETO.ETIQUETA.AUTOSIZE = .T.
OBJETO.COMBO1.WIDTH = OBJETO.WIDTH-15
OBJETO.COMBO1.TOP = 50
FOR CICLO = 1 TO NUMERO
OBJETO.COMBO1.ADDITEM(ALLTRIM(APPLICATION.PROJECTS(CICLO).NAME),CICLO)
ENDFOR
OBJETO.SETALL('visible',.T.)
OBJETO.COMBO1.VALUE = 1
OBJETO.SHOW
SELECCION = _SCREEN.NUMERO
ENDIF
WITH APPLICATION.PROJECTS(SELECCION)
? "NOMBRE DEL PROYECTO: " + .NAME
CANTIDAD = .FILES.COUNT
FOR CICLO = 1 TO CANTIDAD
? 'Tipo: ' + ALLTRIM(.FILES(CICLO).TYPE) + ' Nombre: ' +
ALLTRIM(.FILES(CICLO).NAME)
IF INT(ciclo/30) =(ciclo/30)
WAIT WINDOW 'PRESIONE UNA TECLA PARA CONTINUAR'
ENDIF
ENDFOR
ENDWITH
PROCEDURE CLICK
_SCREEN.NUMERO =THIS.PARENT.COMBO1.VALUE
THISFORM.RELEASE
ENDPROC
ENDDEFINE
***********************************************************************************
*************
Este codigo nos muestra el caption de cada uno de los forms que actualmente esten
abiertos, se puede usar para ver si lo queremos cerrar o no, dependiendo del
caption del form.
Espero os sirva...
***********************************************************************************
*************
Dos formas de abrir archivos de Word desde Visual FoxPro.
lcFile = GETFILE("DOC")
loShell = CREATEOBJECT("Shell.Application")
loShell.ShellExecute(lcFile)
RELEASE loShell
2. Mediante Automation
lcFile = GETFILE("DOC")
loWord = CREATEOBJECT("Word.Application")
loWord.Documents.Open(lcFile)
loWord.Application.Visible = .T.
RELEASE loWord
***********************************************************************************
*************
Con esta sencilla utilidad, podrán subir sus archivos a su sitio WEB desde Foxpro
vía FTP
**
** Como subir archivoS a un sitio via FTP con VFP.
**
= InternetCloseHandle (hFtpSession)
= InternetCloseHandle (hOpen)
ENDIF
**--------------------------------------------
** Establecemos la conexión
**--------------------------------------------
FUNCTION connect2ftp (strHost, strUser, strPwd)
** Abrimos el acceso.
hOpen = InternetOpen ("vfp", 1, 0, 0, 0)
IF hOpen = 0
? "No tiene acceso a WinInet.Dll"
RETURN .F.
ENDIF
** Conectando al FTP.
hFtpSession = InternetConnect (hOpen, strHost, 0, strUser, strPwd, 1, 0, 0)
IF hFtpSession = 0
** Cerrando acceso y saliendo.
= InternetCloseHandle (hOpen)
? "FTP " + strHost + " no está disponible"
RETURN .F.
ELSE
? "Conectado a " + strHost + " como: [" + strUser + ", *****]"
ENDIF
RETURN .T.
**--------------------------------------------
** Copia del/los archivos
**--------------------------------------------
FUNCTION local2ftp (hConnect, lcSource, lcTarget)
** Copiando el archivo local al directorio remoto ftp.
hSource = FOPEN (lcSource)
IF (hSource = -1)
RETURN -1
ENDIF
= InternetCloseHandle (hTarget)
= FCLOSE (hSource)
RETURN lnBytesWritten
***********************************************************************************
*************
Ante algunas consultas sobre la forma de conectarse y acceder a SQL Server
utilizando ADO, acá va un ejemplo básico de su uso...
* EjemploADO.prg
* Algunos ejemplos de uso de ADO desde VFP
* Jose M. Marcenaro - 2001/11/12
* -------------------------------------------
* abro la conexion
loConn = CREATEOBJECT("ADODB.Connection")
loConn.CursorLocation= 3 && adUseClient
loConn.OPEN(lcConnString)
RETURN
********************************************************
PROCEDURE MostrarRecordset( loRs AS ADODB.Recordset)
ENDPROC
***********************************************************************************
*************
Una opción para obtener las constantes de Microsoft Office y generar en archivo de
encabezado (.h)
****************START CODE****************
PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.SHOW
RETURN
****************FORM CODE****************
DEFINE CLASS form1 AS FORM
HEIGHT = 445
WIDTH = 567
DOCREATE = .T.
AUTOCENTER = .T.
BORDERSTYLE = 1
CAPTION = ".OLB Constants Extractor"
MAXBUTTON = .F.
MINBUTTON = .F.
NAME = "Form1"
PROCEDURE cmdsave.CLICK
STRTOFILE(THISFORM.edtconstants.VALUE,PUTFILE([Header File], ;
JUSTSTEM(THISFORM.txtolbfile.VALUE) + [.h],[.h]))
ENDPROC
PROCEDURE cmdquit.CLICK
THISFORM.RELEASE
ENDPROC
PROCEDURE cmdgetfile.CLICK
LOCAL lcOLBFile
THISFORM.txtolbfile.VALUE = lcOLBFile
THISFORM.cmdextract.ENABLED= .T.
ENDPROC
PROCEDURE cmdextract.CLICK
WAIT WINDOW [Processing...] NOCLEAR NOWAIT
LOCAL oTLB_INFO, oConstants, lcConstantsStr, Obj, member
#DEFINE CRLF CHR(13) + CHR(10)
oTLB_INFO = CREATEOBJECT([tli.typelibinfo])
oTLB_INFO.ContainingFile = (THISFORM.txtolbfile.VALUE)
oConstants = oTLB_INFO.Constants
lcConstantsStr = []
FOR EACH Obj IN oTLB_INFO.Constants
lcConstantsStr = lcConstantsStr + CRLF + "* " + Obj.NAME + CRLF
FOR EACH member IN Obj.Members
lcConstantsStr = lcConstantsStr + [#DEFINE ] + ;
member.NAME + [ ] + ;
TRANSFORM(member.VALUE) + CRLF
NEXT member
NEXT Obj
THISFORM.edtconstants.VALUE=lcConstantsStr
THISFORM.cmdsave.ENABLED= .T.
WAIT CLEAR
WAIT WINDOW [Complete!] TIMEOUT 2
ENDPROC
ENDDEFINE
****************END CODE****************
***********************************************************************************
*************
Con el siguiente código podemos verificar la ortografía de cualquier texto en VFP
usando el corrector ortográfico de MS Word.
Para probarlo, solo hay que pegar el código en un nuevo .PRG y ejecutarlo desde
VFP.
oform1=CREATEOBJECT("form1")
oform1.SHOW
RETURN
**************************************
*
DEFINE CLASS form1 AS FORM
HEIGHT = 250
WIDTH = 375
SHOWWINDOW = 2
AUTOCENTER = .T.
BORDERSTYLE = 2
CAPTION = "VFP/Word Spell Checking"
MAXBUTTON = .F.
NAME = "Form1"
PROCEDURE findword
*~~~~~~~~~~~~~~~~~~~~~
* PROCEDURE FindWord
*
* AUTHOR: Trevor Hancock, , Microsoft Corporation
* CREATED : 08/22/00 11:50:32 AM
*
* ABSTRACT: Locates an installation of MS Word using the FindExecutable API
* Creates a file with a .doc extension, checks the association on
that
* file using FindExecutable, then deletes the file. FindExecutable
returns
* the full, null terminated path to the application associated with
* .doc files (in this case).
* ACCEPTS: Nothing
* RETURNS: Full path to the application associated with .doc files on this
machine.
*~~~~~~~~~~~~~~~~~~~~~
lcPath = SPACE(0)
lcResult = SPACE(128)
llRetVal = .F.
*!* Determine the DIR this form is running from. JUSTPATH() and ADDBS()
*!* could be used here instead (if using VFP6), but this code will work
*!* in any VFP version.
lcCurDir = SUBSTR(SYS(16,0),ATC([ ],SYS(16,0),2)+1)
lcCurDir = SUBSTR(lcCurDir,1,RAT([],lcCurDir))
lcFileName = lcCurDir + SYS(3) + [.doc]
PROCEDURE DESTROY
IF TYPE([goWord]) = [O]
IF TYPE([goWordDoc]) = [O]
goWordDoc.SAVED = .T.
goWordDoc.CLOSE
ENDIF
goWord.QUIT
ENDIF
RELEASE goWord, goWordDoc
ENDPROC
PROCEDURE INIT
*--- English
* THIS.edtTextToCheck.VALUE = "Thhis text has mistakees in it. We will seend "
+ ;
* "it to Word and have it cheked."
*-- Español
THIS.edtTextToCheck.VALUE = "Ezte tecto esta escrito kon herrores ppara " + ;
"que Word lo chequee."
ENDPROC
PROCEDURE cmdcheckspelling.CLICK
*~~~~~~~~~~~~~~~~~~~~~
* PROCEDURE cmdcheckspelling.CheckSpelling
*
* AUTHOR: Trevor Hancock, Microsoft Corporation
* CREATED : 08/22/00 12:03:46 PM
*
* ABSTRACT: Automates MS Word to check the spelling of text in
* THISFORM.edtTextToCheck
* ACCEPTS: Nothing
* RETURNS: Nothing
*~~~~~~~~~~~~~~~~~~~~~
IF TYPE([goWord]) # [O] && Check if you have already instantiated Word
IF !THISFORM.FindWord() && You don't have Word up, so let's locate it.
MESSAGEBOX([Microsoft Word is either not installed or is incorrectly
registered.], + ;
0,[Word Start-Up Failed])
RETURN .F.
ENDIF
*!* Change the mouse pointer for all form controls to indicate processing
(opening Word)
WITH THISFORM
.cmdCheckSpelling.MOUSEPOINTER = 11
.edtTextToCheck.MOUSEPOINTER = 11
.MOUSEPOINTER = 11
ENDWITH
PUBLIC goWord, goWordDoc && Public vars for Word and Document1 in Word.
goWord = CREATEOBJECT([WORD.APPLICATION]) && Create Word
WITH goWord
.WINDOWSTATE= 0 && wdWindowStateNormal (needs to be Normal before you can
move it)
.MOVE(1000,1000) && Move the window out of view
goWordDoc = .Documents.ADD
ENDWITH
ENDIF
WITH goWordDoc
.Content.TEXT = ALLTRIM(THISFORM.edtTextToCheck.VALUE)
.ACTIVATE
IF .SpellingErrors.COUNT > 0
.CHECKSPELLING
ELSE
=MESSAGEBOX([Spell check complete. No errors found],0,[Spell Check])
ENDIF
*!* For some reason, Word likes to make itself visible here. Keep it
hidden...
goWord.VISIBLE = .F.
THISFORM.edtTextToCheck.VALUE = .Content.TEXT
ENDWITH
ENDPROC
ENDDEFINE
*
**********************************
*!*********** END CODE ***********
***********************************************************************************
*************
API Este ejemplo es muy util para las instalaciones.
DECLARE LONG CopyFile IN "kernel32" ;
STRING lpExistingFileName,;
STRING lpNewFileName,;
LONG bFailIfExists,;
strSource = "C:/windows/escritorio/archivo1.txt"
strTarget = "d:/sistemas/archivo1.txt"
lngRetVal = CopyFile(ALLTRIM(strSource), ALLTRIM(strTarget), .F.)
IF lngRetVal=1
MESSAGEBOX ("Archivo copiado!" )
ELSE
MESSAGEBOX ("Error- Archivo No Copiado!" )
ENDIF
IF lngRetVal=1
MESSAGEBOX ("Archivo Movido!" )
ELSE
MESSAGEBOX ("Error- Archivo No Movido!" )
ENDIF
***********************************************************************************
*************
* SELECIONA o registro de controle 9 e o registro de MAIOR NUMERO de controle antes
do 9 e o de meno numero apos o 9
SELECT * from EVENTO ;
WHERE EVENTO.controle = 9 OR ;
controle IN( SELECT MAX(controle) FROM EVENTO WHERE controle < 9) OR ;
controle IN( SELECT MIN(controle) FROM EVENTO WHERE controle > 9 )
***********************************************************************************
*************
Marca directamente el telefono indicado usando el dialer de WINDOWS.
Numero = "475-730"
NombreProg = "c:/windows/dialer.exe"
Quien = "Orlando"
ValDev = tapiRequestMakeCall(Numero, NombreProg, Quien ,"hola ?")
***********************************************************************************
*************
API Ejecuta cualquier archivo .EXE mediante API
STRING cCmdLine, ;
INTEGER nCmdShow
=WinExec( FILE, 1 )
***********************************************************************************
*************
Excelente cuando no quieres inscrustar objetos en formularios.
comillas = CHR(34)
respuesta = SPACE(250)
***********************************************************************************
*************
La función GETCOLOR() nos retorna el número del color seleccionado. Podemos
convertir ese "número" a un formato válido para páginas HTML.
La función _Col2HTML() recibe como parámetro un valor númerico (este valor numérico
lo obtenemos de la funciónGETCOLOR() de VFP) y lo convierte a un formato válido
para poder usar en una página HTML.
Ejemplo:
? _Col2HTML(GETCOLOR())
? _Col2HTML(12632256)
*------------------------------------------------
FUNCTION _Col2HTML(tnColor)
*------------------------------------------------
* USO: _Col2HTML(12632256)
*------------------------------------------------
LOCAL lcHTML, ln
lcHTML = "#"
FOR ln = 1 TO 3
tnColor = INT(tnColor/256)
ENDFOR
RETURN lcHTML
ENDFUNC
***********************************************************************************
*************
Este ejemplo es muy util para los usuarios newbies.
SPI_SETSCREENSAVETIMEOUT = 15
SPIF_UPDATEINIFILE = 1
SPIF_SENDWININICHANGE = 2
minutos = 5
lSeconds = minutos * 60
***********************************************************************************
*************
APAGAR Y ENCENDER EL MONITOR
*-- Este ejemplo lo puse como esta para que sigas trabajando,
*-- ya que realmente si le quitas la energia al monitor no
*-- podras prenderlo con el swicht.
WM_SYSCOMMAND = 274
SC_MONITORPOWER = -3728
***********************************************************************************
*************
Dataenvironment.Init
Dataenvironment.OpenTables If the AutoOpenTables property is set to .T.
Dataenvironment.BeforeOpenTables If the AutoOpenTables property is set to .T.
Form.Load
Controls are created
Form.Init
***********************************************************************************
*************
Um truque para que cada vez que um textBox receber o foco o cursor
e posicionado no final do texto
Un truco para que cada vez que un TextBox recibe el foco, el cursor se ubique al
This.SelStart = LEN(RTRIM(This.Value))
***********************************************************************************
*************
API Este ejemplo es muy util en ciertas ocasiones.
SW_HIDE = 0
SW_NORMAL = 1
SW_SHOWMINIMIZED = 2
SW_SHOWMAXIMIZED = 3
SW_SHOWNOACTIVATE = 4
SW_SHOW = 5
SW_MINIMIZE = 6
SW_SHOWMINNOACTIVE = 7
SW_SHOWNA = 8
SW_RESTORE = 9
SW_SHOWDEFAULT = 10
***********************************************************************************
*************
>Tenho um botão onde o usuário clica e o sistema apresenta a tela GetColor.
>Alí o usuário escolhe a cor, o sistema pega a cor escolhida e abre o FRX
>para atribuir a cor escolhida aos campos que dão cor aos textos que serão
impressos.
>
>O problema é que GetColor retorna um número como: 16744576, por exemplo,
>e, no FRX, tenho os campos PENRED, PENGREEN, PENBLU - como posso
>distribuir o número retornado por GetColor aos campos no FRX ?
m.lnColor = GETCOLOR()
m.lnRed = BITAND( m.lnColor,0xFF)
m.lnGreen = BITAND(BITRSHIFT(m.lncolor,8),0xFF)
m.lnBlue = BITRSHIFT(m.lncolor,16)
***********************************************************************************
*************
Percorrer uma planilha Excel com o VFP e ver o conteudo de todas sus celulas.
WITH loExcel.APPLICATION
.VISIBLE = .F.
ENDFOR
ENDWITH
RELEASE loExcel
*__ Ao percorrer podemos alterar valores das celulas,se fizermos isto antes de
fechar a planilha
*__ devemos salvar as akteracoes utilisando:
loExcel.APPLICATION.activeworkbook.SAVE
***********************************************************************************
*************
Necesario cuando el usuario bloquea el teclado numerico y llaman que no funciona
el teclado.
A = GetKeyState(KEY)
IF A = 1
? "Bloq Mayus Encendido"
ENDIF
IF A = 0
? "Bloq Mayus Apagado"
ENDIF
***********************************************************************************
*************
Esta rutina es util para saber si existe una etiqueta de indice en un archivo CDX.
? SeekTag('etiqueta')
********************
Function SeekTag(TagBuscado)
For nCount = 1 To 254
If Tag(nCount) = Upper(tagbuscado)
Return .t.
Exit
EndIf
Return .f.
EndFor
EndFunc
***********************************************************************************
*************
Muchos colegas me han preguntado sobre como hacer la degradación de colores sobre
VFP.
Así que aqui espongo, tanto el codigo para hacerlo en VFP como en VB.
Local i,color1, R, G, B
With Thisform
.scalemode = 3 &&pixeles
.drawstyle = 0 && sólido
.drawwidth = 2
R=0
G=255
B=0
FOR i = 1 to 255
*-- Disminuimos valor de colores
If r > 0 then
r = r - 1
endif
IF g > 0 then
g = g - 1
endif
IF b > 0 Then
b = b - 1
endif
color1 = RGB(R,G,B)
*Establesco el color
.forecolor=Color1
Option Explicit
F.ScaleMode = vbPixels
F.DrawStyle = vbInsideSolid
F.DrawWidth = 2
F.AutoRedraw = True
For i = 1 To 255
' Disminuimos valor de colores
If r > 0 Then r = r - 1
If g > 0 Then g = g - 1
If b > 0 Then b = b - 1
color = RGB(r, g, b)
***********************************************************************************
*************
¿Cómo saber si el equipo está conectado a Internet?, una simple llamada a esta
función puede resolverlo.
? IsInternetActive()
***********************************
Function IsInterNetActive (tcURL)
***********************************
* PARAMETERS: URL, no olvidar pasar la URL completa, con http:// al inicio
* Retorna .T. si hay una conexion a internet activa
*Tekno
*Wireless Toyz
*Ypsilanti, Michigan
***********************************
tcURL = IIF(TYPE("tcURL")="C" AND !EMPTY(tcURL),tcURL,"http://www.yahoo.com")
RETURN ( InternetCheckConnection(tcURL, 1, 0) == 1)
ENDFUNC
***********************************
***********************************************************************************
*************
Solucion OOP del problema de la ventana Preview Maximizada.
oForm = CREATEOBJECT("Form")
WITH oForm
.Caption = "Tu Titulo del Preview"
.WindowState = 2 && Maximized
.Show()
***********************************************************************************
*************
Excelente cuando distribuimos aplicaciones.
liRet = DLLSelfRegister(NombreDll)
IF liRet = 0 Then
SelfRegisterDLL = .T.
MESSAGEBOX ("Registrado ocx")
ELSE
SelfRegisterDLL = .F.
MESSAGEBOX ("Error- No Registrado ocx")
ENDIF
***********************************************************************************
*************
FOR i = 1 TO THISFORM.Grid1.COLUMNCOUNT
WITH THISFORM.Grid1.COLUMNS(i)
cFontName = .FONTNAME
cFontSize = .FONTSIZE
cFontBold = IIF( .FONTBOLD, "B", "" )
cCont = TRAN(EVAL(.CONTROLSOURCE))
nLenC = LENC( TRAN(EVAL(.CONTROLSOURCE)) )
nFont = FONTMETRIC(6, cFontName, cFontSize, cFontBold )
NEXT
***********************************************************************************
*************
Util cuando no queramos que el protector se active cuando estamos programando.
SPI_SETSCREENSAVEACTIVE = 17
SPIF_SENDWININICHANGE = 2
***********************************************************************************
*************
Determinar si estas conectado a Internet
#Define FORCE_CONNECTION 1
If InternetCheckConnection("http://www.hotmail.com", FORCE_CONNECTION, 0) != 0
Msg = "Estas Conectado a Internet"
Else
Msg = "Lo siento, no estas Conectado a Internet"
EndIf
=MessageBox(msg)
***********************************************************************************
*************
--------------------------------------------------------------------------------
Puede colocarle cualquier tipo de letra a los menús y tamaño. Los estilos que
podemos aplicar son los siguientes
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
***********************************************************************************
*************
Como autoregistrar OCX y DLLs.
------------------------------------------
DECLARE LONG DllRegisterServer IN [archivo.ocx]
IF DllRegisterServer() = 0
* OK
ELSE
* Not OK
ENDIF
Este método también puede ser usado con archivos COM DLL.
***********************************************************************************
*************
Existe una forma sencilla de invocar cuadros de dialogo de Windows, tales como:
Guardar, Abrir, Fuentes, Color, Impresoras, Ayuda.
***********************************************************************************
*************
Olá!
Tente utilizar:
Fiz testes no VFP6 e funciona, não sei lhe dizer se no VFP7 vai funcionar.
Até mais.
Erick
Força Sempre!
***********************************************************************************
*************
Util cuando quiere instalar fuentes sin abrir ventanas.
filename = GETFILE('ttf')
resultado = AddFontResource(FileName) # 0
*resultado = RemoveFontResource(FileName) # 0
? resultado
***********************************************************************************
*************
Cuando necesitemos saber que usuarios estan conectados a una base de datos de MS
SQL Server 2000 podemos usar este procedmiento almacenado.
INSERT tbl_usuarios_conectados
exec sp_who
***********************************************************************************
*************
*-- Ejemplos
? AplicAsoc("XLS")
? AplicAsoc("ZIP")
? AplicAsoc("DOC")
? AplicAsoc("JPG")
? AplicAsoc("PRG")
? AplicAsoc("DBF")
? AplicAsoc("HTML")
*------------------------------------------------
* FUNCTION AplicAsoc(tcExt)
*------------------------------------------------
* Retorna la ruta y nombre completo de la
* aplicación asociada a al extensión del
* archivo pasado como parámetro
*------------------------------------------------
FUNCTION AplicAsoc(tcExt)
LOCAL lcArc, lcApp, ln, ll, lc
DECLARE LONG FindExecutable ;
IN SHELL32.DLL ;
STRING lpfile, ;
STRING lpdirectory, ;
STRING lpresult
lcArc = FORCEEXT(SYS(5)+CURDIR()+SYS(2015),tcExt)
ln = FCREATE(lcArc)
ll = FCLOSE(ln)
lc = SPACE(255)
lcApp = ""
IF FindExecutable(lcArc,"",@lc) >= 32
lcApp = SUBSTR(lc,1,AT(CHR(0),lc)-1)
ENDIF
IF FILE(lcArc)
DELETE FILE (lcArc)
ENDIF
RETURN lcApp
ENDFUNC
*------------------------------------------------
***********************************************************************************
*************
PUBLIC oApp
oApp = CREATEOBJECT("Aplica")
2. Creas una clase aplicación, que es una clase de tipo "Custom" llamada aplica y
la guardas en un contenedor de clases
3. Debes crear varias propiedades de las cuales van a contener los valores fijos
que se van a selecionar:
This.Contador = 0
This.Ruta = "aplicabases"
This.Nombre = "Sistema Administrativo"
This.diraiz = "C:aplica"
This.dbn = "sistema.dbc"
This.user = 1
This.userNombre = "Ing. Noe A. --- Programando ---"
This.Empresa = 1
This.Logo = "c:aplicadibustecnog.jpg"
This.nombreempresa = "EMPRESA DE PROGRAMACION"
This.dir = "Direccion"
This.pob = "Poblacion"
This.codigo = "C.P."
This.rfc = "SU RFC"
This.telefono = "SU TELEFONO"
This.Fax = "SU FAX"
empresa1-etc.-ruta1
empresa2-etc.-ruta2
Una por cada cursor que contenga el entorno de datos, en este ejemplo contiene 8.
Si no estuviera este código nos daría como resultado que la información que procese
tu aplicación sería la de la base de datos por default asignada en tiempo de
programación.
Gracias...
***********************************************************************************
*************
Minimizar todas las ventanas activas. Un buen ejemplo para simular las pulsaciones
delas teclas 'Windows + M'.
DECLARE LONG keybd_event IN "user32" INTEGER bVk, INTEGER bScan, LONG dwFlags, LONG
dwExtraInfo
KEYEVENTF_KEYUP = 2
VK_LWIN = 91
=keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)
*SQL*******************************************************************************
****************
Select a.id_cliente,a.nombre
From tbl_clientes a
where a.id_cliente= case when @id_cliente='Todos' then
a.id_cliente else @id_cliente end
-- En esta parte es donde usamos el case dentro
del where para hacer la comparacion de datos,
si deseamos todos los clientes, unicamente
debemos compararlo con el codigo dentro de la
misma tabla, de lo contrario lo comparamos con
el valor de la variable o parametro que utilizemos.
***********************************************************************************
*************
disco=GetDriveType("H:")
? disco
***********************************************************************************
*************
Una de las funciones más robustas e importantes que han sido agregadas a VFP 7 es
Execscript. En VFP 6 se puede utilizar Compile (service Pack 3 creo). Permite
compilar código desde campos memos, texto, etc y compilarlo.
***********************************************************************************
*************
[API] Cambiar el papel tapiz del escritorio, para personalizar una aplicacion
cuando la instalamos.
filename = GETFILE('bmp')
=SystemParametersInfo(20, 0, filename, 1)
***********************************************************************************
*************
Usted puede poner este código dondequiera en su programa, con tal que se ejecute
antes de que usted cree el mensaje del email. (nota que ShellExecute es sensible a
las mayusculas)
¿Qué hace?
La belleza de esto es que usted no tiene que saber qué programa se coloca para
abrir un tipo específico del documento en el sistema del usuario. Si el usuario
posee Word, el código antedicho lanzaría Wordpad en lugar de otro, como éste puede
también procesar archivos del rtf. Por supuesto, si el usuario no tuviera ningún
programa asociado con RTFs, el comando fallaría.
Otra posibilidad:
Esto lanzará el web browser del defecto del usuario y navegará al sitio
especificado.
Así pues, de nuevo a nuestro requisito original. Crear un mensaje del email, todo
lo que usted tiene que hacer es ShellExecute al link del mailto. Más simple, el
link sería algo como esto:
mailto:john@mycompany.com
El código siguiente abrirá una ventana que compone del mensaje en el cliente del
correo del defecto del usuario, con en la línea completada ya:
lcMail = " mailto:john@mycompany.com " ShellExecute(0, " open ", lcMail, "", "",1)
Yendo más lejos, usted puede especificar los parámetros siguientes al acoplamiento
del mailto:
Cc = Copia a carbón
Subject = Encabezado
lcMail = "mailto:john@mycompany.com"+ ;
Esto producirá la ventana que compone del mensaje demostrada en el cuadro 1. Como
usted puede ver, a, se completan
los cc y las líneas sujetas ya, al igual que el texto del mensaje. Todo que el
usuario tiene que hacer debe es
hacer click en el botón del enviar.
Limitaciones:
Por otra parte, si todos lo que usted necesita es una manera simple de ayudar al
usuario a componer y a enviar un
mensaje sin formato sin los accesorios, la técnica trabajará extremadamente bien.
Usted podría utilizarla, por
ejemplo, para crear un mensaje que confirma una orden o uno que persigue a cliente
para el pago. Es especialmente útil
si usted desea deja a usuario corregir el texto antes de hacer click en el botón de
enviar.
© Mike Lewis Consultants Ltd. Sientase libre para dar copias de este artículo a sus
colegas, pero no
quitar por favor este aviso y negación de copyright. La información dada aquí se
cree
para estar correcta, pero no se acepta ninguna responsabilidad legal por su uso.
*************************************************************************
[Varios] Como hacer que VFP retorne automáticamente a primer plano después de un
proceso largo
SYSTEMMODAL = 4096
TASKMODAL = 8192
*-- Ejemplo:
INKEY(10)
* Ejemplo:
ShellWait("C:WINNTNOTEPAD.EXE", " C:ARCHIVO.TXT")
* Notar el espacio al comienzo del parametro
* defines
#DEFINE STARTF_USESHOWWINDOW 1
#DEFINE SW_SHOWMAXIMIZED 3
#DEFINE m0 256
#DEFINE m1 65536
#DEFINE m2 16777216
***
* Function ShellWait
***
STRING lpApplicationName, ;
STRING lpCommandLine, ;
INTEGER lpProcessAttributes, ;
INTEGER lpThreadAttributes, ;
INTEGER bInheritHandles, ;
INTEGER dwCreationFlags, ;
INTEGER @lpEnvironment, ;
STRING lpCurrentDirectory, ;
STRING lpStartupInfo, ;
STRING @lpProcessInformation
INTEGER hHandle,;
INTEGER dwMilliseconds
INTEGER hObject
* Incializar estructuras
cStartupInfo = num2dword(68) + ;
num2dword(STARTF_USESHOWWINDOW) + ;
num2word(SW_SHOWMAXIMIZED) + ;
num2word(0) + num2dword(0) + ;
* Ejecutar comando
cStartupInfo, @cProcInfo) == 0
* Posibles errores
* 87 = ERROR_INVALID_PARAMETER
ELSE
WaitForSingleObject(nProcess, -1)
CloseHandle(nProcess)
ENDIF
ENDFUNC
***
* Function num2dword
***
FUNCTION num2dword(nValue)
b3 = INT(nValue/m2)
b2 = INT((nValue - b3 * m2)/m1)
b0 = MOD(nValue, m0)
ENDFUNC
***
* Function num2word
***
FUNCTION num2word(nValue)
ENDFUNC
***
* Function buf2dword
***
FUNCTION buf2dword(cBuffer)
RETURN(ASC(SUBSTR(cBuffer, 1, 1)) + ;
ENDFUNC
***********************************************************************************
*****
oShell = CREATEOBJECT("Shell.Application")
oShell.open(16) && ESCRITORIO
oShell.open(14) && MIS VIDEOS
oShell.open(11) && MIS MUSICA
oShell.open(10) && CAPETRA DE MENU INICIO
oShell.open(9) && ENVIAR A
oShell.open(8) && RECIENTE
oShell.open(6) && FAVORITOS
oShell.open(5) && MIS DOCUMENTOS
oShell.open(4) && IMPRESORAS
oShell.open(3) && PANEL DE CONTROL
oShell.open(2) && PROGRAMAS
oShell.open(1) && INTERNET EXPLORER
oShell.open(17) && MI PC
oShell.open(18) && MIS SITIOS DE RED
oShell.open(19) && ENTORNO DE RED
oShell.open(20) && FUENTES
***********************************************************************************
******
Un ejemplo como podemos crear tablas en Word con datos de tablas de VFP, a través
de Automatización.
USE employee
lcTemp = SYS(2015)+'.txt'
lnFields = 2
_ClipText = chrtran(FileToStr(lcTemp),'"','')
erase (lcTemp)
#define wdSeparateByCommas 2
WITH oWordDocument
.documents.add
WITH .ActiveDocument
.Range.Paste
.Range.ConvertToTable(wdSeparateByCommas,,lnFields)
ENDWITH
.visible = .t.
.Activate
ENDWITH
***********************************************************************************
***********
Uno de los temas más solicitados a mi correo son los gráficos; este es un BUEN
ejemplo de como hacerlo, y además agregándole un gran efecto.
objXL = CreateObject("Excel.Application")
objXL.Workbooks.Add
objXL.Cells(1,1).Value = 50
objXL.Cells(1,2).Value = 10
objXL.Cells(1,3).Value = 15
objXL.Range("A1:C1").Select
objXLchart = objXL.Charts.Add()
objXL.Visible = .t.
objXLchart.Type = -4100