You are on page 1of 166

VerifyScreenSavePwd

Muestra el cuadro de dilogo para comprobar el password del


protector de pantalla actual de Window
Declare integer VerifyScreenSavePwd in "password.cpl" Long hwnd
= VerifyScreenSavePwd(thisform.hwnd)
If Ret = 1 Then
=MessageBox "Password correcto o este ScreenSaver no tiene asociado Password "
Else
=MessageBox "Password Incorrecto"
EndIf


----------------------------------------------------------------------
InternetDial, InternetAutoDial, InternetAutodialHangup
Permite conectarse a Internet utilizando la conexin existente
u otra. Muy Buena
#DEFINE INTERNET_AUTODIAL_FORCE_ONLINE 1
#DEFINE INTERNET_AUTODIAL_FORCE_UNATTENDED 2
DECLARE INTEGER InternetDial IN wininet.dll;
INTEGER hwndParent, STRING @ lpszConnectoid, ;
INTEGER dwFlags, INTEGER @ lpdwConnection, ;
INTEGER dwReserved
DECLARE INTEGER InternetAutodial IN wininet.dll;
INTEGER dwFlags, INTEGER hwndParent
DECLARE INTEGER InternetAutodialHangup IN wininet.dll;
INTEGER dwReserved
* Conecta con una conexin determinada
strConnection = "Internet"
nConnection = 0
*= InternetDial(0, strConnection, INTERNET_AUTODIAL_FORCE_UNATTENDED, ;
* nConnection, 0)
* Conecta con la conexin por defecto
= InternetAutodial(INTERNET_AUTODIAL_FORCE_ONLINE, 0)
* Conecta mostrando el cuadro de conexin
*= InternetAutodial(INTERNET_AUTODIAL_FORCE_UNATTENDED, 0)
* Disconecta
*= InternetAutodialHangup(0)


-----------------------------------------------------------------
TextOut y GetWindowDC
A travs de estas funciones podemos imprimir texto en cualquier
posicin de la pantalla, y con caractersticas diferentes a la
usualmente usadas.
DECLARE INTEGER GetActiveWindow IN user32
DECLARE INTEGER GetWindowDC IN user32 INTEGER hwnd
DECLARE INTEGER TextOut IN gdi32;
INTEGER hdc, INTEGER x, INTEGER y,;
STRING lpString, INTEGER nCount
lcText = "La Web de Davphantom"
hwnd = GetActiveWindow()
hdc = GetWindowDC (hwnd)
= TextOut (hdc, 50, 100, lcText, Len(lcText))


-------------------------------------------------------------------
GetDeviceCaps, GetDC, GetDesktopWindow
Obtener los Bits por Pixel mostrados actualmente en la
configuracin de Windows. Este es el dato que aparece en la
configuracin de la pantalla de Window
LOCAL nBitsPixel, hSrcDC, hWnd
DECLARE Integer GetDesktopWindow in User32
DECLARE Integer GetDC in User32 Integer
DECLARE Integer GetDeviceCaps in Gdi32 Integer, Integer
DECLARE Integer ReleaseDC in User32 Integer, Integer
hWnd = GetDesktopWindow ()
hSrcDC = GetDC (hWnd)
nBitsPixel = GetDeviceCaps (hSrcDC, 12)
ReleaseDC (hWnd, hSrcDC)
? nBitsPixel


-----------------------------------------------------------
FindExecutable
Devuelve la ruta del programa ejecutable asociado a una
determinada extensin
LOCAL lcRetVal, lcFileExt, lcFileName, lnFileHandle,;lcDirectory, lcResBuff
STORE "" TO lcRetVal, lcFileExt, lcFileName, lcDirectory
tcExt = "SCX" && Extensin a buscar
lcFileExt = UPPER( ALLTRIM( tcExt ))
* Intenta crear un archivo con la extensin pasada
lcFileName = "dav." + lcFileExt
lnFileHandle = FCREATE( lcFileName )
IF lnFileHandle < 1
* No puede crear el archivo
ERROR "No es posible crear el archivo temporal" ;
+ CHR(13) + "Este es necesario para poder continuar"
RETURN lcRetVal
ENDIF
FCLOSE( lnFileHandle )
lcResBuff = SPACE(128)
DECLARE INTEGER FindExecutable IN SHELL32 ;
STRING @cFileName, ;
STRING @cDirectory, ;
STRING @cBuffer
* llama a la funcin Findexecutable
lnRetVal = FindExecutable( @lcFileName, @lcDirectory, @lcResBuff)
lcMsgTxt = ""
* Determina el valor retornado por la funcin
DO CASE
CASE lnRetVal = 0
lcMsgTxt = "insuficientes recursos"
CASE lnRetVal = 2
lcMsgTxt = "Archivo especificado no se encuentra"
CASE lnRetVal = 3
lcMsgTxt = "Ruta especificada no se encuentra"
CASE lnRetVal = 11
lcMsgTxt = "Invalido formato del EXE"
CASE lnRetVal = 31
lcMsgTxt = "No esta asociada a ningun archivo la extensin " + lcFileExt
OTHERWISE
* Obtiene la ruta y exe asociado a la extensin
lcRetVal = LEFT(lcResBuff, AT(CHR(0), lcResBuff) - 1)
ENDCASE
* Borra el archivo creado
DELETE FILE (lcFileName)
IF ! EMPTY( lcMsgTxt )
MESSAGEBOX( lcMsgTxt, 16, "Fallo la bsqueda" )
ENDIF
? lcRetVal


----------------------------------------------------------------
CreateDirectory, RemoveDirectory
Permiten realizar acciones sobre directorios
API para Crear Directorio

DECLARE INTEGER CreateDirectory IN WIN32API ;
STRING cNewDir, ;
STRING cAttrib
tcDirName = "c:\dav"
lnSuccess = CreateDirectory ( tcDirName, "")
lcRetVal = IIF( lnSuccess = 1, "Creado", "Fallo" )
Api para Eliminar Directorio
DECLARE INTEGER RemoveDirectory IN WIN32API ;
STRING cKillDir
tcDirName ="c:\dav"

lnSuccess = RemoveDirectory( tcDirName)
lcRetVal = IIF( lnSuccess = 1, "Removed", "Failed" )


------------------------------------------------
GetWindowsDirectory
Devuelve la ruta del directorio donde instalado Windows
DECLARE INTEGER GetWindowsDirectory IN Win32API ;
STRING @cBuffer, ;
INTEGER nSize
lcSysDir = REPLICATE(CHR(0),255)
lnBuffer = 255
lnDirLen = GetWindowsDirectory( @lcSysDir, lnBuffer )
lcRetVal = LEFT( lcSysDir, lnDirLen )
? lcRetVal


--------------------------------------------------
GetSystemDirectory
Devuelve la ruta del directorio System de Windows
DECLARE INTEGER GetSystemDirectory IN Win32API ;
STRING @cBuffer, ;
INTEGER nSize
lcSysDir = REPLICATE(CHR(0),255)
lnBuffer = 255
lnDirLen = GetSystemDirectory( @lcSysDir, lnBuffer )
lcRetVal = LEFT( lcSysDir, lnDirLen )
?lcRetVal


----------------------------------------------------------
GetCurrentDirectory
Devuelve la ruta del directorio actual de trabajo
DECLARE INTEGER GetCurrentDirectory IN Win32API ;
INTEGER nSize, ;
STRING @cBuffer
*** Call the function
lcSysDir = REPLICATE(CHR(0),255)
lnBuffer = 255
lnDirLen = GetCurrentDirectory( lnBuffer, @lcSysDir )
lcRetVal = LEFT( lcSysDir, lnDirLen )
?lcRetval


---------------------------------------------------------
GetSysColor
Devuelve el valor del color en formato RGB de los objetos y
ventanas de Windows
DECLARE INTEGER GetSysColor IN Win32API INTEGER nObject
tnObjectNumber = 2 && Ventana Activa

lnWinCol = GetSysColor(tnObjectNumber)
lnSq256 = 256 ^ 2
lnRedGrn = MOD( lnWinCol, lnSq256 )
lcBlue = TRANSFORM( INT( lnWinCol/lnSq256 ) )
lcGreen = TRANSFORM( INT( lnRedGrn/256) )
lcRed = TRANSFORM( MOD( lnRedGrn,256) )
? (lcRed + "," + lcGreen + "," + lcBlue)
Estas son las constantes para los elementos de Windows y se
hace referencia ellos con la variable tnObjectNumber
1 Background (Windows Desktop)
2 Title Bar (Active Window)
3 Title Bar (Inactive Window)
5 Window Background
9 Title Bar Caption Text (Active Window)
19 Title Bar Caption Text (Inactive Window)
13 Highlighted Item Background
14 Highlighted Item Text
17 Command Button
18 Command Button Text

------------------------------------------------------------
GetCursorsActivo
Cambia el cursor de Windows a uno especificando el nombre de este.
LOCAL lcNewCursor
tcCursorFile = "c:\windows\cursors\globe.ANI"
tnCursorType = 32513
IF INLIST( JUSTEXT( tcCursorFile ), 'CUR', 'ANI' )

IF FILE( tcCursorFile )
DECLARE INTEGER LoadCursorFromFile in Win32Api String
DECLARE SetSystemCursor in Win32Api Integer, Integer
lcNewCursor = LoadCursorFromFile( tcCursorFile )
Lt = SetSystemCursor( lcNewCursor, tnCursorType )
ELSE
=MESSAGEBOX("No se encuentra el cursor")
ENDIF
ELSE
=MESSAGEBOX("No es del tipo cursor")
ENDIF

---------------------------------------------------------
GetActiveWindow
Devuelve el Handle (manejador o identificador nico) de la
ventana activa
DECLARE INTEGER GetActiveWindow IN user32
DECLARE INTEGER GetWindowDC IN user32 INTEGER hwnd
? GetActiveWindow()

-------------------------------------------------------
NetUserDelet
Borra un usuario de Windows NT
tcServer = "Nombre_ruta_servidor"
tcUserName = "dav"
DECLARE INTEGER NetUserDel IN NETAPI32 STRING @,STRING @
tcServer=STRCONV(STRCONV(tcServer,1),5)+CHR(0)
tcUserName=STRCONV(STRCONV(tcUserName,1),5)+CHR(0)
LOCAL lnError
lnError=NetUserDel(@tcServer,@tcUserName)
IF lnError>0
MESSAGEBOX('Imposible borrar Usuario')
ENDIF

--------------------------------------------------------
ConfigurePort
A travs de la funcin ConfigurePort podemos presentar las
propiedades del los puertos pasados como parmetro y configurar
as sus valores.
Declare integer ConfigurePort in "winspool.drv";
String pName, Long hwnd, String pPortName
=ConfigurePort("", 0 , "COM1:")
=ConfigurePort("", 0 , "LPT1:"))



----------------------------------------------------
AddFontResource y RemoveFontResource
Ha copiado una nueva fuente y desea instalarla? o desea quitar una
fuente que ya ha sido instalada?.
He observado algunos procedimientos de VB para ver como lo hacen
pero creo que se complican mucho, en esta caso a travs
de GETFILE( ), obtenemos la fuente a instalar.
Declare Long AddFontResource in "gdi32";
String lpFileName
Declare Long RemoveFontResource in "gdi32";
String lpFileName
filename=getfile('ttf')
Instalar = AddFontResource(FileName) <>0
&& Desinstalar = RemoveFontResource(FileName) <> 0
? Instalar

-------------------------------------------------------
CopyFile
Permite copiar un archivo a un determinado directorio o carpeta
compartida en la red, adems enviarlo directamente al puerto
paralelo.
DECLARE INTEGER CopyFile IN KERNEL32.DLL ;
STRING @SourceFileName, ;
STRING @DestFileName, ;
INTEGER bFailIfExists
IF CopyFile('C:\autoexec.bat','LPT1:',0) # 0
=messagebox("Copiado")
ELSE
=messagebox("No") copiado")
ENDIF



-------------------------------------------------------------
DLLSelfRegister
Algunas veces he trabajo con OCX y DLL y estas me ocasionan
problema en el momento de ragistrarlas con el Instalador, pero
ultimamente estoy utilizando una llamada la API que lo hace de
manera facil y contundente, devolviendo un valor que indica si
el proceso se realizo de manera satisfactoria. Talvez el unico
inconveniente que esto lo hago a traves de una DLL incluida en
el paquete de VB6.0
Declare Integer DLLSelfRegister in "c:\Windows\system\Vb6stkit.DLL" ;
String lpDllName
nombredll="c:\rutadondeestaelocxodll\"
liRet = DLLSelfRegister(NombreDll)
If liRet = 0 Then
SelfRegisterDLL = .t.
MessageBox ("Registrado ocx")
Else
SelfRegisterDLL = .f.
MessageBox ("Error- No Registrado ocx")
EndIf

-----------------------------------------------------
FindWindows
Determina si una ventana ventana existe o tambin puede ser
implementada para conocer si nuestra aplicacin esta ejecutndose.
Se le debe pasar el "Caption" de la ventana a buscar.
DECLARE INTEGER FindWindow IN Win32API;
STRING @lpClassName, ;
STRING @lpWindowName
&&Debe estar abierta la ventana Windows
lcApplicationTitle = "WINDOWS"
lnHWnd = FindWindow(0, @lcApplicationTitle)
* si desea probar abra la ventana del directorio windows
IF lnHWnd <> 0
=messagebox("si existe la ventana windows")
ELSE
=messagebox("no existe la ventana windows")
Endif


--------------------------------------------------------
GetKeyState
A travs de esta funcin podemos determinar si una tecla esta
presionada en cualquier instante. Es utilizada por Windows cuando
se pulsa Delete o Ctrl o Shift, para determinar como realiza la
operacin de copiado, borrado, etc.
DECLARE SHORT GetKeyState in WIN32API INTEGER KEYCODE
&& Evala si esta presionada la tecla SHIFT
IF (GETKEYSTATE(16) < 0)
MESSAGEBOX("Shift presionado")
ENDIF
&& Evala si esta presionada la tecla CONTROL (CTRL)
IF (GETKEYSTATE(17) < 0)
MESSAGEBOX("CTRL presionado")
ENDIF
&& Evala si esta presionada la tecla ALT
IF (GETKEYSTATE(18) < 0)
MESSAGEBOX("Alt presionado")
ENDIF


---------------------------------------------------
GetKeyboardState
Muy parecido al anterior pero verifica a travs de un ciclo
repetitivo el estado de cualquier tecla presionada
DECLARE SHORT GetKeyboardState IN WIN32API STRING @; pbKeyState
cKeyboardArray = REPLICATE(CHR(0),256)
IF GetKeyboardState(@cKeyboardArray) > 0
LOCAL nI
FOR nI = 1 TO 256
IF BITAND(ASC(SUBST(cKeyboardArray,nI,1)),128) > 0
? 'Virtual Key # ' + TRANSFORM(nI - 1) + ' is currently down'
ENDIF
ENDFOR
ELSE
=messagebox("Error")
ENDIF


-----------------------------------------------------
GetDoubleClickTime y SetDoubleClickTime
Permite conocer y configurar la velocidad del doble click del mouse;
esto es la velocidad al hacer doble click.
Declare integer GetDoubleClickTime in "user32" () As Long
? GetDoubleClickTime() && Determina la velocidad al hacer dbclick
Declare integer SetDoubleClickTime in "user32";
Long wCount
=SetDoubleClickTime(817)
&& Configura la velocidad del db click a 817 (lento)


---------------------------------------------------
GetShortPathName
Devuelve la ruta de un archivo en la forma de msdos; es decir,
solo se tendrn en cuenta los 7 primeros caracteres de los archivos
y directorios.
DECLARE INTEGER GetShortPathName IN Win32API ;
STRING @cLongPath, ;
STRING @cShortPathBuff, ;
INTEGER nBuffSize
lcLongFile = getfile() && muestra el cuadro de dialogo buscar archivo
lcBuffer = SPACE(511)
lnBufferSize = 511
lnShortPathLen = GetShortPathName(lcLongFile, @lcBuffer, @lnBufferSize)
lcShortPath = LEFT(lcBuffer, lnBufferSize)
=messagebox(lcShortPath)


--------------------------------------------
GetSystemMetrics
La funcin GetSystemMetrics provee mucha informacin a Windows,
En este caso podemos determinar la forma como inicio Windows;
Es decir: Modo a prueba de fallos, Normal, o con soporte de red.
Declare integer GetSystemMetrics in "user32";
Long nIndex
#define SM_CLEANBOOT 67
iNiWin = GetSystemMetrics(SM_CLEANBOOT)
Do Case iNiWin
Case = 1
=MESSAGEBOX("A prueba de Fallos")
Case = 2
=MESSAGEBOX("A prueba de fallos con soporte de Red")
Otherwise
=MESSAGEBOX("Windows inicio normalmente")
Endcase
--------------------------------------------------------------------------------
Devuelve los valores acerca de la configuracin del monitor,
resolucin, numero de colores soportados, entre otros.
til para programacin multimedia.
Declare integer GetSystemMetrics in "user32",;
Long nIndex
resolucionX = GetSystemMetrics()
resolucionY = GetSystemMetrics()
=messagebox(str(resolucionX)+" X"+ str(resolucionY))


-------------------------------------------------------
GetFileAttributes y SetFileAttributes
Permiten conocer y manipular los atributos de cualquier archivo.
GetFileAttributes determina que atributos tiene un archivo o
archivos determinados y SetFileAttributes reestablece los
atributos a los que uno desee
DECLARE SHORT SetFileAttributes IN KERNEL32 ;
STRING @ lpFileName, ;
INTEGER dwAttributes
DECLARE INTEGER GetFileAttributes IN WIN32API STRING @ lpFileName
#DEFINE FILE_ATTRIBUTE_READONLY 1
=SetFileAttributes('c:\config.sys', BITOR(GetFileAttributes('c:\config.sys'),FIL
E_ATTRIBUTE_READONLY))
* Atributo de solo lectura
=SetFileAttributes('c:\config.sys', 0)
&& Remueve todos los atributos del archivo

-------------------------------------------------
GetTickCount
Esta API determina el tiempo que lleva tu equipo encendido.
En verdad es fascinante saber que puedes realizar muchas cosas
con el API.
Declare integer GetTickCount in "KERNEL32" () As Long
local lngCount, lngHours, lngMinutes As Long
lngCount = GetTickCount()
lngHours = ((lngCount / 1000) / 60) / 60
lngMinutes = ((lngCount / 1000) / 60) % 60
MESSAGEBOX("Su Computador tiene de estar encendido " + ALLTRIM(STR(lngHours))+;
+ " hora(s) y " + ALLTRIM(STR(lngMinutes)) + ;
" minutos.", 56, "Tiempo Encendido")

---------------------------------------------------
GetFileSize
Permite determinar el tamao de un archivo determinado,
He recibido muchas consultas sobre esta funcin, debido a
que til cuando queremos realizar Backup en Diskette.

declare integer GetFileSize in "kernel32.dll" ;
Long hFile, Long lpFileSizeHigh
Declare INTEGER CreateFile in "kernel32.dll",String lpFileName,;
Long dwDesiredAccess, Long dwShareMode, string lpSecurityAttributes,;
Long dwCreationDisposition,Long dwFlagsAndAttributes, Long hTemplateFile
#define GENERIC_READ 2147483648
#define GENERIC_WRITE 1073741824
#define FILE_SHARE_READ 1
#define OPEN_EXISTING 3
#define FILE_ATTRIBUTE_ARCHIVE 32
hfile = CreateFile("C:\autoexec.bat", GENERIC_READ, ;
FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0)
highorder = 0 && initialize the value for high-order half
?GetFileSize(hfile, highorder)

---------------------------------------------------
IsIconic
Devuelve un valor el cual determina si la aplicacin pasada a
la funcin se encuentra minimizada. En este caso determina si
la aplicacin activa se encuentra minimizada.

Declare integer IsIconic in "user32.dll" Long hwnd
?IsIconic(thisForm.hWnd) && Solo para Visual Fox Pro 7.0
Para Visual Fox Pro 6.0 y 5.0
Declare integer GetActiveWindow in win32api
Declare integer IsIconic in "user32.dll" Long hwnd
ApliActiva = GetActivateWindow()
?IsIconic(ApliActiva)


-----------------------------------------------
Keybd_event
Esta funcin tiene mltiples propsitos, pero todos ellos
enfocados al manejo de ventanas. Podemos capturar la ventana
activa a travs de esta funcin. He recibido muchas consultas
sobre este tema; as que aqu esta.
DECLARE INTEGER keybd_event IN Win32API ;
INTEGER, INTEGER, INTEGER, INTEGER
VK_SNAPSHOT = 44
VK_LMENU = 164
KEYEVENTF_KEYUP = 2
KEYEVENTF_EXTENDEDKEY = 1
DOEVENTS
keybd_event(VK_SNAPSHOT, 1, 0, 0 )
keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_KEYUP, 0 )
DOEVENTS
DOEVENTS
keybd_event( VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY, 0 )
keybd_event( VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0 )
keybd_event( VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY + ; KEYEVENTF_KEYUP, 0 )
keybd_event( VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY + ; KEYEVENTF_KEYUP, 0 )
DOEVENTS
--------------------------------------------------------------------------------
Otra utilidad de esta funcin es minimizar todas las ventanas que
se encuentran activas, esto tambin es posible con las funciones
Findwindow y Postmessage.
Declare integer keybd_event in "user32" ;
integer, integer, long, Long
#define KEYEVENTF_KEYUP 2
#define VK_LWIN 91
=keybd_event(VK_LWIN, 0, 0, 0)
=keybd_event(77, 0, 0, 0)
=keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)


----------------------------------------------------
LockWindowUpdate
Impide la actualizacin de una ventana o la actualiza dependiendo
el valor pasado como parmetro. Para esto le pasamos el handle de
la ventana, en este caso se bloqueara la ventana activa.
Bloquea la ventana activa
DECLARE SHORT LockWindowUpdate IN WIN32API INTEGER hWnd
DECLARE INTEGER GetActiveWindow IN WIN32API
=LockWindowUpdate(GetActiveWindow())
Para desbloquear la ventana activa
=LockWindowUpdate(0)


-----------------------------------------
MessageBoxEx
Esta funcin manda un mensaje de Windows, es una extensin de la
funcin MessageBox, pero mucho mas completa e interesante.
Declare integer MessageBoxEx in "user32";
Long hwnd,;
String lpText,;
String lpCaption,;
Long uType,;
Long wLanguageId
=MessageBoxEx(0,"Mensaje para probar funcin api","API",0,0)


---------------------------------------------
mciExecute
Otra funcin para reproducir un sonido WAV. No estoy seguro si se
puede reproducir sonidos de otra extensin tales como MIDIS.
Intente y cuntenme
Declare integer mciExecute in "winmm.dll" String lpstrCommand
&& Debe existir el archivo DING.WAV en la ruta especificada.
iResult = mciExecute("Play c:\windows\ding.wav")


----------------------------------------
mciSendString
Algunas veces queremos implementar una caracteristica multimedia a nuestras apli
caciones, esta funcin
permite reproducir un video creo que de cualquier extensin. Este crea una ventana
especial donde se
reproduce el video. Posee otras utilidades referentes a la multimedia
Declare integer mciSendString in "winmm.dll";
String pstrCommand, ;
String lpstrReturnString, ;
Long uReturnLength, ;
Long hwndCallback
&&& Debe existir un archivo llamado COOL.AVI en C:\
cVal = "play c:\cool.avi"
ReturnVal = mciSendString(cVal, 0, 0, 1)
&& Si queremos ver el video a pantalla completa
cVal = "play c:\cool.avi fullScreen"
--------------------------------------------------------------------------------
Enviamos una cadena a la funcin mciSendString la cual hara que
se cierre la unidad de CD-ROM
Declare integer mciSendString in "winmm.dll" ;
String lpstrCommand, ;
String lpstrReturnString,;
Long uReturnLength,;
Long hwndCallback
= mcisendstring("set CDAudio door closed", "", 127, 0)
--------------------------------------------------------------------------------
Enviamos una cadena a la funcin mciSendString la cual hara que se
abra la unidad de CD-ROM
Declare integer mciSendString in "winmm.dll" ;
String lpstrCommand, ;
String lpstrReturnString,;
Long uReturnLength,;
Long hwndCallback
retvalue = mcisendstring("set CDAudio door open","", 127, 0)


-----------------------------------------
PostMessage
Una de las utilidades de la funcin PostMessage es comunicarse con
las ventanas y controles pero de manera diferente que la funcin
Sendmessage.
En este caso se le pasara el titulo de una ventana y a travs de
la funcin FindWindow se obtendr el handle de ella y se le pasara
el argumento para cerrar esta ventana. El ejemplo se explica con
la ventana Panel de Control; por lo tanto abra esta ventana
Declare integer PostMessage in "user32" ;
Long hwnd, Long wMsg, Long wParam, Long lParam
#define WM_CLOSE 16
Declare integer FindWindow in "user32" ;
string lpClassName, string lpWindowName
cCerrar = FindWindow(0,"Panel de control")
=PostMessage(cCerrar ,WM_CLOSE, 0, 0)
--------------------------------------------------------------------------------
Tambin podemos utilizar estas dos funciones
(FindWindow y PostMessage) para minimizar y restaurar
todas las ventanas activas; esta caracteristicas tambin
es posible con la funcin Keyb_Event.
Declare integer PostMessage in "user32";
Long hWnd, Long wMsg, Long wParam, Long lParam

Declare integer FindWindow in "user32" ;
String lpClassName,;
String lpWindowName
#define WM_COMMAND 273
#define MIN_ALL 419
#define MIN_ALL_UNDO 416
&&restaura todo lo minimizado
lngHwnd = FindWindow("Shell_TrayWnd", "")
=PostMessage(lngHwnd, WM_COMMAND, MIN_ALL_UNDO , 0)
&& Minimiza todo
lngHwnd = FindWindow("Shell_TrayWnd", "")
=PostMessage(lngHwnd, WM_COMMAND, MIN_ALL , 0)

----------------------------------------------
RegisterServiceProcess
He recibido muchas consultas de como evitar que la aplicacin
aparezca registrada cuando presionamos la combinacin de teclas
ALT + CTRL + SUP. Bueno aqu esta la solucin.
LOCAL n_CurrProc
DECLARE LONG RegisterServiceProcess IN KERNEL32.DLL ;
LONG ProcessID, ;
LONG ServiceFlags
DECLARE LONG GetCurrentProcessId IN KERNEL32.DLL ;
&& obtiene el identificador de proceso
n_CurrProc = GetCurrentProcessId()
lOcultarApp = .f.
IF lOcultarApp = .T.
&& remueve el flag (bandera) de servicio
RegisterServiceProcess(n_CurrProc, 1)
ELSE
&& crea el falg (bandera) de servicio de la aplicacin
RegisterServiceProcess(n_CurrProc, 0)
ENDIF


----------------------------------------
SendMessage
La funcin SendMessage se utiliza para establecer una comunicacin
con otra aplicacin, pasndole los parmetros podemos cerrar una
aplicacin, etc. Adems podemos interactuar con controles tales
como Combos, Listas especialmente pronto publicare un ejemplo con
estas.
En este caso ejecuta el protector de pantalla que se encuentre
configurado.
Declare integer SendMessage in "user32" ;
Long hwnd,;
Long wMsg,;
Long wParam,;
Long lParam
Declare integer GetActiveWindow in win32api
=SendMessage(GetActiveWindow(), 274, 61760, 0)


------------------------------------------
SetComputerName
Se utiliza cuando queremos cambiar el nombre de un computador en
la red. Es decir, se cambiara el nombre del equipo. En este caso
se le colocar al computador el nombre de Equipo_1.
Declare integer SetComputerName in "kernel32" ;
String lpComputerName
=SetComputerName("Equipo_1")


--------------------------------------------------
SetCurrentDirectory
Establece el directorio para la bsqueda de archivo.
Importante cuando queremos abrir tablas, formularios, etc, desde
una ruta determinada.
Es mejor que la funcin de VFP SET DEFAULT TO "RUTA"
Declare integer SetCurrentDirectory in "kernel32";
String lpPathName
=SetCurrentDirectory("c:\")


----------------------------------------------------
SystemParametersInfo
Esta funcin tiene muchas utilidades. En este ejemplo cambia el
papel tapiz de Windows, este ejemplo pide que busque un archivo
con extensin BMP para colocarlo de papel tapiz.
Declare integer SystemParametersInfo in "user32";
Long uAction,;
Long uParam,;
string lpvParam,;
Long fuWinIni
lfFile = getfile()
IF !empty(lfFile)
= SystemParametersInfo(20, 0,lfFile, 1)
ENDIF


--------------------------------------------------
SetSystemPowerState
Con esta funcin API podemos implementar la opcin SUSPENDER
que viene con Windows, es decir, el equipo entrara en un estado
de hibernacin.
Declare integer SetSystemPowerState in "kernel32";
Long fSuspend,;
Long fForce
=SetSystemPowerState(1,0)


-----------------------------------------
SetThreadPriority y GetCurrentThread
Determinan y establecen las prioridades de las aplicaciones
y procesos en Windows, que prioridad tiene determinada aplicacin
al momento de asignarle recursos.
DECLARE INTEGER SetThreadPriority IN KERNEL32.DLL ;
INTEGER hThread, ;
INTEGER nPriority
DECLARE INTEGER GetCurrentThread in KERNEL32.DLL
#DEFINE THREAD_PRIORITY_HIGHEST 2
#DEFINE THREAD_PRIORITY_ABOVE_NORMAL 1
#DEFINE THREAD_PRIORITY_NORMAL 0
#DEFINE THREAD_PRIORITY_BELOW_NORMAL -1
#DEFINE THREAD_PRIORITY_LOWEST -2
IF SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST) # 0
=messagebox("Prioridad alta establecida")
ELSE
=messagebox("Error al establecer prioridad")
ENDIF


----------------------------------------------
SetVolumeLabel
Cambia la etiqueta (label) del disco pasado como parmetro.
DECLARE INTEGER SetVolumeLabel IN KERNEL32.DLL ;
STRING @ lpRootPathName, ;
STRING @ lpVolumeName
IF SetVolumeLabel('C:\'+CHR(0),'nombreacolocar' + CHR(0)) = 1
=messagebox("Cambiada la etiqueta")
ELSE
=messagebox("Problemas cambiando la Etiqueta")
ENDIF


--------------------------------------------
SetWindowText
Alguna vez me enviaron una pregunta de como cambiar el titulo
de una ventana; bueno esta es la declaracin para hacerlo.
Para probar el ejemplo abra la ventana del Panel de Control y
coloque el siguiente cdigo en un botn, vera como cambia el
titulo de la ventana del panel de Control. Primero se obtiene
el handle de la ventana a cambiarle el titulo y luego se le pasa
a la funcin el handle y el nuevo titulo.
DECLARE SHORT SetWindowText IN USER32.DLL ;
INTEGER hWnd, ;
STRING @ lpString
declare integer FindWindow in win32api string c, string t
cTitulo="Panel de control" &&Debe estar abierta la ventana
hWnd=FindWindow(0,cTitulo)
IF SetWindowText(hWnd,"Prueba de cambio de Titulo") # 0
=messagebox("Se ha cambiado el Titulo")
ELSE
=messagebox("Ha ocurrido un error al cambiar el titulo")
ENDIF


-----------------------------------------
SetWindowPos
Esta funcin es de las ms solicitadas. A travs de ella podemos
interactuar con las ventanas. en este caso ocultara la barra de
tareas de windows
Declare Integer SetWindowPos In "user32" ;
Integer hwnd , ;
Integer hWndInsertAfter , ;
Integer x ,;
Integer y , ;
Integer cx ,;
Integer cy ,;
Integer wFlags
Declare Integer FindWindow In "user32" As "FindWindowA" ;
String lpClassName, ;
String lpWindowName
Ventana = FindWindowA("Shell_traywnd","")
=SetWindowPos (Ventana, 0, 0, 0, 0, 0, 128 ) && oculta
Wait windows "barra ocultada" time 3
=SetWindowPos (Ventana, 0, 0, 0, 0, 0, 64) && muestra


------------------------------------------
SHAddToRecentDocs
Vaca la carpeta de documentos utilizados en Windows; es decir,
todos los accesos directos a los documentos ejecutados
recientemente.
Declare integer SHAddToRecentDocs in "Shell32" ;
Long lFlags,;
Long lPv
=SHAddToRecentDocs(0,0)
wait windows "Espere un momento" timeout 3
--------------------------------------------------------------------------------
Otra utilidad es agregar archivos a la carpeta de documentos;
es decir aparecer un acceso directo al archivo pasado como
parmetro; podemos establecer adems en que posicin se agregara
el archivo; en esta caso en la posicin 2.
Declare integer SHAddToRecentDocs in "shell32.dll";
Long uFlags, String ByVal
NewFile="d:\cool.avi"
nF=SHAddToRecentDocs(2,NewFile)


-----------------------------------------------
ShellAbout
Permite mostrar una ventana de acerca muy profesional basada en
las tpicas ventanas acerca de Windows. Ofreciendo informacin
del Sistema.
Declare integer ShellAbout in "shell32.dll" ;
Long hwnd, String szApp, String szOtherStuff, Long hIcon
=ShellAbout(0, "La Web de Davphantom", "Copyright 2000", 0)


----------------------------------------------
ShowCursor
Muestra u oculta el cursor del mouse; dependiendo el valor pasado,
si es 0 lo oculta y si es 1 lo muestra; tambin podemos pasarle .T.
o .F.
Declare integer ShowCursor in "user32";
Long cursorestado
=showcursor(0) && oculta el cursor
Para mostrarlo
=showcursor(1)


-------------------------------------------
ShellExecute
Es una de las funciones que ms se utiliza en Windows; tiene que
ver con todos las ejecuciones de archivos y los procesos que
sobre estos se realizan, tales como abrir, imprimir, buscar, etc.
una implementacin de esta funcin es abrir el cuadro de dilogo
"Buscar", a travs del cual Windows realiza sus bsquedas.
Esta utiliza algunos parmetros como, desde cual directorio quiere
empezar la bsqueda, el archivo a buscar entre otros. Prueba
modificando algunos valores y aprenders un poco ms.
Declare integer ShellExecute in "shell32.dll" ;
integer hWnd,;
String lpOperation,;
String lpFile,;
String lpParameters,;
String lpDirectory,;
Long nShowCmd
=ShellExecute(0, "Find", "", "","c:\", 0)
--------------------------------------------------------------------------------
Se utiliza para ejecutar cualquier archivo con su respectivo
programa asociado. Incluye adems algunos otros procedimientos
como imprimir, editar, abrir; dependiendo el parmetro que se le
mande a la funcin.
DECLARE INTEGER ShellExecute IN "Shell32.dll" ;
INTEGER hwnd, ;
STRING lpVerb, ;
STRING lpFile, ;
STRING lpParameters, ;
STRING lpDirectory, ;
LONG nShowCmd
* Abre el documento "c:\prueba.doc" Este documento debe existir
=Shellexecute(0,"Open","c:\prueba.doc","","",0)
* Abre el explorador por defecto en la pagina de Davphantom
=Shellexecute(0,"Open","http://www.davphantom.cjb.net","","",0)
* Imprime el archivo "c:\autoexec.bat" este archivo debe existir
=Shellexecute(0,"Print","c:autoexec.bat","","",0)


--------------------------------------------------
SHEmptyRecycleBin
Es utilizada para vaciar la papelera de reciclaje, el flag,
indica si se muestra mensaje para vaciar la papelera o no, el
valor de este flag es 1 y 0, si es 0 muestra mensaje para la
eliminacin y si es 1 no muestra ningn mensaje.

DECLARE INTEGER SHEmptyRecycleBin IN Shell32 ;
INTEGER hWnd, ;
STRING @lpszRootPath, ;
INTEGER dwFlags
#define SHERB_NOCONFIRMATION 0x00000001
#define SHERB_NOPROGRESSUI 0x00000002
#define SHERB_NOSOUND 0x00000004
lcDrive = "C:" + CHR(0)
SHEmptyRecycleBin( 0, lcDrive, 1 )
* cuando el flag es 1 no se muestra mensaje para confirmar el
vaciado y si el flag es 0 si muestra el mensaje

------------------------------------------
SHFormatDrive
Permite formatear el disco pasado como parmetro, en este ejemplo
se intentara formatear el disco A:\.

DECLARE INTEGER SHFormatDrive IN shell32.dll ;
INTEGER hwnd, ;
INTEGER diskID, ;
INTEGER fmtID, ;
INTEGER Option
#DEFINE SHFMT_ID_DEFAULT 0xFFFF
#DEFINE DRIVE_A 0
DECLARE INTEGER GetActiveWindow IN WIN32API
IF SHFormatDrive(GetActiveWindow(), DRIVE_A, SHFMT_ID_DEFAULT, 0) = 0
=messagebox ( "Formateado")
ELSE
=messagebox ("Imposible formatear")
ENDIF


------------------------------------------
Sleep
Muchas veces deseamos bloquear nuestra ventana o aplicacin hasta
que se realice un proceso determinado; bueno la funcin SLEEP del
api de Windows lo hace. Impide la actualizacin de una ventana por
un determinado tiempo, los cambios hechos en esta ventana se
reflejaran despus del tiempo indicado.

Declare integer Sleep in "kernel32" ;
Long dwMilliseconds
=Sleep(5000)
&& Impide la actualizacin de la ventana por 5 segundos
(5000 milisegundos)

------------------------------------------------------------
TapiRequestMakeCall
Podemos realizar llamadas a travs del marcador de telfono de
Windows, pasndole los parmetros a este, es una forma fcil de
incluir en tus aplicaciones procedimientos profesionales de una
manera sencilla.
Declare Long tapiRequestMakeCall in "TAPI32.DLL";
String DestAddress,;
String AppName,;
String CalledParty,;
String Comment
Numero = "6690725"
NombreProg = "c:\windows\dialer.exe"
llamandoa = "David"
ValDev = tapiRequestMakeCall(Numero, NombreProg, llamandoa ,"hola como estas")


------------------------------------------
waveOutGetNumDevs
Devuelve un valor 1 el cual determina si Windows tiene instalada
o no la tarjeta de sonido.
Declare Integer waveOutGetNumDevs in "winmm.dll" ()
inf = waveOutGetNumDevs()
If inf > 0 Then
=MessageBox ("Tarjeta de sonido soportada.")
Else
=MessageBox "Tarjeta de sonido no soportada.")
endif


-------------------------------------
WNetAddConnection
este funcin permite agregar o conectar a una unidad de red pasando
los parmetros de la ruta a la unidad, as mismo como el password
DECLARE INTEGER WNetAddConnection IN "mpr.dll" ;
STRING cRemoteName, ;
STRING cPassword, ;
STRING cLocalName
cResource = "\\SERVIDOR\UNIDADRED"
cPassword = "password"
cDriveLetter = "Y:"
? WNetAddConnection(cResource, cPassword, cDriveLetter)
Si no es posible la conexin esta enviara un valor de error
que puede ser interceptado.

--------------------------------------
WNetCancelConnection
Desconecta una terminal de la unidad de red, dependiendo el valor
pasado a esta funcin.

DECLARE INTEGER WNetCancelConnection IN "mpr.dll" ;
STRING cName, ;
INTEGER nForce
nForce = 1 && Forza a la desconexin
=WNetCancelConnection("Y:",0)

-------------------------------------------

WNetConnectionDialog
Muestra el cuadro de dialogo para conectar a una Unidad de Red,
permitiendo una conexin fcil con un dispositivo remoto.

DECLARE INTEGER WNetConnectionDialog IN WIN32API ;
INTEGER hWnd, ;
INTEGER nResourceType
DECLARE INTEGER GetActiveWindow IN WIN32API
IF WNetConnectionDialog(GetActiveWindow(),1) = 0
=messagebox("La conexin establecida")
ELSE
=messagebox("Nno fue posible la conexin")
ENDIF

================================================================================
========
Creando tablas en Word con VFP a travs de Automatizacin
Un ejemplo como podemos crear tablas en Word con datos de tablas de VFP,
a travs de Automatizacin.
USE employee
lcTemp = SYS(2015)+'.txt'
COPY fields empl_id, last_name TO (lcTemp) TYPE csv

lnFields = 2

_ClipText = chrtran(FileToStr(lcTemp),'"','')

erase (lcTemp)

#define wdSeparateByCommas 2
oWordDocument=createobject("word.application") && Create word object

WITH oWordDocument
.documents.add

WITH .ActiveDocument
.Range.Paste
.Range.ConvertToTable(wdSeparateByCommas,,lnFields)
ENDWITH

.visible = .t.
.Activate
ENDWITH


----------------------------------------------
Invocar cuadros de dialogo de Windows
Existe una forma sencilla de invocar cuadros de dialogo de Windows,
tales como: Guardar, Abrir, Fuentes, Color, Impresoras, Ayuda.
loComDialog = newobject( "mscomdlg.commondialog" )

locomdialog.ShowFont && Mostrar Fuente

locomdialog.ShowPrinter() && Mostrar Impresora

locomdialog.ShowColor() && Mostrar Colores

locomdialog.ShowSave() && Mostrar Guardar
loComDialog.ShowOpen && Mostrar Abrir


-------------------------------------------------
Llamar a carpetas importantes de Windows
En algunas ocasiones queremos mostrar la carpeta de mis documentos u otra
carpeta de Windows, pero se nos complica un poco. esta es la forma sencilla de h
acerlo.
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


---------------------------------------
Seleccionar Tipo de letra con todas las caractersticas
Agregue un cuadro de dialogo en el cual le permita establecer
todas las caractersticas de un tipo de letra.
#define CF_SCREENFONTS 0x00000001
#define CF_PRINTERFONTS 0x00000002
#define CF_BOTH (CF_SCREENFONTS + CF_PRINTERFONTS)
#define CF_SHOWHELP 0x00000004
#define CF_USESTYLE 0x00000080
#define CF_EFFECTS 0x00000100
loComDialog = newobject( "mscomdlg.commondialog" )
WITH loComDialog

.Flags = CF_BOTH + CF_EFFECTS && Muestra las fuentes Imprimibles y de
la Ventana
.FontName = "Arial" &&Valor Iniciales
.FontSize = 22 &&Valor Iniciales
.ShowFont()
&& Resultado del tipo de letra seleccionado
? .FontName, .FontSize, .FontBold, .FontItalic, .FontStrikeThru, .FontU
nderline, .Color
ENDWITH

--------------------------------------
Compilando cdigo desde tiempo de Ejecucin
Una de las funciones ms 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 cdigo desde campos memos, texto, etc y compilarlo.
lcNombreArchivo = Sys(2015) + ".prg"
Strtofile(CampoMemo, lcNombreArchivo )
Compile (lcNombreArchivo) && en VFP 6 SP 3 o superior
DO (lcNombreArchivo)
ExecScript(CampoMemo) && En VFP 7


-----------------------------------------
Encriptar con clase de VFP7
Se agrego a VFP7 una clase que permite encriptar invocando algunas funciones API
.
La clase permite que sea muy fcil hacerlo
oCrypt = NEWOBJECT("_cryptapi",HOME()+"\ffc\_crypt.vcx")
cEncryptedString = []
cEncryptedString2 = []
oCrypt.encryptSessionStreamString(" Encriptando Texto","clave", @cEncryptedStrin
g)


-------------------------------------
Grficos con Excel y con buenos efectos
Uno de los temas ms solicitados a mi correo son los grficos;
este es un BUEN ejemplo de como hacerlo, y adems agregndole un gran efecto.
LOCAL objXL, objXLchart, intRotate
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
For intRotate = 5 To 180 Step 5
objXLchart.Rotation = intRotate
Next
For intRotate = 175 To 0 Step -5
objXLchart.Rotation = intRotate
Next


--------------------------------------
Determinar el Serial del Disco con WSH
Otro de los temas de bastante consulta es como obtener el Serial de un Disco,
esta forma es sper sencilla y con poco cdigo.
oFS=CreateObject('scripting.filesystemobject')
? oFS.Drives('c').SerialNumber


-------------------------------
Impedir que cambien el tamao de las Columnas de un Grid
Si quiere que nadie cambie el tamao de las columnas de un grid, puede utilizar es
ta forma.
THISFORM.Grid1.SetAll("Resizable", .F., "Column")


------------------------------------
Copiar el contenido de dos archivos de Texto en Uno
Este ejemplo demuestra como podemos copiar dos archivos o ms en uno solo.
RUN COPY Archivo1.txt + Archivo2.txt Destino.txt
Otra forma seria utilizando la funcin strtofile
strtofile(filetostr("Archivo1.txt") + filetostr("Archivo2.txt"), "Destino.txt")



---------------------------------------
Copiar archivos utilizando WSH
De las formas ms sencillas de copiar y mover archivos y carpetas.
ofs=createobject("scripting.filesystemobject")
ofs.copyfolder('c:\Origen','e:\Destino')
Donde origen y destino pueden ser directorios


---------------------------------
Desplazarse por un Grid
Forma de avanzar o retroceder dentro de un grid.
Thisform.Grid1.DoScroll(2)
Thisform.Grid1.DoScroll(3)
Donde los parmetros de este mtodo son los siguientes:
0 Desplazamiento hacia arriba
1 Desplazamiento hacia abajo
2 Desplazamiento retroceso de pgina
3 Desplazamiento avance de pgina
4 Desplazamiento a la izquierda
5 Desplazamiento a la derecha
6 Desplazamiento pgina a la izquierda
7 Desplazamiento pgina a la derecha


-------------------------------------
Conocer si una tabla tiene un Indice determinado
Cuando agregamos Indices a una tabla debemos averiguar si este ya tiene ese ndice
,
sino ocurrir un error.
Select Tabla

For i = 1 To TagCount()
If Tag(i) = "nId_campo"
Wait Window "SI"
EndIf
EndFor

-------------------------------
Modificar la Ventana de VFP con un solo comando
Si necesidad de estar escribiendo varios comandos, podemos modificar el aspecto
de la
ventana (Screen) de VFP
MODIFY WINDOW "screen" TITLE "La Web de VFP" ZOOM icon file "dav.ico" zoom


------------------------------------
Suprimir cuadro de dilogo "Imprimiendo" con el API
Cuando mandamos reportes a la Impresora algunas veces queremos personalizar esta
operacin;
pero siempre nos muestras la ventanita "Imprimiendo". Esta es la forma de omitir
esa ventana
DECLARE INTEGER GetDesktopWindow IN WIN32API
DECLARE INTEGER LockWindowUpdate IN WIN32API INTEGER lnHandle

hWin = GetDeskTopWindow()

LockWindowUpdate(hWin) && Bloquea actualizacin de la pantalla
REPORT FORM NombreReporte.frx TO PRINTER
LockWindowUpdate(0) && No actualiza la pantalla


--------------------------------
Conocer la resolucin actual de la pantalla en Windows
Cuando mandamos reportes a la Impresora algunas veces queremos personalizar esta
operacin;
pero siempre nos muestras la ventanita "Imprimiendo". Esta es la forma de omitir
esa ventana
#define SM_CXSCREEN 0 && Ancho de Screen en Pxeles
#define SM_CYSCREEN 1 && Alto de Screen en Pxeles
#define SM_CXFULLSCREEN 16 && Ancho rea de cliente
#define SM_CYFULLSCREEN 17 && Alto rea de cliente
DECLARE INTEGER GetSystemMetrics IN Win32API;
INTEGER nIndex
? GetSystemMetrics(SM_CXSCREEN)
? GetSystemMetrics(SM_CYSCREEN)
? GetSystemMetrics(SM_CXFULLSCREEN)
? GetSystemMetrics(SM_CYFULLSCREEN)

-------------------------------------
Agregar un Month View desde cdigo
Algunas veces queremos incluir un calendario profesional dentro de nuestras apli
caciones
con el fin que el usuario seleccione una fecha y sin tener que preocuparnos de v
alidarla.
Este truco resuelve el problema. El Month View lo podemos agregar en cualquier p
arte
del Form o del objeto, eso depende de las propiedades Top y Left.
oForm = Thisform
oForm.AddObject('ctlMonth', 'oleControl', 'MSComCtl2.MonthView.2')
oForm.ctlMonth.Top = 2
oForm.ctlMonth.Left = 2
oForm.ctlMonth.Visible = .t.
oForm.Show()


----------------------------------------
Determinar el Service Pack instalado
Con tantos errores de VFP siempre debemos instalar algunos SP; pero para determi
nar
si tenemos instalado alguno y cual versin utilice este truco. Sino tiene instalad
o
ninguno devolver una cadena vaca.
? OS(7)

---------------------------------
Conocer la versin del Sistema Operativo
Nos devuelve el nombre y la versin del sistema operativo que estamos ejecutando.
No nos dice si es Window 98, 95 o ME; solo nos devuelve el nombre y versin: por e
jemplo:
Windows 4.9021
? OS(1)

-------------------------------------
Agregar ceros ( 0 ) a la izquierda de un nmero
Si deseas agregar 0 a un nmero a la izquierda de este, puedes hacer esto.
Se utiliza mucho en la generacin de Factura.
LnVar = 350 && Variable a agregar 0
?PADL(lnVar,5,'0')

&& el nmero 5 especifica el ancho de la cadena de nmeros

Resultado
00350

--------------------------------------------
Convertir a Hexadecimal nmeros
Existen diversas formas de convertir a Hexadecimal, pero talvez esta es la ms fcil
. OJO.
Solo convierte Enteros.
? Transform(123456, "@0")


--------------------------
Sumar das a fechas
Un buen truco si deseas sumarle das a una fecha determinada. Dos formas diferente
s
? date(2001, 12, 31) + 32 && Devuelve 02/01/02
Otra forma
ldAoinicio = {^2002/01/01}
? ldAoinicio + Val("32") - 1 && Devuelve 02/01/02


----------------------------
Generar nombre de archivo de forma aleatoria
Utiliza esta funcin de VFP si deseas crear archivos que no tengan el mismo nombre
.
? SYS(2023) + "\" + SYS(2015)
&& Genera archivos en el directorio Temp de Windows


--------------------------------
Cambiar dinmicamente propiedades de un Grid
Muestra los datos de tu grid dependiendo una condicin determinada y manipulando e
l
Fondo y color de las celdas.
thisform.Grid1.SetAll("dynamicbackcolor", ;
"IIF( empledos.edad > 40, RGB(255,0,0), RGB(255,255,255))",
"Column")
En este caso se cambia el fondo de la celda para aquellos empleados que tengan u
na edad superior a 40 aos

--------------------------------
Quitar botones de la barra del Preview
Truco indispensable si deseas quitar algunos botones de la barra del preview e i
mpedir
as que se imprima desde ah o se seleccione alguna opcin.
Bueno para realizar este truco te recomiendo cierres todo. Ahora ve al men VER, l
uego a
ToolBars (Barra de herramientas), luego selecciona la barra Print Preview (VISTA
PRELIMINAR)
y ahora haz click en Customize (PERSONALIZAR). Ahora la barra te aparecer deshabi
litada
detrs de ventana de personalizacin, ve a la barra y con click sostenido quita todo
s los
botones que quieras y listo la configuracin se guardara en Foxuser.dbf
Si deseas que el usuario final no pueda acceder a los botones debes distribuir e
l archivo
Foxuser.dbf con tu proyecto.


-------------------------------
Envo de Email desde Windows NT
Desde NT es muy fcil enviar email, este truco te explica como hacerlo.
y = CreateObject('cdonts.newmail')
y.AttachFile('c:\datos\prueba.zip') && Archivo Adjunto
y.Send('miemail@direccion.com' , 'tuemail@direccion.com' , 'Subject' , 'Texto me
nsage')
y=null


------------------------------------
Formateando texto en Excel
Automatizacin sencilla que te ensea como cambiar el formato de celdas de Excel des
de VFP.
oExcel = CreateObject("Excel.Application")
With oExcel.ActiveSheet.Range("A1").Font
.Name = "Times New Roman"
.Size = 20
.Bold = .T.
EndWith


---------------------------------
Generar nmeros aleatorios y almacenarlos en tablas
Este truco te genera una secuencia de nmeros desde un limite inferior hasta un
limite superior y los almacena en una tabla. Utiliza un procedimiento llamado
GenerarAleatorio al cual se le pasan el limite inferior y el limite superior de
la
generacin de nmeros
Rand(-1)
Create cursor Valaleatorios (rnd b(2))
For ix=1 to 1000
Insert into Valaleatorios values (round(GenerarAleatorio(2,8),0))
Endfor
Locate
Browse
Function GenerarAleatorio
lParameter nLowerLimit, nUpperLimit
DO CASE
CASE nLowerLimit>nUpperLimit
RETURN null
CASE nLowerLimit=nUpperLimit
RETURN nLowerLimit
Otherwise
Return rand()*(nUpperlimit-nLowerLimit)+nLowerLimit
ENDCASE


----------------------------------
Comprimir fcilmente y profesionalmente con el PKZIP
Uno de los temas de mayor consulta en mi correo. Esta truco te permite comprimir
y descomprimir archivos fcilmente usando PKZIP. Puedes omitir la pantalla de DOS
con
un truco anterior.
Run PKZIP -a -& a:\nombrezip c:\programa\datos\*.dbf
Este truco te permite comprimir archivo de de forma fcil, el carcter & te permite
agregarle soporte de Spanning; es decir, si estas comprimiendo en un Diskette y
el
espacio no es suficiente, entonces el mismo te pedir otro diskette.

--------------------------------------------
Directorios especiales de Windows sin API
Existen algunas formas sencillas y sin mucho cdigo para conocer los directorios
principales de Windows y son funciones propias de VFP.
?GETENV("temp") && Directorio de archivos temporales
?GETENV("windir") && Directorio de Windows



--------------------------------------------
Agregar imagen al _Screen
En ocasiones queremos que en el fondo de nuestras aplicaciones, es decir en el _
screen
se vea el logo de nuestro programa o de la empresa. Este es un buen truco para
personalizar las aplicaciones.
_screen.addobject("oImg", "image")
_screen.oImg.picture = "c:\imagen.jpg"
_screen.oImg.visible = .T.
_screen.oImg.stretch = 1
_screen.oImg.width = 640
_screen.oImg.height = 480


---------------------------------------
Agregar Timer al _Screen
Este uno de los trucos ms solicitados a mi email, con este truco podemos hacer qu
e
cada cierto tiempo se consulte una tabla de mensajes para usuarios en red o cheq
uear
para revisar si tenemos nuevo correo...en fin.
_SCREEN.AddObject('oTime','TimerScreen')
* Definicion de la Clase TimerScreen
* Muestra un Reloj en un Wait Window
* Este se actualiza cada un segundo
DEFINE CLASS TimerScreen AS Timer
Interval= 1000
PROCEDURE Timer
WAIT WINDOW (TIME()) nowait
ENDPROC
ENDDEFINE


--------------------------------
Pasar parmetros a Ejecutables
En antiguos programas de MSDOS veamos que a estos les pasbamos datos desde
la lnea de comandos; bueno tambin es posible que un programa de VFP acepte
parmetros pasados desde la lnea de comandos.
Primero debes agregar al prg principal en la primera lnea
PARAMETERS uParam1, uParam2, uParam3
El cdigo anterior se encargara de recoger los parmetros pasados como argumentos de
sde la lnea de comandos; en este caso slo recoger tres parmetros
Cuando ejecutes el programa debes pasar los parmetros de la siguiente manera; ten
iendo en cuenta que todos son ledos por el ejecutable como tipo carcter, es decir,
si le pasas el nmero 80 el ejecutable lo leera como "80" de tipo carcter
C:\programa.exe Para1 200 Para3


---------------------------------
Ejecutar Protector de pantalla sin API
Existen diferentes formas de ejecutar un protector de pantalla especifico,
esta es de las ms sencilla
RUN /N nombreprotector.scr /S


--------------------------------
Cambiar teclas pulsadas
Si quieres volver loco a cualquier persona utiliza este truco; cuando por
ejemplo presionas la letra a entonces te muestra x.
If inlist(nKeyCode, 97, 65)
nodefault
keyboard "X"
Eendif


-----------------------------------
Limitar el numero de caracteres que puede introducir el usuario en un TextBox o
EditBox
Si queremos configurar el nmero mximo de caracteres que se pueden introducir en lo
s
Tetbox y Editbox.
Tanto el EditBox como el TextBox incorporan la nueva propiedad MaxLength donde p
odemos
indicar el nmero mximo de caracteres que se pueden introducir. Esta propiedad anul
a a
InputMask. Tambin tenemos que tener en cuenta que slo es vlida para caracteres y no
para nmeros. Para estos deberemos seguir utilizando la tcnica de poner dentro del
InputMask tantos 9 como dgitos.



-------------------------------
Anclar la Barra del Preview de Reportes
Cuando ejecutamos un reporte y este muestra la barra de Preview, muchas veces
deseamos colocarla anclada al resto de barras.
Primero ejecutamos el reporte con la clusula tradicional:
Report Form nombrereporte.frx preview nowait
If wexist("Print Preview")
move window 'Print Preview' to 10,10
mouse dblclick at 11,11
Endif


-----------------------------------
Cambiar propiedades de los reportes desde cdigo
Podemos manipular las propiedades de un formulario desde cdigo.
Como sabemos un reporte no es ms que una tabla donde se almacenan los objetos y
las propiedades de estos que luego son invocados por el Dataenvironment.
Bueno para cambiar las propiedades de los reportes desde cdigo debemos abrir el
reporte como una tabla:
USE nombrereporte.frx
REPLACE fontface with "Verdana", fontsize WITH 10, fontstyle WITH 1 FOR objtype
= 1
Con esto ponemos como predeterminado la fuente Verdana a 10 puntos y negrilla, s
i en
fontstyle ponemos 0 tendremos letra normal.


----------------------------------
Agregar datos de un cursor a una Tabla
Este es un truco bastante importante y sencillo; su aplicacin es determinante cua
ndo
queremos agregar los datos a una tabla mostrados en un cursor
APPEND FROM DBF('nombre_cursor')


---------------------------------
Obtener el nombre de las tablas contenidas en una Base de Datos
Para realizar algunos procesos necesarios de las bases de datos debemos conocer
los nombres de las tablas contenidas en ella. Por ejemplo a la hora de querer re
indexar
cada tablas de la B. D
OPEN DATABASE c:\Ruta_Base_de_Datos.dbc
cNomTablas = ADBOBJECT(infVector, "TABLE")
FOR EACH cNomTablas IN infVector
? cNomTablas
ENDFOR


------------------------------------
Quitar acentos de una cadenas de caracteres
Algunas veces los acentos son algo molestos y nos causan inconvenientes, sobre t
odo
al momento de realizar bsquedas dentro tablas
lCadena = "El amor es el perdn ms fcil"
? CHRTRAN(lCadena, "", "aeiouAEIOU")


--------------------------------------------
Impedir que un formulario se cargue al ejecutarse
En ocasiones se utiliza como remedio para prevenir que se ejecute mltiples veces
un formulario.
En el Evento Init( ) del formulario se devuelve .F. y el formulario no se cargar
a
Mtodo Init ( )
Return .F.


------------------------------------------------
Borrar archivos fcilmente
Una forma sencilla de borrar archivos sin complicaciones.
ERASE *.tmp


------------------------------------
Cambiar el puntero del Mouse mientras se ejecuta un proceso
Si quieres agregarle algo de apariencia de Windows puedes personalizar las accio
nes
que realizas dentro de tu aplicacin y cuando creas que un proceso podra tardar un
poco entonces colocaras esta rutina para hacer entender que la aplicacin se encuen
tra
ocupada.
WITH ThisForm
.MousePointer = 11 && Establece el puntero al Reloj de arena
.SetAll( 'MousePointer', 11 ) && Lo Aplicamos a todos los objetos
ENDWITH



-------------------------------------
Verificar si existe palabra en el Diccionario de Word
Un truco bastante bueno a travs del cual podemos verificar si ciertas cadena de
caracteres estn bien escrita.
cPalabra = "pureta" && Donde quera decir puerta
oWord = CreateObject("Word.Application")
? oWord.CheckSpelling(cPalabra) && Si la palabra existe devuelve .T. sino .F.


--------------------------------------
Wait Window centrado en la pantalla
Por defecto el mensaje mostrado por Wait Window se muestra en la parte superior
derecha de la pantalla, con este truco se muestra centrado en la pantalla.
cMensage = "Este es un ejemplo del mensaje"
_Screen.Scalemode = 0
Wait Window cMensage At Int(_Screen.Height/2), Int(_Screen.Width/2 - Len(cMensag
e) / 2)


--------------------------------------
Ventana de Ayuda al estilo de Window
Cuando creamos la ayuda de nuestra aplicacin siempre queremos agregarle ayuda
personalizada..bueno este te puede servir y muy fcil.
Les gustaran estos ejemplos.
Ejemplo No 1
DEFINE WINDOW wAyuda ;
FROM 1,1 TO 5,35 ;
FONT 'MS SANS SERIF',8 ;
STYLE 'BN' && Define la ventana con fuente y estilo
ACTIVATE WINDOW wAyuda
?'Lo Mejor de VFP'
?'La Web de Davphantom'
WAIT WINDOW "" TIMEOUT 3
RELEASE WINDOWS wAyuda
Ejemplo No 2
Declare integer Sleep in "kernel32" ;
Long dwMilliseconds
DEFINE WINDOW wAyuda ;
FROM 1,1 TO 3,35 ;
FONT 'MS SANS SERIF',8 ;
STYLE 'BN' COLOR RGB(255,255,255,0,0,255)&& De&& Define la ventana con fuente y
estilo
ACTIVATE WINDOW wAyuda
?'Lo Mejor de VFP'
?'La Web de Davphantom'
=sleep(1000)
**WAIT WINDOW TIMEOUT 3
RELEASE WINDOWS wAyuda


-----------------------------------
Mostrar fuentes disponibles e imprimir texto con ellas
Puedes mostrar un texto escrito con todas las fuentes disponibles.
=AFONT(gaFontArray) && Matriz que contiene nombres de fuentes
gnNumFonts = ALEN(gaFontArray) && Nmero de fuentes
IF gnNumFonts > 25
gnNumFonts = 25 && Muestra las 25 primeras fuentes
ENDIF
FOR nCount = 1 TO gnNumFonts
? ALLTRIM(gaFontArray(nCount)) && Muestra nombre de fuente
?? ' Esto es un ejemplo de ' ;
+ ALLTRIM(gaFontArray(nCount)) FONT gaFontArray(nCount), 8
ENDFOR


--------------------------------------
Mostrar informacin de ejecutables
Puedes mostrar la informacin de los ejecutables; tales como versin, nombre interno
,
compaa desarrolladora, entre otros
aGetFileVersion(aVers, "f:\WINDOWS\EXPLORER.exe")
? aVers(2)
? aVers(3)
? aVers(4)
? aVers(5)


-----------------------------------------
Formato de Fecha larga
Podemos mostrar de forma sencilla la fecha en formato largo, es decir 26 de Ener
o de 2002
dFecha = {^2000/01/01}
? alltrim(str(day(dFecha))) + " " + cmonth(dfecha) + " " + alltrim(str(year(dfec
ha)))


------------------------------------
Transformar segundos a formato hhHH:MM::SS
Este truco convierte un nmero determinado de segundo es Horas, minutos y segundos
LOCAL lnHoras, lnMinutos, lnSegundos
nsegundos = 180 && Numero de segundo a convertir

lnHoras = INT(nSegundos/3600)
lnMinutos = INT(((nSegundos-(lnHoras * 3600))/60))
lnSegundos = MOD(nSegundos,60)
? IiF(lnHoras<100,TRANSFORM(lnHoras,"@L 99"),TRANSFORM(lnHoras,"@L 9999")) +":"+
;
TRANSFORM(lnMinutos,"@L 99")+":"+ ;
TRANSFORM(lnSegundos,"@L 99")

-----------------------------------
Desplegar un ComboBox al recibir el Enfoque II
En ocasiones queremos conocer el contenido de un ComboBoX sin hacer click en l,
solamente a lo que l recibe el enfoque. Esta es la forma ms fcil de hacerlo.
KEYBOARD '{F4}'
En este caso agregamos este cdigo al evento GOTFOCUS( ) y cuando el Combo reciba
el
enfoque entonces este se desplegara mostrando la informacin contenidas en l.


-----------------------------------
Cristal Report y VFP
Uno de los grandes problemas de VFP son los reportes; pero podemos realizar los
reportes
en Cristal Report y luego llamarlos desde VFP. No quiero decir con esto que sea
mejor,
ms fcil o ms cmodo; simplemente es otra forma de hacerlo y tiene muchas ventajas.
En los ejemplos que demuestro estoy utilizando la versin 8 del Cristal Report de
Seagate
pero considero que se debe comportar igual con las dems versiones.
Primero veamos como puedo exportar un reporte a extensin .DOC (Word)
oCristalReport = createobject("crystal.crpe.application")
oRepx = oCristalReport.OpenReport("C:\reporteventas.RPT")
oRepx.ExportOptions.FormatType = 14 && Formato de Word
oRepx.ExportOptions.DiskFileName = "c:\reporteventasdelmes.doc"
oRepx.ExportOptions.DestinationType = 1 && Tipo de Destino a guardar
oRepx.Export(.F.) && No muestra ningun cuadro de Dialogo
release oRepx
release oCristalReport
Los otros formatos en que podemos guardar los reportes son:
Extensin FormatType
RTF 4
EXCEL 7 27 o 28
EXCEL 8 29 o 30

Para ver en vista previa un reporte:
oCristalreport = createobject("crystal.crpe.application")
oRep = oCristalreport.OpenReport("C:\reporteventas.RPT")
oRep.Preview

Para mandarlo a imprimir
oCristalreport = createobject("crystal.crpe.application")
oRep = oCristalreport.OpenReport("C:\reporteventas.RPT")
oRep.Printout(.F.) && .F. no muestra cuadro para configurar impresora

-------------------------------------
Imprimir paginas determinadas de un Reporte
Cuando tenemos un reporte y queremos imprimir una pagina determinada o desde una
pagina
a otra podemos utilizar el argumento RANGE. Despus de l indicamos la pagina de ini
cio
y final del reporte a imprimir.
Supongamos que tenemos un reporte de 20 paginas, yo puedo mandar a imprimir de l
a pagina 10
a la 15 de la siguiente manera
REPORT FORM nombreinforme RANGE 10,15

---------------------------------
Funciones SYS ( )
Algunas veces he recorrido todas las funciones API que tengo y no encuentro una
que haga lo que yo en realidad quiero o que la haga sin tantos argumento y
sin matarse la cabeza tanto. Bueno las funciones SYS( ) nos prestan esta utilida
d.

?SYS(2020) Nos devuelve el Tamao del disco
?SYS(2023) Directorio de archivos temporales
?SYS(2022) Sectores por cluster
?SYS(5) Unidad de disco por defecto
?SYS(17) Tipo de Procesador
?SYS(2006) Clase de tarjeta de video

Existen muchas funciones ms pero considero que estas son las que ms ayudan si te
gusta interactuar con el Sistema Operativo.

----------------------------------
Conocer si un formulario esta ejecutado
Cuando estamos trabando en una aplicacin la mayora de veces
queremos evitar que un formulario se ejecute ms de una vez.
Con esta pequea explicacin y ejemplo lo hars.

IF WEXIST('nombreventana')
=messagebox("la ventana ya esta ejecutada")
ELSE
=DO FORM nombreform.scx
ENDIF
WEXIST te devuelve .T. si la ventana se encuentra ya ejecutada y .F. si
no lo esta. Tenemos que tener en cuenta que el nombre del la ventana es
el que le colocas en la propiedad NAME del Formulario.
En este caso el cdigo debe ir en el botn o men que llame
a la ventana, si el formulario se encuentra ejecutado entonces
mandar un mensaje sino lo ejecutara

----------------------------------
Calcular la edad de una Persona
Siempre nos da cacao tratar de determinar los aos que tiene una persona; presento
un procedimiento fcil para hallarla. Acepto sugerencia y modificaciones
fechanaci = {^1978/10/23}
edad = ROUND(((DATE() - fechanaci) / 365.25),0)
? edad
En el ejemplo la fecha de nacimiento es 23 octubre de 1978, por tanto debe
devolver que la edad es 23


-----------------------------
Determinar la Impresora predeterminada
Una de las tantas formas de devolver el nombre de la impresora predeterminada en
Windows
y en VFP

Obtiene la impresora predeterminada de Windows
?Set("Printer", 3)

Obtiene la impresora Predeterminada de Visual Fox Pro
?Set("Printer", 2)

----------------------------------------
Determinar si una aplicacin esta instalada
Cuantas veces no hemos querido saber si ya esta instalado Word, Excel u otra apl
icacin
en el equipo. En este ejemplo determinamos si se encuentra instalado Word en el
equipo
pero puede ser cualquier otra aplicacin.
oWord = createobject("word.application")
IF VARTYPE(oWord) # "O"
=Messagebox("Word no se encuentra instalado en este equipo")
return
endif


----------------------------
Manipular Formularios en el _Screen
Esta es solo una forma de acceder a los formularios contenidos en el _Screen.
El ejemplo cambia el ancho de los formularios ejecutados. Para probarlos puede
ejecutar varios formularios.
For each Form in Application.Forms
Form.Width = Form.Width + 200
EndFor


------------------------------
Cambiar la hora del Sistema Fcilmente
Este es un muy buen truco de como cambiar la hora del sistema utilizando el coma
ndo RUN
y la orden TIME del DOS
cFecha = "11:00:00"
RUN time &cFecha


-------------------------
Lista de Datos de Combo Box en Diferentes Colores
Muchas veces deseamos darle un presentacin atractiva a nuestras aplicaciones o
queremos resaltar algunos aspectos importantes de los objetos, manipulando adec
uadamente
las propiedades de estos.
En verdad algunos efectos especiales como el que mostrare cambian la
dinmica
de los objetos y contribuyen a darle ms vistosidad.
En este ejemplo har que un Combo Box muestre sus valores en distintos colore
s
de letra. As como lo muestra la siguiente figura:
Para esto en el evento Init del Combo Box colocamos el siguiente cdigo:
#DEFINE BarraRoja ,RGB(150,0,0)
#DEFINE BarraVerde ,RGB(0,150,0)
#DEFINE BarraAzul ,RGB(0,0,255)
#DEFINE BarraAmarillo ,RGB(255,255,0)
DEFINE POPUP Colores
DEFINE BAR 1 of Colores ;
Prompt "Rojo" COLOR BarraRoja
DEFINE BAR 2 of Colores ;
Prompt "Verde" COLOR BarraVerde
DEFINE BAR 3 of Colores ;
Prompt "Azul" COLOR BarraAzul
DEFINE BAR 4 of Colores ;
Prompt "Amarillo" COLOR BarraAmarillo
Cambie las siguientes propiedades de Combo Box
RowSourceType = 9 - Emergente
RowSource = Colores
Y en el evento InteractiveChange del Combo agregu el siguiente cdigo:
DO CASE
CASE This.Value = "Red"
This.Forecolor = RGB(150,0,0)
CASE This.Value = "Green"
This.Forecolor = RGB(0,150,0)
CASE This.Value = "Blue"
This.Forecolor = RGB(0,0,255)
CASE This.Value = "Yellow"
This.Forecolor = RGB(255,255,0)
ENDCASE
Espero las all gustado este ejemplo


-----------------------------------------
Evaluar Nmeros y Caracteres II
Esta forma devuelve verdadero cuando cada elemento de la cadena a averiguar es d
igito
sino devuelve falso
cCadena = "78x5p88yt"
nAnchoCadena = len(cTest)
FOR nCnt = 1 TO nAnchoCadena
? ISDIGIT(SUBSTR(cCadena, nCnt, 1))
ENDFOR
El resultado debe ser el siguiente:
.T.
.T.
.F.
.T.
.F.
.T.
.T.
.F.
.F.

--------------------------------------
Desplegar el Contenido de un Combo
En realidad muchas veces deseamos hacer esto, pero lo pensamos bastante
y no encontramos la forma de hacerlo. Por fin aqu esta su implementacin.
Crea un formulario y agrgale un Combo y un Botn. Al hacer click en el botn debe
desplegarse automticamente el Combo.
Programa lo siguiente en el evento Gotfocus del Combo
tColumna = THISFORM.Combo1.Left + THISFORM.Combo1.Width - 4
tFila = THISFORM.Combo1.Top + 2
MOUSE CLICK AT tFila, tColumna PIXELS WINDOW (THISFORM.Name)
En el evento Click del botn que creaste llama al evento Setfocus() del combo, As:
Thisform.combo1.Setfocus()


--------------------------------
Manipular Todos los Controles del Formulario Activo
Primero hacemos un ciclo hasta el numero de controles del formulario activo;
en este caso se mostraran el nombre de todos los controles del formulario.
Pero puede ser implementada segn utilidades y usos.
For nNumero = 1 to _Screen.Activeform.Controlcount
? _Screen.Activeform.Controls(nNumero).Name
EndFor


-------------------------------------------Manipular Formularios en el _Screen
Esta es solo una forma de acceder a los formularios contenidos en el _Screen.
El ejemplo cambia el ancho de los formularios ejecutados. Para probarlos puede
ejecutar varios formularios.
For each Form in Application.Forms
Form.Width = Form.Width + 200
EndFor


------------------------------------
Utilizar el MsComm
Para este ejemplo es necesario crear un formulario y agregarle un control active
MsComm, y creamos un botn. Este ejemplo llamara al nmero de telfono pasado en
la propiedad OUTPUT.
&&thisform.olecontrol1.SETTINGS="9800,N,8,1"
&& (Supongo el modem conectado al com4)
thisform.olecontrol1.COMMPORT = 4
thisform.olecontrol1.PORTOPEN = .T.
thisform.olecontrol1.OUTPUT = "ATDT6608196" +chr(13)
La secuencia de nmeros despus de ATDT es el numero telefnico al que queremos marcar


---------------------------------------------------
Evaluar Numeros y Caracteres
Algunas veces necesitas evaluar una expresin o una cadena de texto y determinar l
os
valores numricos o caracteres que tiene esta. A continuacin un pequeo de como hacer
lo
cCadena = "512 96 m sd 7ecbx */ t553rdv"
cAnchoCadena = len(cCadena)
cNumeros = ""
FOR nCnt = 1 TO cAnchoCadena
cCharacter = SUBSTR(cCadena, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumeros = cNumeros + cCharacter
? cNumeros
ENDIF
ENDFOR
El primer paso es tener la cadena de caracteres a evaluar. Luego determinamos el
ancho
de la cadena a travs de la funcin LEN; Utilizamos una variable donde almacenaremos

los caracteres que sean dgitos (de 0 - 9). Hacemos un ciclo hasta el numero de ca
racteres
de la cadena y vamos evaluando numero por numero; si el carcter es digito entonce
s ser
agregado a la variable cNumeros.


------------------------------
Mover un formulario sin agarranlo por la barra de titulo
Para realizar este ejemplo agregumosle al formulario las propiedades ejex, ejey,
mdown.
En el evento MouseMove del form agregamos lo siguiente
With thisform
If thisform.MDown Then
ThisForm .Left = ThisForm .Left + nXCoord - .ejex
ThisForm .Top = ThisForm .Top + nYCoord - .ejey
EndIf
EndWith
En el evento MouseDown del form agregamos lo siguiente
ThisForm.MDown = .F.

En el evento MouseDown del form agregamos lo siguiente
Thisform.MDown = .T.
Thisform.ejex = nXCoord
Thisform.ejey = nYCoord

-----------------------------------------
Busqueda en ListBox desde TextBox (Al estilo de la Ayudas)
Los valores del ListBox provienen de una tabla en este caso, pero pueden proveni
r
de cualquier origen de datos. Primero creamos un formulario y agregamos un TextB
ox
y un ListBox
En el evento InteractiveChange del TextBox programamos lo siguiente:
LOCAL nIndex
FOR nIndex = 1 TO Thisform.List1.ListCount
IF UPPER( Thisform.List1.ListItem(nIndex) ) = UPPER( ALLTRIM( this.Value
) )
Thisform.List1.ListIndex = nIndex
EXIT
ENDIF
ENDFOR
Thisform.List1.Refresh


-----------------------------------------
Ancho del Botn Ajustado al Texto Escrito en un TextBox
Este cdigo aun esta en prueba pero realmente funciona, lo programe porque necesit
aba
que el ancho del botn se ajustara a medida que yo escribiera en un TextBox.
Si alguien desea aportar y modificar el cdigo le ruego me enve una demostracin
para luego publicarla a su nombre.
Cree un formulario y agrguele un botn y un TextBox.
En el Evento InteractiveChange del TextBox programe lo siguiente:
cNoCaracteres = len(alltrim(thisform.text1.value)) * 5
Thisform.Command1.Width = cNoCaracteres + 70
Thisform.Command1.Width = cNoCaracteres + 60
Thisform.Command1.Caption = Alltrim(Thisform.Text1.Value)


--------------------------------------------
Determinar la Direccin IP del Equipo
Una forma de conocer la direccin IP del equipo es invocando una funcin API
,
pero comentare otra forma de hacerlo y es pasndole el parmetro al programa RUN
del DOS, el nico inconveniente es que se mostrara la ventana del DOS,
pero eso tambin tiene solucin y ser explicada en la seccin de APIS
Local F, X, Y, U, K
F = Sys(2023) + "\" + SubStr(Sys(2015),1,8) + ".txt"
X = SubStr(sys(0),1, At(" ", Sys(0))-1)
Run PING &X > &F
Y = FileToStr(F)
Delete File &F
U = At("[", Y) + 1
K = At("]", Y)
? SubStr(Y,U,K-U)
Lo primero que realiza este cdigo es definir algunas variables, luego obtiene
el directorio de archivo temporales y genera un archivo nico. A continuacin se
obtiene informacin sobre la unidad de red y estas valores se le pasan como parmetr
o
al programa PING.


------------------------------------
. Aplicaciones
. Bases de Datos
. Controles
. Direcciones
. Fechas y tiempo
. Ficheros
. Formularios
. Grficos
. Impresora
. Informes
. Internet
. Ms Agents
. Pantalla
. Redes
. SQL
. Tablas
. Varios
. Vistas y Consultas
Aplicaciones
Abrir fichero con el programa asociado
Agrerar lnea a un .exe
Cierre automtico si no hay actividad
Compartir proyecto
Conectar/Desconectar a unidad de red
Detectar si se est ejecutando .EXE o proyecto
Directorio de Windows. Obtener
Evitar que un programa activado desde VFP se cargue ms de una vez
FileSystemObject
Formularios abiertos
Grupo de programas. Crear
Hacer desaparecer las barras de herramientas
Identificar las unidades
Incluir rutinas de VB en VFP
Lanzar un programa y esperar a que termine
Logo en pantalla principal
Memoria. Limitar en VFP
Modificar clases base
Nmero de versin
Pasar parmetros a un ejecutable
Programa DOS. Ejecutar
Programar el objeto _screen
Saber los usuarios que estn usando la Aplicacin
Saber si finaliz un programa
Salvapantallas. Ejecutar desde VFP
Tamao del ejecutable. Reducir
Variable pblica
Word. Automatizacin
Bases de Datos
ADO en VFP
Bases de Datos de Access
Bases de Datos en aplicaciones multiusuario
Cambiar la localizacin de la Base de Datos
Cambiar la localizacin de la Base de Datos (1)
Cambiar la localizacin de la Base de Datos (2)
Conectarse con Access desde VFP
Conexin MySQL
Crear origen de datos ODBC 32 por programa
Direccionar ruta BD
Limpiar una Base de Datos
MSDE. Documentacin
ODBC. Conveniencia
ODBC. Crear conexin
Direcciones
ADO en VFP
Chat en VFP
Curso de ASP
Dialer para llamada telefnica
E-Mail en VFP
Empaquetar informacin para transmitir por modem
FileSystemObject
FoxPress
FrameWorks
Garbage Collection
Instalador Inno Setup
Librera FastLib
Manuales
Mensajes anteriores
MsAgent
MySql
Normalizacion
Portal de programacin
Portal de VFP
Proteger/Restaurar Outlook
Refox
Universal Thread
VFP.Net
Windows interface
Controles
Ancho de lista de un cuadro combinado
Asociar un ImageList a un control TreeView
Calendario
Cambiar el RecordSource a un grid
Cambiar la tecla pulsada
Cambiar propiedades a controles del mismo tipo
Combobox. Abrir lista
Combobox. Aadir valores
Comprobar si un control est registrado
Contar los controles de un formulario
Desinstalar OCX
Enviar al fondo
Gif animado. Tani.ocx
Grid. Bsqueda incremental
Grid. Cambiar colores
Grid. Columna desactivada
Grid. Mantener las propiedades
Grid. Marcar toda la lnea actual
Grid. Eliminar un control aadido
Grid. Ordenar columnas
MP3 en VFP
Otro control en columna de Grid
PageFrame y TabStrip
RichText. Imprimir
RTF
RTF. Impresin
TreeView. Borrar nodos
TreeView. Recorrer
TreeView. Saber botn presionado
TreeView. Versin
Ultimo enfoque
Windows Script Host
Fechas y tiempo
Calcular el primer da del mes
Calcular el ltimo da del mes
Calcular la diferencia de dos fechas en aos, meses y das
Calcular la edad
Calcular la fecha de semana santa
Cambiar la fecha y la hora del PC
Convertir una fecha a formato largo
Modificar fecha y hora
Obtener el nmero de da del ao
Primer dia del mes de un dia de la semana (primer viernes de Agosto...)
Transformar una cantidad de segundos a HH:MM:SS
Ficheros
Comprobar si hay disco en la Unidad
Escribir y leer un valor de un fichero INI
Existencia de ndice
Ficheros Cobol
Hacer un cursor modificable
Hacer un SEEK o INDEXSEEK a cualquier vista
Obtener los ficheros de un directorio
Saber si existe un directorio
Saber si un alias pertenece a una vista
Saber si se ha modificado un registro
Tratar ficheros .INI
Formularios
Copiar el DataEnvironment a otro formulario
Devolver ms de un valor desde un formulario
Formulario ovalado
Formulario redondo
Formulario transparente
Handle de un form
Imprimir un formulario
Matriz a un formulario como parmetro
Mover una ventana sin ttulo
Objetos de un formulario
ThisForm como parmetro
Grficos
Dibujar cuadro, lneas, etc.
Dimensin de una imagen
MsGraph. Tipos de grfico
.OCX similar a Paint
Impresora
Cambiar la Impresora por defecto
Cmo configurar Reports cuya longitud del impreso sea configurable por el usuario
en Win 9x/NT para impresoras matriciales
Controlar un poco la impresora
Cuelgues
Impresora por Defecto
Imprimir en cualquier impresora
Imprimir formularios
Papel de tamao personalizado
Puertos
Redireccionar impresion
Informes
2 tamaos para un report
3 informes en uno
Anclar la barra del preview
Centrar verticalmente un report
Cmo abrir un Report con un Zoom determinado
Cmo exportar los Report a HTML
Cmo incluir la Barra de Herramientas del diseador de Reports en tiempo de ejecucin
Cmo quitar el botn de imprimir de los Preview de los Report en los ejecutables
Contador de hojas
Crystal Report. Cambiar datos
Cristal Report. Enviar parmetros
Crystal Report. Informes
Enviar un informe por e-mail
Fuente predeterminada
Imprimir con formato de Excel
Imprimir texto DOS desde VFP
Informe con nmero total de pginas (Hoja x de y)
Informe en Word
Informe en HTML
Informes en miniatura
Impresoras matriciales
Interrumpir impresin
Imprimir varias copias de un informe
Maximizar venta de print preview
Nmero de copias de un Report
Nmero total de pginas
Preview de Report con seleccionar impresora
Quitar barra de herramientas
Tamao de Report Personalizado
Ttulos de los Report
Truco para el preview de los reports
Internet
Conexin a archivo
Descargar archivos
Direccin URL. Llamar a una
Enviar/Recibir mensajes con Outlook Express
Outlook Express. Libreta de direcciones
Outlook Express. Agregar registros a Libreta de direcciones
Pantalla
Cantidad de colores
Capturar la pantalla
Colores. Calcular
Ocultar/Mostrar la barra de tareas de Windows
Resolucin en pantalla
Redes
Dominio. Conocer
Hora del servidor
SQL
Buscar palabra en tabla
Valores .NULL.
Tablas
Actualizar datos que no existen en otra tabla
Append from desde una vista
Busca un campo en una tabla y retorna .T. si tuvo xito
Campos memo
Crear tablas con campos variables
Crear tablas de referencias cruzadas
Comprobar si ya existe un valor
Insertar registro en una posicin
Pasar datos de un cursor a una tabla
Renombrar campo de una tabla
Reparacin de encabezado (Tabla)
Tablas que pertenecen a una DBC
Ttulo del campo
Transaccin
Varios
Acceso directo en el escritorio
Actualizar el cursor de un grid
Apagar el PC
Api. Datos TYPE
Arrancar el Internet Explorer e ir a una pgina Web
C.C.C. Dgito de control
Copiar al portapapeles
Copiar, cortar y pegar
Conectar a Internet
Drivers. Listar
Ejecutar un sonido
Encriptacin de cadenas
Enviar un email por Outlook
Fax. Envio desde VFP
Formatear un diskette
Formatear un diskette (1)
Funcin de consecutivos
Funcin para quitar acentos
Funciones matemticas
Marcador telefnico
Nmero de serie del disco
Nmeros a letras
Nmeros a letras (1)
Pasar un nmero de color a formato RGB
Prototipos al vuelo
Tamao del disco
Uso de la coma como separador decimal
Validacin CIF
Vistas y Consultas
Consultas. Ejecucin
Poder hacer un SEEK o INDEXSEEK a cualquier vista
Nivel de optimizacin de consultas
Velocidad del select
Vistas. Como cambiar el criterio
Vistas. Como cambiar el formato de campos
Vistas actualizables
Vistas parametrizadas que contengan el contenido de un campo
Vistas parametrizadas en una cuadrcula
Aplicaciones
Abrir fichero con el programa asociado
Ejecutar el documento directamente con la sentencia RUN:
run /n start MiCarta.DOC
No olvidarse start.
Agregar lnea a un .exe
Gener un nuevo proyecto en Visual Fox Pro
Vas a la ventana de cdigo y agregs:
Set Century On
SET century to 19 ROLLOVER 85
Do programa.exe
Cierre automtico si no hay actividad
Tal vez te sea util usar el control TIMER y la funcion Lastkey(), si LastKey() c
ontiene el mismo valor que tienes guardado en una
variable entonces significa que no se presiono ninguna tecla en el lapso de tie
mpo que definiste en el control TIMER.
Compartir proyecto
Lo lgico y correcto seria usar la herramienta prevista para ello, el SourceSafe c
reo que se llama de micro$oft. Viene en la versin
empresarial de Visual Studio y creo que tambin se vende como producto independien
te.
De todas formas, y como solucin "CHAPUZA" (pero que yo la uso y funciona) consist
e en hacer una copia de los archivos
del projecto (.PJT y .PJX) con otro nombre y que cada uno de vostros abra un pro
yecto distinto. Asi no da
el error de que el archivo ya esta abierto. Evidentemente, lo que no podreis hac
er es abrir los dos usuarios el mismo form
o report o prg. Hay que tener cuidado con eso, pero por lo demas funciona.
Espero te sirva de ayuda.
Atentamente,
Pere Pujol i Espua
ADS Anlisi/Disseny de Soft, S.L.
<mailto:ppujol@adssl.com>
Conectar/Desconectar a unidad de red
Con estas funciones, puedes conectarse / desconectarse de una unidad de red.
--
Luis Mara Guayn
Tucumn - Argentina
*--------------------------------------------------------
* FUNCTION GetConnection(lcDrive)
*--------------------------------------------------------
* Retorna el nombre de la PC y recurso
* compartido de una conexin de red
* PARAMETROS: lcDrive
* USO: ? GetConnection("K:")
*--------------------------------------------------------
FUNCTION GetConnection(lcDrive)
DECLARE INTEGER WNetGetConnection IN WIN32API ;
STRING lpLocalName, ;
STRING @lpRemoteName, ;
INTEGER @lpnLength
LOCAL cRemoteName, nLength, lcRet, llRet
cRemoteName=SPACE(100)
nLength = 100
llRet = WNetGetConnection(lcDrive,@cRemoteName,@nLength)
lcRet = LEFT(cRemoteName,AT(CHR(0),cRemoteName)-1)
RETURN lcRet
ENDFUNC
*--------------------------------------------------------
* FUNCTION AddConnection(tcDrive,tcResource,tcPassword)
*--------------------------------------------------------
* Conecta un recurso compartido a la unidad tcDrive
* USO: ? AddConnection("Z:","\\PC_REMOTA\RECURSO <file://\\PC_REMOTA\RECURSO>")
*--------------------------------------------------------
FUNCTION AddConnection(tcDrive,tcResource,tcPassword)
LOCAL lnRet
DECLARE INTEGER WNetAddConnection IN WIN32API;
STRING @lpzRemoteName, ;
STRING @lpzPassword,;
STRING @lpzLocalName
IF PARAMETERS() < 3
lnRet = WNetAddConnection(@tcResource,0,@tcDrive)
ELSE
lnRet = WNetAddConnection(@tcResource,@tcPassword, @tcDrive)
ENDIF
IF lnRet # 0
RETURN "Error " + ALLT(STR(lnRet)) + ;
" al conectar el drive " + tcDrive
ENDIF
RETURN ""
ENDFUNC
*--------------------------------------------------------
* FUNCTION CancelConnection(tcDrive)
*--------------------------------------------------------
* Desconecta una unidad de red
* USO: ? CancelConnection("Z:")
*--------------------------------------------------------
FUNCTION CancelConnection(tcDrive)
LOCAL lnRet
DECLARE INTEGER WNetCancelConnection IN WIN32API;
STRING @lpzLocalName, ;
INTEGER nForce
lnRet = WNetCancelConnection( @tcDrive, 0)
IF lnRet # 0
RETURN "Error " + ALLT(STR(lnRet)) + ;
" al desconectar el drive " + tcDrive
ENDIF
RETURN ""
ENDFUNC
*--------------------------------------------------------
Detectar si se est ejecutando .EXE o proyecto
Version(2) = 0 && Ejecutable
Version(2) = 2 && Proyecto
Directorio de Windows. Obtener
GETENV('WINDIR').
Evitar que un programa activado desde VFP se cargue ms de una vez
La misma funcin que hemos visto en el caso anterior puede ser usada para evitar q
ue un programa externo se cargue ms de una vez.
Un ejemplo sencillo es el de la calculadora de Windows.
Imaginemos que en nuestra aplicacin demos la posibilidad de utilizar la calculado
ra. Pondramos una lnea come esta:
RUN /N CALC.EXE
Pero si esta lnea la ejecutamos ms de una vez, se cargars la calcuadora una y otra
vez.
* Antes de activar la calculadora:
IF NOT F_ActivaWin("Calculadora")
* La calculadora no est cargada:
RUN /N CALC.EXE
ENDIF
* Y ESTA ES LA FUNCION QUE LO HACE TODO:
*-----------------------------
FUNCTION F_ActivaWin(cCaption)
*-----------------------------
LOCAL nHWD
DECLARE INTEGER FindWindow IN WIN32API ;
STRING cNULL, ;
STRING cWinName
DECLARE SetForegroundWindow IN WIN32API ;
INTEGER nHandle
DECLARE SetActiveWindow IN WIN32API ;
INTEGER nHandle
DECLARE ShowWindow IN WIN32API ;
INTEGER nHandle, ;
INTEGER nState
nHWD = FindWindow(0, cCaption)
IF nHWD > 0
* VENTANA YA ACTIVA
* LA "LLAMAMOS":
ShowWindow(nHWD,9)
* LA PONEMOS ENCIMA
SetForegroundWindow(nHWD)
* LA ACTIVAMOS
SetActiveWindow(nHWD)
RETURN .T.
ELSE
* VENTANA NO ACTIVA
RETURN .F.
ENDIF
FileSystemObject
<http://msdn.microsoft.com/library/devprods/vs6/vbasic/vbenlr98/vaobjfilesystemo
bject.htm>
Formularios abiertos
*- borrar todos los formularios de la memoria.
*- si no quedo ningun form corriendo, este metodo devuelve .t.
*- y .f. en caso de error o que no se hayan cerrado todos los formularios
*- abiertos.
Local lDevolver
DoEvents
lDevolver = .T.
For EACH oformsAbiertos IN APPLICATION.FORMS
*!* If oformsAbiertos.WINDOWTYPE = 1
*!* lDevolver = .F.
*!* Exit
*!* Endif
If !oformsAbiertos.Salir() && o .release()
*- mis forms base tienen un metodo SALIR...
lDevolver = .F.
Exit
Endif
Next
Return lDevolver
Grupo de programas. Crear
Un gran colaborador de este grupo de noticias, me envio esto, espero te sirva:
En el paso 6 del asistente de instalacin, buscas el ejecutable de tu aplicacin y c
lick en la casilla que pone
"administrador del programa". Entonces deber de salir una pantalla en la que deb
es especificar una descripcin de tu
aplicacin y en la casilla lnea de comando colocas:
%s\aplicacion.exe (Logicamente aqu pones el nombre real de tu
programa, no olvides el %s).
Axel Olivares
Hacer desaparecer las barras de herramientas
If WVisible(Estndar)
Hide Window Estndar
EndIf
Y as con todas las dems.
Identificar las unidades
Ariel: Quizs con esto puedas "ir tirando" hasta conseguir lo que buscas
*------------------------------------------------------
FUNCTION ListDrives()
LOCAL ln, lnTipo
FOR ln = 65 TO 92
lnTipo = DRIVETYPE(CHR(ln))
DO CASE
CASE lnTipo = 1
*--- Ningn tipo
CASE lnTipo = 2
? CHR(ln)+": Disquete"
CASE lnTipo = 3
? CHR(ln)+": Disco duro"
CASE lnTipo = 4
? CHR(ln)+": Unidad de red o unidad extraible "
CASE lnTipo = 5
? CHR(ln)+": CD-ROM"
CASE lnTipo = 6
? CHR(ln)+": Disco RAM"
ENDCASE
ENDFOR
RETURN ""
ENDFUNC
*------------------------------------------------------
Luis Mara Guayn
Tucumn - Argentina

Puedes usar el File System Object:
oFSO = CREATEOBJECT('Scripting.FileSystemObject')
For Each oDrive in oFso.Drives
? oDrive.DriveLetter
EndFor
declare laDiscos[6]
laDiscos[1] = "Desconocido"
laDiscos[2] = "Removible"
laDiscos[3] = "Particin Local"
laDiscos[4] = "Compartido LAN"
laDiscos[5] = "CD-ROM"
laDiscos[6] = "RAM Disk"
For Each oDrive in oFso.Drives
n = oDrive.DriveType
? oDrive.DriveLetter + ":\" + SPACE(4) + laDiscos(n+1)
EndFor
--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------

Incluir rutinas de VB en VFP
Compilala como un componente COM y listo. Distribuyes el dll junto con tu aplica
cion.
Asi la puedes llamar desde VFP, Excel, Word, etc.
Lanzar un programa y esperar a que termine
Usando Windows Scripting Host.
LOCAL loWshShell
* Se hace cosas antes de ejecutar
loWshShell = CreateObject("WScript.Shell")
loWshShell.Run(<path de exe>, 1, .T.)
*Se hacen cosas despues de ejecutar
Pasando .t. en el tercer parmetro del mtodo RUN fuerza a VFP esperar hasta que el
EXE llamado termine.
Logo en pantalla principal
Efectivamente como dice Alex, @ ... SAY es conveniente no usarlo. Si no quieres
usar
_screen.image = "d:\MiArchivo.jpg"
puedes controlar el tamao y la posicin con:
_screen.addobject("oImg", "image")
_screen.oImg.picture = "d:\consulta\dv.jpg"
_screen.oImg.visible = .T.
_screen.oImg.stretch = 1
_screen.oImg.width = 640
_screen.oImg.height = 400
--
Luis Mara Guayn
Tucumn - Argentina
Memoria. Limitar en VFP
Debes chequear la funcion SYS(3050), resulta que VFP usa la memoria virtual de w
indows, por lo tanto esta usando mas ram de
la que posee fisicamente, y en consecuencia el uso es 'indiscriminado'.
Con esta funcion puedes setear tanto en foreground como en background. Y segun c
uentan se deberia probar mas o menos al tercio
de lo que te informa la primera vez...
Pero la recomendacion es que seteas tu necesidad o vayas bajando de a un k para
ir probando la performance.
Ademas de lograr un mejor control de memoria, tendras un mejor aprovechamiento q
ue redundara en mayor velocidad de ejecucion.
Claudio Campos
Modificar clases base
En tools->options->field mapping y ah podes especificar que classes debe usar VFP
para cada tipo
Hugo
Nmero de versin
ln = AGETFILEVERSION(laArray,"C:\Exe\MiApp.exe")
DISP MEMO LIKE laArray

FOR lnI = 1 to ln
? laArray(lnI)
ENDFOR
Luis Mara Guayn
Tucumn - Argentina
Pasar parmetros a un ejecutable
En el prg principal debes tener en la primera lnea:
PARAMETERS uParam1, uParam2, uParam3
Cuando ejecutes tu programa le debes pasar los parametros de la siguiente manera
:
C:\Aplicaciones\MiPrg.exe PARAMETRO1 1245 OTRO
Recuerda que todos los parametros pasan al ejecutable como del tipo caracter.
Luis Mara Guayn
Tucumn - Argentina
Programa DOS. Ejecutar
Corre el programa en DOS desde Windows Scripting Host, pasando un parmetro .T. pa
ra que corra en forma sincrnnica (o sea que espere).
#define SW_SHOW_NORMAL 1
#define SW_SHOW_MINIMIZED 2
#define SW_SHOW_MAXIMIZED 3
oShell = createobject("WScript.Shell")
oShell.Run("notepad.exe",SW_SHOW_NORMAL,.T.)
--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------
Programar el objeto _screen
No se pueden programar directamente, pero un truco que se puede usar es, en una
clase tuya agreg un puntero a _screen,
luego puedes reprogramar los mtodos del mismo. Por ejemplo
_screen.newobject('sc', 'ScreenController', 'sc.prg')
* SC.PRG
define class ScreenController as custom
oScreen = _screen
function oScreen.resize
wait window 'Cambiando el tamao de la ventana principal' nowait
endfunc
function oScreen.mousedown(nButton, nShift, nXCoord, nYCoord)
wait window 'Mouse down at: '+alltrim(str(nXCoord))+',
'+alltrim(str(nYCoord))
dodefault(nButton, nShift, nXCoord, nYCoord)
endfunc
enddefine
Pero no logr que funcione queryunload, pero igual no creo que sea
necesario ya que puedes usar para el mismo on shutdown o no? (no estoy
muy seguro)
Hugo

Saber los usuarios que estn usando la Aplicacin
Te contar como controlo yo este tema de los usuarios en aplicaciones en red, quizs
te pueda servir.
Aado una tabla adicional con los siguientes campos: Puesto, Fecha, Hora, Usuario
En esta tabla, al configurar el puesto de red para que pueda operar con la aplic
acin, el proceso agrega un registro a dicha tabla
y deja en el campo "Puesto" el valor de sys(0) que devuelve como ya sabrs (la mqui
na de red cuando se utiliza VFP en un entorno de red.)
Cuando una mquina, arranca la aplicacin lo primero que hace es buscar en dicha tab
la su sys(0)
SELE "loquesea"
LOCATE FOR sys(0) $ "loquesea".puesto
*** y si no lo encuentra est claro que no se le permite seguir ....
IF eof() && no se encontr
***(mensaje de: terminal no autorizado y a la P. calle)
QUIT
ENDIF
si lo encuentra, BLOQUEA EL REGISTRO Y pone en los campos fecha, hora, usuario l
os respectivos valores
SET REPROCESS TO 1
IF .not. lock() && ya esta bloqueado la aplicacin esta arrancada en este puesto
quit && salida
ENDIF
REPLACE "loquesea".Fecha WITH date(), "loquesea".Hora with time(),
"loquesea".Usuario with m.user
SET REPROCESS TO "lo que uses habitualmente"
Este bloqueo, lo mantengo hasta que salga de la aplicacin como se debe salir y en
tonces deja en blanco los campos fecha,
hora, usuario a la vez que desbloquea el registro.
REPLACE "loquesea".Fecha WITH {" "}, "loquesea".Hora with "",
"loquesea".Usuario with ""
unlock
La ventaj que esto tiene, es que al salir de la aplicacin "de forma incorrecta, p
or error, apagon etc" se desbloquea el registro si bien
quedan anotados los datos del puesto, usuario, fecha y hora; los que borro si sa
le como es debido.
Si al entrar en la aplicacin, el registro est bloqueado, es seal de que ya tiene ab
ierta la aplicacin y seguramente la tiene
minimizada por lo que puedes procedo a levantarsela y no seguir en esta nueva a
pertura.
Si al entrar en la aplicacin, no esta bloqueado el registro pero resulta que se e
ncuentra los valores de fecha, hora, usuario;
es seal de que la vez anterior que entr, no salido de forma correcta; en tal caso
procedo a lanzarle un mensaje de
SEVERO Y PELIGROSO AVISO ( ...tal usuario, entro en fecha y hora a la aplicacin
y no salio como deba,
"es la XXXX vez que se apaga de forma ilegal" operacin muy peligrosa, posible pe
rdida de datos ...avise al servicio tecnico...)
No te puedes hacer idea, de lo bien que queda uno cuando hay problemas y puedes
mirar y decirles que ya se ha salido
de la aplicacin 23 veces de forma incorrecta, que que es lo que quieren que hagas
?, merece la pena guardar estos incidentes
ya que seguramente, acabarn por mostrarte que puestos tienen problemas, bien sea
de operador o de mquina o quizs de
windows, reinstalar nuevamente el windows en algunas mquinas suele ser el final d
e muchos problemas.
Para saber si un terminal, esta conectado, o cuantos hay conectados solamente ha
br que repasar la tabla en cuestin y contar el
numero de registro bloqueados.
SET REPROCESS TO 1
SELE "loquesea"
GO TOP
m.contador=0
DO WHIL .not. eof()
m.contador=m.contador+IIF(lock(),0,1)
unclock
SKIP
ENDD
SET REPROCESS TO "lo que uses habitualmente"
? "Hay "+str(m.contador)+" terminales conectados"
Espero que todo lo anterior, te pueda servir de algo; En cualquier caso, un salu
do a Todos
jesse
Saber si finaliz un programa
#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
* This controls how long, in milli secconds, WaitForSingleObject()
* waits before it times out. Change this to suit your preferences.
#DEFINE WAIT_INTERVAL 200
DECLARE INTEGER CreateProcess IN kernel32.DLL ;
INTEGER lpApplicationName, ;
STRING lpCommandLine, ;
INTEGER lpProcessAttributes, ;
INTEGER lpThreadAttributes, ;
INTEGER bInheritHandles, ;
INTEGER dwCreationFlags, ;
INTEGER lpEnvironment, ;
INTEGER lpCurrentDirectory, ;
STRING @lpStartupInfo, ;
STRING @lpProcessInformation
DECLARE INTEGER WaitForSingleObject IN kernel32.DLL ;
INTEGER hHandle, INTEGER dwMilliseconds
DECLARE INTEGER CloseHandle IN kernel32.DLL ;
INTEGER hObject
DECLARE INTEGER GetLastError IN kernel32.DLL
* STARTUPINFO is 68 bytes, of which we need to
* initially populate the 'cb' or Count of Bytes member
* with the overall length of the structure.
* The remainder should be 0-filled
start = long2str(68) + REPLICATE(CHR(0), 64)
* PROCESS_INFORMATION structure is 4 longs,
* or 4*4 bytes = 16 bytes, which we'll fill with nulls.
process_info = REPLICATE(CHR(0), 16)
* Start a copy of NOTEPAD (EXE name must be null-terminated)
File2Run = "C:\WINNT\NOTEPAD.EXE" + CHR(0)
* Call CreateProcess, obtain a process handle. Treat the
* application to run as the 'command line' argument, accept
* all other defaults. Important to pass the start and
* process_info by reference.
RetCode = CreateProcess(0, File2Run, 0, 0, 1, ;
NORMAL_PRIORITY_CLASS, 0, 0, @start, @process_info)
* Unable to run, exit now.
IF RetCode = 0
=MESSAGEBOX("Error occurred. Error code: ", GetLastError())
RETURN
ENDIF
* Extract the process handle from the
* PROCESS_INFORMATION structure.
hProcess = str2long(SUBSTR(process_info, 1, 4))
DO WHILE .T.
* 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(hProcess, WAIT_INTERVAL) != WAIT_TIMEOUT
EXIT
ELSE
DOEVENTS
ENDIF
ENDDO
* Show a message box when we're done.
=MESSAGEBOX ("Process completed")
* Close the process handle afterwards.
RetCode = CloseHandle(hProcess)
RETURN
********************
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
Salvapantallas. Ejecutar desde VFP
Puedes ejecutar tu salvapantallas desde VFP con:
RUN /N black16.scr /S
Prueba cambiar el nombre del archivo .SRC con los que se encuentran en tu PC.
--
Luis Mara Guayn
Tucumn - Argentina
Tamao del ejecutable. Reducir
. Excluir los formularios
. Excluir los reportes y las tablas.
. No poner imgenes muy pesadas. Si ests en VFP convierte los BMP's a JPG's GIF's
. Si incluyes una Base de Datos (solo de vistas o conexiones) hazle un PACK DATA
BASE
. Men 'proyecto' - Limpiar proyecto
. Men 'Proyecto' - 'Informacin del proyecto' - Quitar marca 'informar de depuracin.
. Limpiar bibliotecas de clases (vcx)
Variable pblica
Se trata (habitualmente) de un objeto de clase base 'custom' con muchos mtodos pe
rsonales que vas a usar a lo largo de toda la
aplicacin y con propiedades que necesitas acceso rpido a ellas sin leer tablas. Tpi
co:
codigo de usuario, pais, moneda, empresa, etc.... Metodos para calcular la letra
del nif, los cdigos de control de una cuenta, etc.
Puedes aprovecharlo tambin para guardar algunos datos que necesites en un momento
determinado. Por ejemplo puede ser una
buena idea que tenga una propiedad 'datos(20)' que uses para guardar valores.
Se define como pblica y se crea en el 'main' del proyecto
public oApp
oApp = createobject("miobjetoaplicacion", par1, par2, ...)
Y en cualquier lugar de la aplicacin puedes referirte a el
oApp.datos(3) = m.nMidato
m.nMidato2 = oApp.datos(5)
etc...
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Word. Automatizacin
loWord = CREATEOBJECT("Word.Application")
loWord.Application.WindowState = 1 && wdWindowStateMaximize
loWord.Documents.Add()
loWord.Selection.TypeText(el texto que se desee)
loWord.Application.Visible = .T.
loRange = loWord.ActiveDocument.Range()
loRange.InsertAfter("Visual FoxPro es super!")
loWord.ActiveDocument.SaveAs("c:\temp\test.doc")
*loWord.PrintOut()
*loWord.Quit()
*release lorange, loWord
.activeDocument.Content.InsertParagraphAfter
.activeDocument.Content.tables.add(.selection.range, renglones, 3)
---------------------
with oWord.selection.tables(1)
.borders(wdborderleft).linestyle = wdlinestylenone
.borders(wdborderright).linestyle = wdlinestylenone
.borders(wdbordertop).linestyle = wdlinestylenone
.borders(wdborderbottom).linestyle = wdlinestylenone
.borders(wdborderhorizontal).linestyle = wdlinestylenone
.borders(wdbordervertical).linestyle = wdlinestylenone
end with
Por supuesto necesitas la cabecera de office para acceder a las constantes.
Si no la tienes:
wdlinestylenone = 0
wdborderleft = -2
wdborderright = -4
wdbordertop = -1
wdborderbottom = -3
wdborderhorizontal = -5
wdbordervertical = -6
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Bases de Datos
ADO en VFP
Es perfectamente posible usar ADO con VFP.
loConnection = createobject("ADODB.Connection")
lcConnectString = "Provider=SQLOLEDB,1;Data Source=MiServidor;User
ID=sa;Password= "
loConnection.Open(lcConnectString)

Fjate en los documentos y ejemplos en Internet:



Este artculo de John V. Petersen es excelente:
<http://msdn.microsoft.com/library/techart/ADOJump.htm>

El WIki de Fox tiene mucho material sobre VFP+ADO:
<http://fox.wikis.com/wc.dll?Wiki~CategoryADO>

Alli encontras un buen juego de ejemplos en:
<http://fox.wikis.com/wc.dll?Wiki~UsingADO~WIN_COM_DNA>

En tu ejemplo, te faltan los parntesis en la funcin Open() (VB no los necesita ya
que lo usa como sentencia)

Aqui te reproduzco el ejemplo simple que da Andy McNeill para acceder a tablas d
e VFP a travs de ODBC y ADO:

objConn = Createobject("ADODB.Connection")
objRS = Createobject("ADODB.Recordset")
cSQL = "SELECT * FROM Customers"
objConn.Open("mydata","","")
objRS.Open(cSQL,objConn,3)
HTH
--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------
Bases de Datos de Access
Si creamos vistas remotas actualizables de todas las tablas de la .Mdb, podremos
manejar la Base de Datos de Access desde Visual Foxpro.
Bases de Datos en aplicaciones multiusuario
Tambien meto mi cuchara en esta sopa... :-) Opino que la mejor forma de manejar
el tema de la base de datos en aplicaciones multiusuario
es la de no incluir la misma en los instaladores sino "generarla" desde la aplic
acin.
El procedimiento es ms o menos as:
1) Se ejecuta la utilidad GENDBC de VFP la cual genera un programa que "reconstr
uye" la base de datos.
2) Se incluye este programa en el proyecto de la aplicacin.
3) Generar los instaladores de la aplicacin excluyendo la base de datos.
4) Instalar la aplicacin en una de las estaciones
5) Ejecutar la aplicacin
6) La aplicacin tratar de cargar la ruta a la base de datos desde un archivo de c
onfiguracin (DBF, INI, MEM como prefieran)
7) Al no encontrar la ruta, el programa pregunta si se desea "conectar" a una ba
se de datos existentes o desea crear una nueva.
La opcin de conectar lo que hace es mostrar el dilogo de seleccin de directorio par
a que el usuario indique la ubicacin de la base de datos; la opcin de crear la bas
e de datos pide la ubicacin de la misma y la genera utilizando el programa genera
do por la utilidad GENDBC.
8) Se selecciona la opcin de "crear BD" para crear la base de datos vacia
9) Se sale del programa.
10) Se repiten los pasos 4, 5 y 6, solo que esta vez se selecciona la opcin "Cone
ctar con BD".
Este mecanismo ya fu implementado en una aplicacin masiva multiusuario y funciona
de maravillas; claro, solo para bases de datos VFP:
cliente-servidor es otra cosa...
Victor
Cambiar la localizacin de la Base de Datos
Los formularios almacenan el path de las tablas definidas en el Entorno de Datos
. Por desgracia cuando se distribuye la aplicacin,
estos formularios pueden apuntar al directorio donde se desarrollaron. Estos pat
hs deben ser reseteados en tiempo de ejecucin
para asegurarnos que apuntan a las tablas correctas.
* en el programa principal o en la de conexion determinar el directorio actual
* almacenarlo en variables globalos o del objeto aplicacin.
gcAppPath = sys(2003)
gcDBPath = alltrim(gcAppPath)+"\datos\"
gcDBName = "mibasededatos.dbc"
Poner en el entorno de datos la propiedad AutoOpenTables = .F.
modificar la clase base del formulario (o cambialo en cada formulario) en el Met
odo Load:
* apuntar todas las tablas al directorio y base de datos correcto thisform.SetAl
l("Database",gcDbPath+gcDbname,"Cursor")
* abrir las tablas
thisform.dataenvironment.opentables()
*NOTA: esto funciona con tablas de una base de datos, este codigo debe ser modif
icado si se usan tablas libres.
Saludos,
Pablo Roca
La Corua - Espaa
<http://pagina.de/visualfox> (Portal Gratuito de VisualFoxPro en espaol)
Cambiar la localizacin de la Base de Datos (1)
ID Artculo:
Fecha de Creacin:
Fecha de Revisin:
E10117
22-nov-1996
19-APR-1997
La informacin en este artculo se refiere a:
-Microsoft FoxPro, versin 3.0
RESUMEN
En este artculo encontrar informacin de cmo cambiar en el Entorno de datos la locali
zacin de la Base de datos.
MS INFORMACIN
El Entorno de datos contiene informacin sobre todas las tablas, vistas, y relacio
nes que interactuan con un Formulario.
En el Generador de Formularios, cuando se aade una tabla al Entorno de datos, la
propiedad Database del cursor se establece
con el camino completo de directorios y el nombre de la Base de datos contenedor
a (.DBC). El path que contiene la propiedad
Database se establece como absoluto.
Si la base de datos no se encuentra al abrir el Formulario, aparecer el siguiente
error:
"Error al crear instancia de objeto Cursor. No se puede
encontrar.<base de datos>"
El cdigo de ejemplo de este artculo, proporciona un mtodo de modificar el PATH cont
enido en la propiedad Database.
MS INFORMACIN
Cuando una tabla se aade al Entorno de datos por medio del Generador de Formulari
os, se crea un objeto cursor. Si la tabla forma
parte de un DBC, la propiedad Database (solo lectura en modo diseo) del cursor se
establece con el path completo y el nombre del DBC.
Sin embargo, puede que se necesite cambiar o modificar el path absoluto al DBC c
uando se distribuya la aplicacin. Por ejemplo,
diferentes usuarios pueden abrir bases de datos con el mismo nombre, pero situad
as en diferentes directorios. Si usted necesita referenciar
una base de datos en un directorio diferente al que est especificado en la propie
dad Database del Objeto Cursor, puede hacerlo usando el
comando SET PATH, antes de que el programa llame al Formulario, indicando la nue
va localizacin de la Base de datos. Si la Base de datos
especificada en la propiedad Database del cursor no se encuentra en el directori
o tambin especificado por dicha propiedad, Visual FoxPro
seguir buscando en todos los directorios indicados por SET PATH.
Otra alternativa es cambiar la propiedad Database en tiempo de ejecucin, que es d
e lectura/Escritura.
El ejemplo siguiente ofrece flexibilidad a su cdigo, actualizando el path de la p
ropiedad DATABASE de todos los objetos Cursor
que hubiera en el Entorno de datos. Este cdigo puede actualizar el path de difere
ntes bases de datos referenciadas en el Entorno de datos.
Solo se referencia un directorio en el ejemplo, as que necesitar modificar el cdigo
si quiere abrir Bases de datos de varios directorios.
Para usar este ejemplo:
1. Cree dos variables accesibles por el Formulario. Por ejemplo, si
llama al Formulario desde un.PRG, introduzca la siguiente
declaracin:
PUBLIC Data_Drive, Data_Path
-Data_Drive. Contiene la unidad y dos puntos.
Data_Drive = "C:"
-Data_Path. Contiene el nuevo PATH acabado en backslash.
Data_Path = "\DATOS\ALMACEN\ARTICULOS\"
2. Introduzca el siguiente cdigo en el evento BeforeOpenTables del
DataEnvironment. El comando WAIT WINDOW es solo ilustrativo, si
lo desea puede eliminarlo.
IF !EMPTY(Data_Path) and !EMPTY(Data_Drive)
* Crea una matriz bidimensional con todos los componentes
* del DataEnvironment. Para ver su contenido use DISPLAY
MEMORY =AMEMBERS(A_Cursors,THISFORM.dataenvironment,1)
* Ordena la matriz ascendentemente por la segunda columna
=ASORT(A_Cursors, 2)
* Busca el primer Objeto en la matriz y devuelve su posicin
nStartpos=ASUBSCRIPT(A_Cursors, ASCAN(A_Cursors,
"Object"),1)
* Recorre uno por uno los elementos de la matriz, empezando
* por la posicin calculada en el paso anterior
FOR I = nStartpos TO ALEN(A_cursors,1)
IF A_Cursors(i,2) = "Object"
cObjClass = "THISFORM.DATAENVIRONMENT."
+a_cursors(i,1)+".class"
* Si el elemento es un Cursor
IF EVAL(cObjClass)="Cursor"
cObjName="THISFORM.DATAENVIRONMENT." ;
+ A_Cursors(i,1)+".DATABASE"
WAIT WINDOW cObjName
Data_Name=EVAL(cObjName)
WAIT WINDOW "Data_Name es : "+ Data_Name
* Modifica el path de la base de datos
NewDataPath=ALLTRIM(Data_Drive)+
ALLTRIM(Data_Path) ;
+ ALLTRIM(SUBSTR(Data_Name,
RAT("\",Data_Name)+1))
WAIT WINDOW NewDataPath
* Evala el objeto cursor
oRef = EVAL( "THISFORM.DATAENVIRONMENT."
+a_cursors(i,1) )
* Modifica la propiedad Database con el nuevo
* path.
oRef.Database = NewDataPath
ENDIF
ELSE
EXIT
ENDIF
ENDFOR
ENDIF
Cambiar la localizacin de la Base de Datos (2)
Quiero poner mi granito de arena en este tema. La funcin que anexo al final del m
ensaje actualiza la propiedad Database de
todos los objetos Cursor definidos en un DataEnvironment, a fn de que apunten al
DBC actualmente seleccionado.
La llamada se hace desde el evento BeforeOpenTables del objeto DataEnvironment
de la forma:
SetCursorDBC(THIS,gcDBCPath)
donde:
gcDBCPath: nombre y ubicacin del archivo DBC actual.
********************************************
Victor Espina
<http://www.mitrompo.com/vespina>
* SetCursorDBC
* Establece la propiedad Database de todos los objetos Cursor que
* contenga el dataenvironment indicado en la propiedad poDataEnvironment
*
Proc SetCursorDBC(toDataEnvironment,tcDBC)
*
*-- Si no se indicaron parmetros o toDataEnvironment no es un objeto, se
cancela el mtodo
local lnNumParams
lnNumParams=parameters()
if lnNumParams=0 or type("toDataEnvironment")<>"O"
return
endif
*-- Se actualiza la propiedad Database de todos los objetos Cursor del
dataenvironment
local i,j,vCursor
local array laCursors[1]
j=amembers(laCursors,toDataEnvironment,2)
with toDataEnvironment
*
for i=1 to j
*
vCursor=eval("."+laCursors[i])
if vCursor.BaseClass<>'Cursor'
loop
endif
if not empty(vCursor.Database)
vCursor.Database=tcDBC
endif
endfor
endwith
EndProc
7
Conectarse con Access desde VFP
Tienes que crear un DSN de sistema ,desde el mismo panel de control, con el cont
rolador de Access, le das un nombre
descriptivo y lo conectas a tu mdb.
Y dentro de tu programa haces:
nConexion=sqlconnect(NombredeconexionODBC) && Devuelve -1 si no hay conexion
cSQL="select * from tabladeaccess"
sqlexec(nConexion,csql,NombreCursoradevolverlosdatos)
Espero que te sirva de algo
Un saludo
Oscar Fernandez
Madrid-Espaa
Conexin MySQL
Simplemente con una conexion ODBC que se puede conseguir en su pagina www.mysql.
com <http://www.mysql.com> en el
apartado download, myodbc.
Basta crear, una vez instalado, una conexion con DNS y conectar con SQLCONNECT(<
nombre del dns>) o hacerlo sin crear
conexion con DNS, de esta forma:
sqlsetprop(0,"DISPLOGIN",3)
<variable> = sqlstringconnect("DB=<nombrebasedatosmysql>;SERVER=<Dir.Ipdonde est
a el servidor de mysql>;
UID=root;PWD=;PORT=3306;OPTION=25;STMT=";DRIVER={MySQL};DSN='')
a partir de aqui, y de cualquiera de las dos formas anteriores, teneis el numero
de conexion en <variable> y "atacas" a mysql
con ordenes del tipo:
sqlexec(<variable>,"SELECT * FROM ...",<nombredelcursor>), etc.
Vuelvo a insistir en que es un sistema muy estable y que nos esta dando unos res
ultados fantasticos. Ademas, a partir de la version
creo que 3.23.19 (ahora va por la 3.23.24), tiene replicacion de bases de datos
entre un maestro y n esclavos.
Nosotros tenemos dos servidores cada uno con las mismas bases de datos mysql; ca
da vez que modificamos un registro en
el servidor maestro nos esta actualizando, automaticamente, el servidor esclavo
. Ademas no hay limite en poner tantos servidores
esclavos como se quiera. Nuestro miedo estaba en que cayera la velocidad de proc
eso pero no
lo ha hecho en absoluto.
Solo una cosa mas. Aunque MySql nacio para Linux es perfectamente utilizable en
Windows, de hecho nosotros la estamos utilizando
con servidores NT. La velocidad de actualizacion de las versiones es muy alta, i
ncluyendo mejoras
continuas. Ademas MySql es muy, muy rapido, ..., en windows. Con un servidor Lin
ux vuela.
Si necesitais mas ayuda quedo a vuestra disposicion.
Un saludo.
Rafael Mateo Rivero
Crear origen de datos ODBC 32 por programa
Hola Edison, yo lo pude hacer mediante una Api, no se si se puede de otro modo,
te paso el codigo, espero te sirva.
DECLARE Short SQLConfigDataSource IN ODBCCP32 Long hwndParent, Integer
fRequest, String @lpszDriver, String @lpszAttributes
# DEFINE ODBC_ADD_DSN 1 && Agrega un Data Source
lnResp = SQLConfigDataSource( 0, ODBC_ADD_DSN, "SQL Server", ;
"DSN=" + "Miodbc" + CHR(0) + ;
"Description=" + "bla bla bla bla" + CHR(0) + ;
"Database=" + "Midb" + CHR(0) + ;
"Server=" + "servidor_mio" + CHR(0) + ;
"Trusted_Connection=1" CHR(0) + ; && 1 significa NT autentificacion, 0
Sql autentificacion
"UseProcForPrepare=0" + CHR(0) )
IF lnResp = 0
MESSAGEBOX("No se pudo crear el ODBC", 48 , "ERROR")
llRt = .F.
ELSE
* MESSAGEBOX("BIEEEEEEEEEN ", 48 , "OK")
llRt = .T.
ENDIF
PD: la informacin para hacer esto la saque de aca:
<http://www.konstruct.com/fox/articles/article1.htm> fijate, para quedar mas cla
ro lo anterior.
Saludos, Emiliano
Direccionar ruta BD
Hola Oscar. Yo utilizo el botn de acceso directo de windows. En el destino pongo
la ruta donde est mi ejecutable y en "iniciar en"
pongo el directorio compartido donde tengo los datos. Con esto tengo los ejecuta
bles en cada mquina y los datos compartidos en el
servidor. Dentro de la aplicacin tengo un path al sys(5)+sys(2003) mas mi directo
rio de datos. De esta forma no hay que cambiar nada,
vale tanto si est todo en el mismo directorio como si estn separados los ejecutab
les de los datos.
Un saludo. Angela.
Limpiar una Base de Datos
USE MiDataBase.DBC EXCLUSIVE
PACK DATABASE
USE
MSDE. Documentacin
MIcrosoft Data Engine (MSDE) es prcticamente lo mismo que SQL Server 6.5
Entiendo qyue esta por salir una versin con el motor de SQL Server 7
Puedes usarlo con la limitaci;on de pocos usuarios y puedes migrar en forma
transparente a SQL Server en el futuro.
<http://msdn.microsoft.com/library/default.asp?URL=/library/backgrnd/html/usi>ng
msde.htm
<http://msdn.microsoft.com/library/default.asp?URL=/library/backgrnd/html/msd>ef
orvs.htm
--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------
ODBC. Conveniencia
Paso previo muy economico para pasar tus aplicaciones a cliente / servidor. Esto
ya no es tan importante al haber varias bases de datos free,
como mySQL, Interbase 6, ...
Las transacciones las puede llevar el Transaction Server
En concreto le veo otra aplicacin, para mi bastante importante, imaginate que com
unicas con la central o una delegacin , via internet, vpn,
o una conexion RAS directa. Si desde tu puesto abres una tabla, ten en cuenta qu
e en ese momento empieza a viajar por el cable el indice de
dicha tabla, hay veces que moverse por las tablas en una conexin de este tipo so
n un suplicio, si accedes a las tablas via ODBC para VFP,
solo te traeras los datos que necesites, en ningun caso te traeras el indice. Si
no quieres pasarte a una base de datos de servidor, esto resulta
mucho mas comodo de trabajar quecon las tablas directamente.
Respecto a la velocidad, lo desconozco, yo estoy por implementar algo sobre ODBC
para VFP, y entonces empezare a realizar las pruebas de velocidad.
--
Saludos,
Pablo Roca (Xproca@clavo.net <mailto:Xproca@clavo.net>) (quitar la X)
La Corua - Espaa
ICQ 5035887
Sysop del Portal Gratuito de VisualFoxPro en Espaol
<http://clik.to/visualfox>
ODBC. Crear conexin
Espero que lo siguiente te sirva. Si tu quieres conectarte a BD VFP mediante ODB
C, debes primero crear tu conexion en el administrador de
ODBC. Ahi debera indicar el nombre de la conexion.
Este mismo nombre debes senalar para conectarte en VFP. POr ejemplo, si creaste
una conexion llamada "datos", deberas conectarte
DESDE VFP con el comando =sqlconnect("datos") como es una funcion te devolvera u
n valor, es un valor numerico si es mayor a 0 la
conexion fue existosa. El valor devuelto te permitira manejar tus datos. Por eje
mplo si te devuelve el valor 1, tu te referiras para realizar
una consulta de la siguiente manera, =sqlexec(1,"select * from autor")
Marcelo Ivan
Controles
Ancho de lista de un cuadro combinado
Para que coincida con el ancho del cuadro, debe ser igual a ste menos 26, pero s
i est dentro de una pgina ser igual al ancho del
cuadro menos 10.
Asociar un ImageList a un control TreeView
Inserta un imagelist en el formulario despus de haber insertado el treeview, ajus
ta sus imgenes y en el evento 'init' del treeview sita
este cdigo:
this.ImageList = thisform.imagelist1.object
Para asignar una imagen a un nodo usa los parmetros 5 y 6 del
mtodo 'add' de la coleccin 'nodes' thisform.treeview1.Nodes.add(relativa, relacin,
clave, texto, imagen, imagen_seleccionada)
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Calendario
Para que en el inicio el control tome la fecha del sistema pone en el Init
del formulario:
ThisForm.oleCalendar.Object.Today
Luis Mara Guayn
Tucumn - Argentina
Cambiar el RecordSource a un grid
Cuando realizamos operaciones con los datos de un grid, como cambiarle el record
source y vincularlo a otro origen de datos
(tabla/cursor/vista), hay veces en las que se estropea el grid (se pierden los
anchos de las columnas, ...), incluso sucede cuando
realizamos diversas operaciones con dichos datos:
Para solucionar esto se debe hacer de la siguiente manera:
LOCAL lcRecordSource
lcRecordSource = ALLTRIM(This.RecordSource)
This.RecordSource = ""
** ejecutar el codigo que se desee para la tabla/vista o cursor
** SCAN's, REPLACE's ...
This.RecordSource = lcRecordSource
Si queremos vincularlo a otro cursor o datos, pues simplemente hay que hacer:
thisform.cs_grdresal1.recordsource='lv_diariote'
Es valido si se mantienen los mismos nombres de campos y orden, yo tambin por ase
gurarme que todo va bien, siempre restauro
los controlsources de las columnas:
thisform.cs_grdresal1.column1.controlsource='lv_diariote.diafapun'
thisform.cs_grdresal1.column3.controlsource='lv_diariote.dianasi'
thisform.cs_grdresal1.column4.controlsource='lv_diariote.diacuenta'
thisform.cs_grdresal1.column6.controlsource='lv_diariote.diaconcep'
thisform.cs_grdresal1.column7.controlsource='lv_diariote.diadebe'
thisform.cs_grdresal1.column8.controlsource='lv_diariote.diahaber'
thisform.cs_grdresal1.column9.controlsource='lv_diariote.diadivcod'
Cambiar la tecla pulsada
Cambiar C por D
Evento KeyPress
LPARAMETERS nKeyCode, nShiftAltCtrl
if inlist(nKeyCode, 99, 67)
nodefault
keyboard "D"
endif
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.

En el metodo KEYPRESS del control prueba a poner algo de este estilo:



LPARAMETERS nKeyCode, nShiftAltCtrl

IF nKeyCode=5
Dodefault(9,nShiftAltCtrl)
ENDIF
Toni Atncia i Puigdomnech
Departamento informtico
tona@excover.com <mailto:tona@excover.com>
www.excover.com <http://www.excover.com>
EXCOVER, S.A.
Cambiar propiedades a controles del mismo tipo
ThisForm.SetAll("ForeColor", "RGB(255,0,0)", "Label")
Combobox. Abrir lista
keyboard '{x41A0}' abre el combo sea del tipo que sea.
Combobox. Aadir valores
Puedes usar this.addproperty
this.addproperty('aTest(1)')
with this
dimension .aTest(5)
.aTest(1)='Argentina'
.aTest(2)='Canada'
.aTest(3)='Mexico'
.aTest(4)='Nicaragua'
.aTest(5)='Inglaterra'
asort(.aTest)
.RowSource='this.aTest'
.RowSourceType=5
endwith
Comprobar si un control est registrado
Est el viejo truco de intentar crearlo desactivando la rutina de error, y si la c
reacin tiene xito est registrado.
on error nada()
mmm = createobject(...)
on error ...
if type("mmm") = "O" && xito en la creacin
...
else
...
endif
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Contar los controles de un formulario
Este es el esqueleto de un mtodo de una forma. Es un mtodo recursivo
Se llama dentro de la forma ThisForm.NomBreX( ThisForm)
* Mtodo NombreX
LPARAMETERS oThis
LOCAL loControlRef
LOCAL loControlCont
* Controles de la forma
FOR EACH loControlRef IN oThis.CONTROLS
WITH loControlRef
DO CASE
CASE .BASECLASS = "Textbox"
* Hacer algo en en este Texbox
CASE .BASECLASS = "Editbox"
CASE .BASECLASS = "Combobox"
CASE .BASECLASS = "Commandbutton"
CASE .BASECLASS = "Checkbox"
CASE .BASECLASS = "Grid"
CASE .BASECLASS = "Pageframe"
FOR EACH loPageRef IN .PAGES
WITH loPageRef
THISFORM.NombreX( loPageReft)
ENDWITH
ENDFOR
CASE .BASECLASS = "Page"
THISFORM.NombreX( loControlRef )
CASE .BASECLASS = "Container"
THISFORM.NombreEste Mtodo( loControlRef )
ENDCASE
ENDWITH
ENDFOR
Esta listo para ser completado y ampliado.
Se puede contar, guardar datos en una matriz etc.
Desinstalar OCX
RegSvr32 /u RutaNombre
Enviar al fondo
Zorder(0) && al frente
Zorder(1) && al fondo
Gif animado. Tani.ocx
En el Grupo microsoft.public.es.vb consegui este Control que te permite mostrar
un Gif Animado.
Utiliza solamente dos comandos:
Thisform.Olecontrol1.FileName = 'C:\Mis Imagenes\Banner_1.gif'
Thisform.Olecontrol1.ShowGif
Grid. Bsqueda incremental
Luis: Esto lo envie alguna vez y funciona.
*----------------------------------------------------------------------
* Para hacer una BUSQUEDA INCREMENTAL en un Formulario, debemos poner un
* TextBox (Text1) y una Grilla (Grid1).
* En el Entorno de datos insertaremos la tabla (MiTabla)
* En el mtodo InteractiveChange del TexBox
* escribir el siguiente cdigo:
*----------------------------------------------------------------------
*--- InteractiveChange ---
local lc, lnRecno
Select MiTabla
lc = allt(This.Value)
lnRecno = recno()
if MiTabla.Nombre >= lc
if not bof()
skip -1
endif
if MiTabla.Nombre < lc && debe quedar donde estaba
if lnRecno <= recc()
go recno()
else
go bott
endif
return
endif
if not empty(order()) && busqueda con indice
seek lc
else
go top
locate rest for MiTabla.Nombre=lc while MiTabla.Nombre <= lc nooptimize
endif
else
locate rest for MiTabla.Nombre=lc while MiTabla.Nombre <= lc nooptimize
endif
if lnRecno # recno()
ThisForm.Grid1.SetFocus && el nombre del TextBox
ThisForm.Text1.SetFocus && el nombre del Grid
endif
return
*--- END InteractiveChange ---
*----------------------------------------------------------------------
* NOTA: SE DEBE TENER LAS SIGUIENTES CONSIDERACIONES:
* -La tabla debe estar ordenada ASCENDENTEMENTE o existir un indice
* por Nombre y estar seleccionado (el mtodo busca si hay un
* SET ORDER establecido)
* -Fijarte bien el nombre del TexBox y del Grid para invocar el
* mtodo SetFocus (en el ejemplo Grid1 y Text1)
* -Fijarte el alias de la tabla del grid (en el ejemplo MiTabla)
* -Conviene que los nombres estn en maysculas y aadir en la
* propiedad Format del TextBox = ! para que sean ingresados en maysculas
* -Conviene que la propiedad del Grid RecordMark = .T. para que se vea
* el registro marcado, o manejar el color del registro seleccionado
*----------------------------------------------------------------------
Luis Mara Guayn
Tucumn - Argentina
Grid. Eliminar un control aadido
Sealas el control aadido con las propiedades, presionas click en el marco superior
de la ventana y luego presionas delete
Sergio Rocha Tenorio
srnic@hotmail.com <mailto:srnic@hotmail.com>
Grid. Cambiar colores
propiedad 'registro' en el formulario, inicializada a 0 mtodos 'puntero' y 'pongr
id' en el formulario
Mtodo puntero
thisform.registro = recno("mialias")
thisform.grid1.refresh()
Mtodo pongrid
m.condicion = 'iif(recno("mialias") = thisform.registro, rgb(...),
rgb(...))' && elije los colores que quieras
thisform.grid1.setall("dynamicbackcolor", m.condicion, "column")
m.condicion = 'iif(recno("mialias") = thisform.registro, rgb(...),
rgb(...))' && elije los colores que quieras
thisform.grid1.setall("dynamicforecolor", m.condicion, "column")
Evento afterrowcolchange del grid
dodefault()
thisform.puntero()
Evento 'Init' del formulario o del grid
thisform.pongrid()
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Grid. Columna desactivada
Enabled = .F.
Grid. Mantener las propiedades
Antes de hacer un REQUERY() para que se refrescara la informacin de los grid, deba
primero que desconectarle a ellos la fuente, es decir:
si el RecordSource del Grid es "MiVista" entonces tendra que hacer lo siguiente:
Thisform.Grid1.RecordSource = "" &&Par de comillas para indicar vaco
REQUERY("MiVista")
Thisform.Grid1.RecordSource = "MiVista"
Thisform.Grid1.Refresh()
ROBERT GIOVANI CHURION ROJAS
Colombia-Casanare-Orocu
ICQ Nro. 28278583
Grid. Marcar toda la lnea actual
Crea una propiedad en tu formulario con el nombre nRegistroActualGrid, e inicialz
ala a valor 0.
* En el evento Init del Grid escribe el siguiente cdigo
this.SetAll("DynamicBackColor",;
"IIF(RECNO()=thisform.nRegistroActualGrid, RGB(0,0,128), this.BackColor)",;
"Column")
this.SetAll("DynamicForeColor",;
"IIF(RECNO()=thisform.nRegistroActualGrid, RGB(255,255,255),
this.ForeColor)",;
"Column")
* En el evento AfterRowColChange pon el siguiente cdigo
thisform.nRegistroActualGrid =RECNO()
this.Refresh()
Grid. Ordernar columnas
Tomado de nuestro codebook y vigente desde el 95 !
Has un metodo en tu grid base, y solo poner en los click de tus header lo siguie
nte
this.Parent.PArent.SetORder("cPolicy", THIS)
Donde el primer parametro es el TAG que debes tener (el segundo es una variante
mia, aun no implementada, la idea era mandar
el header como parametro para manipular su color y caption, e indicar visualment
e la columna que esta 'activamente ordenada').
Y hay quien dice que el codebook es 'anticuado'...
Saludos y que te sirva.
Claudio Campos
Rafaela, Santa Fe
{CSETORDERGRID.SETORDER}
LPARAMETERS tcControlSource, toHeader
LOCAL loSelect, ;
lnCount, ;
lcField
*-- be sure to select the right alias()
LOCAL loSelect
loSelect = CREATEOBJECT("cSelect", thisForm.oBizObj.GetAlias())
*-- Sets the order to the currently selected
*-- controlsource if possible
*-- Get the fieldname being used
lcField = ;
SUBSTR(tcControlSource, AT(".", tcControlSource) + 1)
*-- See if the field name is in the leftmost part of the index
*-- expression. If so, SET ORDER TO the index.
FOR lnCount = 1 TO TAGCOUNT()
IF UPPER(SYS(14, lnCount)) = UPPER(lcField)
SET ORDER TO lnCount
IF TYPE("thisform") == "O"
thisform.Refresh()
ENDIF
EXIT
ENDIF
ENDFOR
MP3 en VFP
En la Galeria de componentes de Herramientas esta el control _soundplayer1. Para
ver mejor como funciona hay un sample de API para
reproducir musica con VFP.
Otro control en columna de Grid
Por defecto VFP, te pone textbox en las columnas, lo que tienes que hacer es lo
sig.
selecciona el textbox de la columna que quieres, pero desde la ventana de propie
dades, despus debes hacer click en el formulario,
pero OJO, debe ser sobre la barra de titulo del formulario, para que no pierda e
l foco el textbox, despus de eso presionas la tecla Suprimir,
para que lo borres, ok, despus de eso seleccionas el control ComboBox, de la barr
a de controles y haces click sobre la columna donde lo
quieres, y listo a modificar las propiedades del combo, ya que automticamente se
te modifica la propiedad CurrentControl de la columna
correspondiente..!!
<http://www.sistec.com.mx/~leodan>
PageFrame y TabStrip
Si van a utilizar pageframes el control incluido en el VFOX unicamente soporta l
os tabs en la parte superior, peeeerooooo:
pueden usar el Activex incluido "TabStrip" en combinacion con el pageframe
Al pageframe definanlo con la cantidad de paginas que necesiten la propiedad Tab
s ponganla a .f. pero durante el diseo no podran manejar
las paginas directamente, asi que durante el diseo pueden dejarla como .t. y en
el init del pageframe ponganlas como .f. ( this.tabs = .f.)
en el tabstrip en el evento click pueden mandar llamar un metodo que ejecute el
siguiente
codigo (o pueden poner el siguiente codigo directamente ahi mismo)
frame1 = This.Parent.Pageframe1 && para facilidad de manejo mas adelante
pgActiva = frame1.ACTIVEPAGE && regresa el valor de la pagina activa
IF THIS.SELECTEDITEM.INDEX <> pgActiva && si la activa es distinta de la selecci
onada
frame1.ACTIVEPAGE = THIS.SELECTEDITEM.INDEX && activar la pagina del pageframe
ENDIF
this.setfocus()
&& dejar focous en el tab (para simular el efecto)
combinando estos dos controles podran tener un pageframe con los tabs arriba, a
la izquierda, a la derecha, abajo
solo que no se les olvide que deben habilitar el TabStrip, entre los activex a i
ncluir en la distribucion, en el SetupWizard
RichText. Imprimir
Debes utiliza el metodo selprint del control. Aqui te pongo un ejemplo para impr
imir todo el contenido
control.selstart=1
control.sellength=len(control.textrtf)
Control.selprint
Para imprimir solo una parte maneja selstart y sellength
Saludos. Espero que te sirva
Emilio Fernandez
RTF
Tienes todas las referencias en:
<http://msdn.microsoft.com/library/devprods/vs6/basic/rtfbox98/vbojrichedit.h>tm
RTF. Impresin
Ricardo : No podes imprimir directamente del Richtext control lo tenes que hacer
en convinacion con un CommonDialog.
Te mando un ejemplo para poner en un boton de impresion, Espero te sirva.
cdlPDReturnDC =256
cdlPDNoPageNums =8
cdlPDAllPages =0
cdlPDSelection =1
WITH THISFORM
.CommonDialog1.Flags = cdlPDReturnDC + cdlPDNoPageNums
If .RichTextBox1.SelLength = 0 Then
.CommonDialog1.Flags = .CommonDialog1.Flags + cdlPDAllPages
Else
.CommonDialog1.Flags = CommonDialog1.Flags + cdlPDSelection
EndIf
.CommonDialog1.ShowPrinter
.RichTextBox1.SelPrint( .CommonDialog1.hDC )
ENDWITH
TreeView. Borrar nodos
thisform.treeview1.nodes.clear()
TreeView. Recorrer
For i=1 to thisform.lvwList.Nodes.Count
if thisform.lvwList.Nodes(i).Key=....
endif
Endfor

For each oNodo in thisform.lvwList.Nodes


if oNodo.Key=....
endif
EndFor
HTH
Victor Espina
TreeView. Saber botn presionado
Yo personalmente hago lo siguiente para saber cual botn fue presionado.
1.- Defino una propiedad en el form que contendr el nmero de botn apretado. Ejemplo
Boton
2.- En el mtodo MouseDown pongo algo as.
LPARAMETERS button, shift, x, y
THISFORM.boton = button -> Guardo que botn se presion
3.- En el mtodo nodeclick algo as
LPARAMETERS NODE
IF THISFORM.boton = 2 && RightCl
ick
THISFORM.activa_menu(NODE)
ELSE && Actualizo el listview
THISFORM.actualizar_listview(NODE)
ENDIF
Mario Jacas
Cuba. Costa Rica
TreeView. Versin
Queda claro.
La versin 1 est en comctl32.ocx
La versin 2 en mscomctl.ocx
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Ultimo enfoque
En el Init del formulario colocas:
thisform.AddProperty("cLastFocus","")
2) En el evento LostFocus de cada objeto en la forma colocas:
thisform.cLastFocus=strtran(sys(1272,this),thisform.Name+".","")
3) Luego, cuando referirte al objeto que tenia antes el foco, usas:
oLastFocus=eval("thisform."+thisform.cLastFocus)
Windows Script Host
Es MUCHO, mas poderos que los viejos .BAT
Te permite controlar el sistema de directorios y archivos, shortcuts, registry y
mucho mas
Fijate en <http://msdn.microsoft.com/scripting>
--
Alex Feldstein
MCP - Visual FoxPro
Direcciones
ADO en VFP
Busca en www.microsoft.com/data/ <http://www.microsoft.com/data/>

en la siguiente direccion tenes un articulo muy interesante sobre ADO y VFP
<http://www.microsoft.com/spain/msdn/articulos/archivo/090600/voices/adojump>.as
p
Chat en VFP
En el siguiente link podras bajar una aplicacion muy interesante de cmo poder cha
tear por medio de fox.
<http://www.fpress.com/revista/Num0012/articulo.htm>
Curso de ASP
Solo para Caracas Venezuela, curso de ASP en Espaol
<http://www.loresolvi.com/portal/asp.php>
Dialer para llamada telefnica
www.fpress/revista/Num9803/Mar98.htm <http://www.fpress/revista/Num9803/Mar98.ht
m>
E-Mail en VFP
Hay un excelente juego de controles (todos escritos en VFP nativo, no ActiveX) l
lamados Fox Extension Classes.
Uno de ellos hace exactamente lo que tu quieres.
Ver: <http://www.eps-software.com/fec>
--
Alex Feldstein - MCP
----------------------------------------------------------
Empaquetar informacin para transmitir por modem
fijate en la aplicacion del ejemplo de uso del control MSCOMM32.OCX en
www.fpress.com/revista/Num9803/Mar98.htm <http://www.fpress.com/revista/Num9803/
Mar98.htm>
Claudio Rivadera
La Rioja-Argentina
FileSystemObject
Aparte del linbk que te han dado, puedes ver ms sobre WSH y FSO en:
<http://msdn.microsoft.com/scripting/>
<http://www.windows-script.com/>
y tyambin en la excelente serie de artculos y ejemplos sobre ello en VFUG
(login gratis)
<http://www.vfug.org>
escritos por Ed Rauh y George Tasker
--
Alex Feldstein - MCP Visual FoxPro
Miami, FL, USA
FrameWorks
Es difcil recomendar un framework. Todos tienes sus pros y sus contras. Es una de
cisin muy personal.
Hay una cantidad, con diversas filosofas. La decisin depende mucho de tus necesida
des, conocimientos y estilo de programacin.
Puedes ver mucha informacin en el wiki de fox:
<http://fox.wikis.com/wc.dll?Wiki~CategoryFrameworks>
Para programas ms "clsicos" de red uso Visual Maxframe Profesional 5 de Drew Speed
ie. Este por supuesto hace todo lo que mencion
anteriormente.
Tienen su foro de soporte tcnico en <http://discussion.visualmaxframe.com/> y tam
bin hay much a gente que lo usa y ayuda en UT.
Con respecto a tu pregunta sobre cambio de idioma (se conoce esto como "internac
ionalizacin" de programas), VMP es muy fcil de
hacer ya que se conecta muy bin con INTL de Steven Black, el que tambin uso. VMP
tambin tiene fcil conexin (hooks) con SDT
de Doug Hennig y wwXML de Rick Strahl en el caso que los quieras usar.
Para diseos distribuidos (N-Tier), VMP es un poco mas complicado de adaptar (al m
enos en esta versin) ya que est basado en forms.
En ese caso puedes ver Visual Fox Express, Mere Mortals, Codebook, COMCodebook,
entre otros.
Alex Feldstein - MCP Visual FoxPro
Miami, FL, USA
FoxPress
FoxPress cambi su servidor, y su DNS tardar algunos das en actualizarse.
La nueva direccin IP del sitio: <http://195.55.174.243>
--
Luis Mara Guayn
Tucumn - Argentina
Garbage Collection
<http://fox.wikis.com/wc.dll?Wiki~ManualGarbageCollection~VFP>
--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------
Instalador Inno Setup
Yo no s qu hara sin el Inno Setup. Gratuito y excelente, es una de mis herramientas
bsicas.
<http://www.jordanr.dhs.org/isinfo.htm>
Vicent Palas
Librera FastLib
Alguien ha probado esta coleccin de controles?
Segn dicen es freeware, y en un principio parece diseada para Visual Basic, pero d
esde VFP, los estoy probando y funcionan muy bien.
Los puede incluir en mis aplicaciones, o al ser freeware no se puede cobrar por u
na aplicacin que incorpore estos controles?
La direccin donde encontrar los controles es:
<http://personal5.iddeo.es/mroibal/home.htm>
--
Un saludo.
Jess Sanz
jsanz@revolution.es <mailto:jsanz@revolution.es>
Manuales
www.manualesgratis.com <http://www.manualesgratis.com>
Este tiene Muy Buenos Manuales en Ingles y Espaol.
<http://members.es.tripod.de/gratis>
SPECIAL EDITION USING VISUAL FOXPRO 6
El libro que te recomendaron, que es muy bueno, lo tienes en:
<http://docs.rinet.ru:8080/GlyadiLisu/index.htm>
La direccin es del ndice del libro. Si lo sincronizas en tu navegador lo puedes le
er entero fuera de lnea en la
pantalla. Las clases estn explicadas en extenso en los captulos 15 y 16.
Est en ingls.
Mensajes anteriores
Yo lo que utilizo es Aforo.
<http://www.aforo.com/foros.asp?idgrup=31862&catid=7&subcatid=16>
Vicent Palas

Prueba en <http://www.deja.com/home_ps.shtml>
MsAgent
http://msdn.microsoft.com/workshop/c-frame.htm?929066716826#/workshop/imedia <ht
tp://msdn.microsoft.com/workshop/c-frame.htm?929066716826>/agent/default.asp&RLD
=79
MySql
Se pueden usar en Windows y Linux( y algun otro mas quizas), yo tengo instalado
para win95 y funciona de maravillas ( php y mysql ).
el site de php es www.php.net <http://www.php.net>
mysql www.mysql.com <http://www.mysql.com>
Saludos y feliz ao,
Emiliano.
--
-------------------------------------------------------------
Mail to: Emil_39 ARROBA hotmail.com
-----------------------
ICQ 34013175
Normalizacion
<http://fox.wikis.com/wc.dll?Wiki~DataNormalization>
<http://www.oreilly.com/catalog/accessdata2/chapter/ch04.html>
<http://www.comptechnews.com/~reaster/dbdesign.html>
Hugo
Portal de programacin
Nuevo portal de programacin de bases de datos en:
<http://progbd.pvirt.com>
Portal de VFP
El PortalFox: <http://clik.to/visualfox>
El nuevo PortalFox: <http://portalfox.nexen.net>
Proteger/Restaurar Outlook
Hay un proceso que te sirve para dejar tu recien instalado Outlook y Outlook Ex
press como estaba en el otro disco. Busca en
<http://www.svetlian.net/>.
Saludos
Rafael Figueroa
Refox
<http://mx.briefcase.yahoo.com/porcamicheria>
-> Mi Carpeta
-> Bingo - Lo que estabas buscando !
=Refox 8.0 Instalacion.zip

Espero que esta liga si les funcione.


Es necesario que se suscriban y obtengan una cuenta en www.myspace.com <http://w
ww.myspace.com>
Link al Folder compartido:
<http://www.myspace.com/Folders/20627210/>
Datos de Acceso:
Screen Name: ***El usuario de su cuenta de MySpace***
User Password: ***EL Password de su cuenta de MySpace***
Shared Folder Password: compartido
Archivo:
Refox 8.0 Instalacion.zip 1.4Mb
Que les aproveche !
Saludos desde Puebla, Mexico.
Kevin Mitnick
Maicrosoft LVP

En esta otra direccin pueden encontrar ms. Solo que necesitan el Winrar para desco
mprimir, en otros casos se puede utiliar el winzip.
<http://www.filesearch.ru/cgi-bin/s?q=refox&m=20&f=1&l=en>
copien y peguen.
Universal Thread
UT es el Universal Thread. Probablemente el foro mas grande de VFP en el
mundo.
<http://www.universalthread.com/>
--
Alex Feldstein - MCP
----------------------------------------
VFP.Net
Laa resurreccion de VFP y las consejos para programadores VFP en el entorno .Net
<http://www.lespinter.com/GetOpEd.asp?ArtNum=21>
a partir de enero este site va a estar completamente en castellano e ingles, por
ahora es todo en ingles.
Windows interface
<http://msdn.microsoft.com/library/devprods/vs6/visualc/vccore/_core_the_user>_i
nterface_guidelines_for_microsoft_windows.htm
--
Alex Feldstein - MCP
--------------------------------------------
Fechas y tiempo
Calcular el primer da del mes
PrimerDia = TuFecha - day(TuFecha) + 1
Calcular el ltimo da del mes
*------------------------------------------------
FUNCTION _EOM(dFecha)
*------------------------------------------------
* Retorna el ltimo da del mes (EndOfMonth)
* USO: _EOM(DATE())
* RETORNA: Fecha
*------------------------------------------------
LOCAL ld
ld = GOMONTH(dFecha,1)
RETURN ld - day(ld)
ENDFUNC

UltimoDia = gomonth(TuFecha - DAY(TuFecha) + 1, 1 )-1
Calcular la diferencia de dos fechas en aos, meses y das
*-----------------------------------------------------
* FUNCTION Dif_AMD(tdIni, tdFin)
*-----------------------------------------------------
* Calcula la diferencia entre dos fechas en:
* aos, meses y das
* Usa la funcin DiasDelMes()
*-----------------------------------------------------
FUNCTION Dif_AMD(tdIni, tdFin)
LOCAL ldAux, lnAnio, lnMes, lnDia, lcRet
*--- Fecha inicial siempre menor
IF tdIni>tdFin
ldAux = tdIni
tdIni = tdFin
tdFin = ldAux
ENDIF
lnAnio = YEAR(tdFin) - YEAR(tdIni)
ldAux = GOMONTH(tdIni, 12 * lnAnio)
*--- No cumplio el ao aun
IF ldAux > tdFin
lnAnio = lnAnio - 1
ENDIF
lnMes = MONTH(tdFin) - MONTH(tdIni)
IF lnMes < 0
lnMes = lnMes + 12
ENDIF
lnDia = DAY(tdFin) - DAY(tdIni)
IF lnDia < 0
lnDia = lnDia + DiasDelMes(tdIni)
ENDIF
*--- Si el dia es mayor, no cumplio el mes
IF (DAY(tdFin) < DAY(tdIni))
IF lnMes = 0
lnMes = 11
ELSE
lnMes = lnMes - 1
ENDIF
ENDIF
lcRet = ALLTRIM(STR(lnAnio))+ " AOS, " + ;
ALLTRIM(STR(lnMes))+ " MESES Y " + ;
ALLTRIM(STR(lnDia))+ " DIAS."
RETURN lcRet
ENDFUNC
*-----------------------------------------------------
* FUNCTION DiasDelMes(dFecha)
*------------------------------------------------
* Retorna los das de un mes. Usada por Dif_AMD
*------------------------------------------------
FUNCTION DiasDelMes(dFecha)
LOCAL ld
ld = GOMONTH(dFecha,1)
RETURN DAY(ld - DAY(ld))
ENDFUNC
Calcular la edad
*-----------------------------------------------------
* FUNCTION Edad(tdNac, tdHoy)
*-----------------------------------------------------
* Calcula la edad pasando como parmetros:
* tdNac = Fecha de nacimiento
* tdHoy = Fecha a la cual se calcula la edad.
* Por defecto toma la fecha actual.
*-----------------------------------------------------
FUNCTION Edad(tdNac, tdHoy)
LOCAL lnAnio
IF EMPTY(tdHoy)
tdHoy = DATE()
ENDIF
lnAnio = YEAR(tdHoy) - YEAR(tdNac)
IF GOMONTH(tdNac, 12 * lnAnio) > tdHoy
lnAnio = lnAnio - 1
ENDIF
RETURN lnAnio
ENDFUNC
Calcular la fecha de semana santa
Juan Pablo te paso una funcin que no es ma, calcula el Domingo de Pascua, por ende
, se deduce la Semana Santa.
*---------------------------------------------------------------
* FUNCTION _Pascua(tnAnio)
*---------------------------------------------------------------
* USE: _Pascua(1999)
* PARAMETRO: Ao a calcular
* RETORNO: Fecha del Domingo de Pascua
*---------------------------------------------------------------
FUNCTION _Pascua(tnAnio)
LOCAL lnCentena, lnAux, lnNroAureo, lnDomingo, lnEpactaJul, ;
lnCorrSolar, lnCorrLunar, lnEpactaGreg, lnDiasLunaP, ;
lnDiasLuna15, lnDiasPascua, ldFecIni, ldFecPascua
IF NOT BETWEEN(tnAnio,1000,9999)
MESSAGEBOX("Rango invlido [1000..9999]")
RETURN {//}
ENDIF
lnCentena = INT(tnAnio/100)
lnAux = (tnAnio+1)%19
lnNroAureo = lnAux+(19*INT((19-lnAux)/19))
lnDomingo = 7+(1-tnAnio-INT(tnAnio/4)+lnCentena-INT(lnCentena/4))%7
lnEpactaJul = ((11*lnNroAureo)-10)%30
lnCorrSolar = -(lnCentena-16)+INT((lnCentena-16)/4)
lnCorrLunar = INT((lnCentena-15-INT((lnCentena-17)/25))/3)
lnEpactaGreg = (30+lnEpactaJul+lnCorrSolar+lnCorrLunar)%30
lnDiasLunaP = 24-lnEpactaGreg+(30*INT(lnEpactaGreg/24))
lnDiasLuna15 = (27-lnEpactaGreg+(30*INT(lnEpactaGreg/24)))%7
lnDiasPascua = lnDiasLunaP+(7+lnDomingo-lnDiasLuna15)%7
ldFecIni = EVALUATE("{^"+STR(tnAnio,4)+"/03/21}")
ldFecPascua = ldFecIni+lnDiasPascua
RETURN ldFecPascua
ENDFUNC
A/P Nelson Rodriguez
Salto - Uruguay
nri@adinet.com.uy <mailto:nri@adinet.com.uy>
Cambiar la fecha y la hora del PC
*==========================================================================
FUNCTION WriteLocalTime(ltDateTime)
*==========================================================================
* Escribe mediante API el GetLocalTime
* Parametro: Debe pasarse una variable del tipo DateTime
* Retorno: .T. si pudo cambiar fecha y hora
* .F. envio un parmetro no vlido o error
* Autor: LMG - 1998.09.14
*==========================================================================
IF TYPE("ltDateTime") # "T"
RETURN .F.
ENDIF
LOCAL lcCadena
lcCadena = _10to256(YEAR(ltDateTime),2) + ;
_10to256(MONTH(ltDateTime),2) + ;
_10to256(DOW(ltDateTime),2) + ;
_10to256(DAY(ltDateTime),2) + ;
_10to256(HOUR(ltDateTime),2) + ;
_10to256(MINUTE(ltDateTime),2) + ;
_10to256(SEC(ltDateTime),2) + ;
_10to256(000,2) + SPAC(24)
DECLARE SetLocalTime IN win32api ;
STRING lcCadena
RETURN SetLocalTime(lcCadena)
ENDFUNC
*==========================================================================
FUNCTION _10to256(lnNumero, lnCant)
*==========================================================================
* Toma nmero en base 10 y lo convierte en "lnCant" caracteres en base 256
* Usada por: WriteLocalTime()
* Autor: LMG - 1998.09.14
*==========================================================================
LOCAL lcRetorno, lnAscii
lcRetorno=''
DO WHILE lnNumero >= 256
lnAscii=MOD(lnNumero,256)
lcRetorno=lcRetorno + CHR(lnAscii)
lnNumero=INT(lnNumero / 256)
ENDDO
lnAscii=lnNumero
lcRetorno=lcRetorno + CHR(lnAscii)
RETURN PADR(lcRetorno, lnCant, CHR(0))
ENDFUNC
*==========================================================================
Luis Mara Guayn
Tucumn - Argentina
Convertir una fecha a formato largo
m.dFecha = {01/01/2000}
allt(str(day(m.dFecha))) + " " + cmonth(m.dfecha) + " " +
allt(str(year(m.dfecha)))

DMY(dFecha)
Modificar fecha y hora
Hola Javier,
Run /N Control Timedate.cpl
Espero que te sirva, saludos y hasta pronto !!!
--
Josep M Picaol
AUTO DIESEL VIC, S.A.
Vic-Barcelona
e-mail: admin@autodieselvic.com <mailto:admin@autodieselvic.com>
web: www.autodieselvic.com <http://www.autodieselvic.com>
Obtener el nmero de da del ao
Resta la fecha en cuestin menos el primer da del ao 01,01, year(date)
FUNCTION NumDia( pfecha )
Return pfecha-date(year(pfecha),1,1)+1
Primer dia del mes de un dia de la semana (primer viernes de Agosto...)
Hay algunas ocasiones en las que es til saber el primer dia del mes en el que cae
un dia de la semana. Por ejemplo en los Estados
Unidos el primer lunes de septiembre es vacaciones.
La siguiente funcin dado un mes y un ao devuelve la fecha en la que cae un dia de
la semana 1 = Domingo, 2 = Lunes,...
Notas: el siguiente codigo usa funciones que pueden estar solo disponibles a VFP
6.0.
* FUNCTION: FirstDay.prg
LPARAMETERS pnmonth, pnyear, pndow
* Parameter list description
* pnmonth numero del mes (1-12)
* pnyear numero del ao (en formato cuatro dgitos)
* pndow dia de la semana a investigar (Domingo = 1, Lunes = 2, etc.)
LOCAL ldresult, lddate, lndow
lddate = DATE(pnyear, pnmonth, 1)
ldresult = lddate
* Fuerza a VFP 5.0/6.0 a usar el Domingo
* como primer dia de la semana
* Versiones anteriores debern borrar el parmetro
lnfirstday = DOW(lddate, 1)
IF lnfirstday # pndow
IF lnfirstday < pndow
ldresult = lddate + (pndow - lnfirstday)
ELSE
ldresult = lddate + (7 + pndow) - lnfirstday
ENDIF
ENDIF
RETURN ldresult
Ejemplo:
* Saber el primer Lunes de septiembre del ao actual.
ldSeptMon = FirstDay(9, YEAR(DATE()), 2)
Transformar un nmero de segundos a HH:MM:SS
*--------------------------------------------------------------------------
* FUNCTION _Seg2Hor(nSegundos)
*--------------------------------------------------------------------------
* Transforma segundos a formato hhHH:MM:SS
* USO: _Seg2Hor(nSegundos)
* EJEMPLO: _Seg2Hor(35000)
* RETORNA: Caracter 'HH:MM:SS'
*--------------------------------------------------------------------------
*FUNCTION _Seg2Hor(nSegundos)
lpara nSegundos
LOCAL lnHoras, lnMinutos, lnSegundos
lnHoras = INT(nSegundos/3600)
lnMinutos = INT(((nSegundos-(lnHoras*3600))/60))
lnSegundos = MOD(nSegundos,60)
RETURN IiF(lnHoras<100,TRANSFORM(lnHoras,"@L 99"),TRANSFORM(lnHoras,"@L 9999"))
+":"+ ;
TRANSFORM(lnMinutos,"@L 99")+":"+ ;
TRANSFORM(lnSegundos,"@L 99")
ENDFUNC
Ficheros
Cdigos correlativos
1) Usa SET REPROCESS TO 1 en lugar de AUTOMATIC. Esto hara que VFP trate de
bloquear el registro solo una vez.
2) En tu rutina de contadores, utiliza la siguiente tcnica:
USE Contadores
LOCATE FOR Contador=cContador
IF NOT FOUND()
....
ENDIF
DO WHILE NOT RLOCK() && Se queda en un ciclo hasta que pueda
bloquear el registro
ENDDO
REPL Valor WITH Valor + nSalto
FLUSH && Fuerza que los datos se graben a disco
UNLOCK && Retira el bloqueo.
Como vez, la rutina se queda en el ciclo DO WHILE hasta que el usuario que
est obteniendo el siguiente valor de un contador lo libere con el UNLOCK.
Esto te garantiza que, no importa que tan rpidas sean las llamadas a la
funcin, el registro nunca estar desbloqueado para dos usuarios
simultneamente.
HTH
Victor
Comprobar si hay disco en la Unidad
Para saber si tienes el disco en qualquier unidad, puedes utilizar la siguiente
funcin... que es nativa de fox y no necesita librerias
ni declaraciones....
Podemos suponer que la unidad e: s la del cd-rom...
If DiskSpace("e:")=-1 && -1 indica que no hay disco en la unidad
(vale para disqueteras u otras unidades)
wait window "No hay disco en la unidad e:"
Return .f.
EndIf
--
Josep M Picaol
AUTO DIESEL VIC, S.A.
Vic-Barcelona
e-mail: admin@autodieselvic.com <mailto:admin@autodieselvic.com>
web: www.autodieselvic.com <http://www.autodieselvic.com>

FUNCTION DriveReady
LPARAMETERS cDrive
LOCAL lReturn, oDrive, oFileSystemObject
oFileSystemObject = CREATEOBJECT("Scripting.FileSystemObject")
oDrive = oFileSystemObject.GetDrive(cDrive)
lReturn = oDrive.IsReady
RETURN lReturn
--
Mario Acevedo
maap@adinet.com.uy <mailto:maap@adinet.com.uy>
Montevideo-Uruguay
Escribir y leer un valor de un fichero INI
*----------------------------------------------------
FUNCTION WriteFileIni(tcFileName,tcSection,tcEntry,tcValue)
*----------------------------------------------------
* Escribe un valor de un archivo INI.
* Si no existe el archivo, la seccin o la entrada, la crea.
* Retorna .T. si tuvo xito
* PARAMETROS:
* tcFileName = Nombre y ruta completa del archivo.INI
* tcSection = Seccin del archivo.INI
* tcEntry = Entrada del archivo.INI
* tcValue = Valor de la entrada
* USO: WriteFileIni("C:\MiArchivo.ini","Default","Port","2")
* RETORNO: Logico
*----------------------------------------------------
DECLARE INTEGER WritePrivateProfileString ;
IN WIN32API ;
STRING cSection,STRING cEntry,STRING cEntry,;
STRING cFileName
RETURN IIF(WritePrivateProfileString(tcSection,tcEntry,tcValue,tcFileName)=1, .T
., .F.)
ENDFUNC
*----------------------------------------------------
FUNCTION ReadFileIni(tcFileName,tcSection,tcEntry)
*----------------------------------------------------
* Lee un valor de un archivo INI.
* Si no existe el archivo, la seccin o la entrada, retorna .NULL.
* PARAMETROS:
* tcFileName = Nombre y ruta completa del archivo.INI
* tcSection = Seccin del archivo.INI
* tcEntry = Entrada del archivo.INI
* USO: ReadFileIni("C:\MiArchivo.ini","Default","Port")
* RETORNO: Caracter
*----------------------------------------------------
LOCAL lcIniValue, lnResult, lnBufferSize
DECLARE INTEGER GetPrivateProfileString ;
IN WIN32API ;
STRING cSection,;
STRING cEntry,;
STRING cDefault,;
STRING @cRetVal,;
INTEGER nSize,;
STRING cFileName
lnBufferSize = 255
lcIniValue = spac(lnBufferSize)
lnResult=GetPrivateProfileString(tcSection,tcEntry,"*NULL*",;
@lcIniValue,lnBufferSize,tcFileName)
lcIniValue=SUBSTR(lcIniValue,1,lnResult)
IF lcIniValue="*NULL*"
lcIniValue=.NULL.
ENDIF
RETURN lcIniValue
ENDFUNC
Existencia de ndice
Aqui tienes una funcion basada en otra igual del Trastade:
FUNCTION EsTag (pNombreTag, pAlias)
LOCAL lEsTag, ;
lTagEncontrado
IF PARAMETERS() < 2
pAlias = ALIAS()
ENDIF
IF EMPTY(pAlias)
RETURN .F.
ENDIF
lEsTag = .F.
pNombreTag = UPPER(ALLTRIM(pNombreTag))
lTagNum = 1
lTagEncontrado = TAG(lTagNum, pAlias)
DO WHILE !EMPTY(lTagEncontrado)
IF UPPER(ALLTRIM(lTagEncontrado)) == pNombreTag
lEsTag = .T.
EXIT
ENDIF
lTagNum = lTagNum + 1
lTagEncontrado = TAG(lTagNum, pAlias)
ENDDO
RETURN lEsTag
ENDFUNC
Saludos
Eduardo Amat.
Ficheros Cobol
Mira, yo me tuve el mismo problema y estuve investigando un poco. Existe un prog
rama llamado DATA JUNCTION que lee un archivo
de un tipo y lo convierte a otro tipo (reconoce y convierte mas de 30 formatos d
istintos). Tambien
trabaja con archivos Cobol como MS-Cobol, etc, MENOS con los archivos de RM-COBO
L (que por supuesto son con los que necesitaba
laburar yo). Si tus archivos no estan en RM-COBOL podes usar esta aplicacion, ex
isten una version demo que yo use y la obtuve de la
revista numero 61 de Solo Programadores (una reviste de origen espaol). Si por de
sgracia son RM-COBOL o conseguis a alguien que los
convierta en TXT o usas el metodo del listado el cual esta piola siempre y cuand
o el sistema viejo liste todos los datos necesarios.
(El problema principal que existe con los archivos de cobol es que este lenguaj
e usa como el RPG campos numericos empaquetados,
para ahorrar espacio en el disco, entonces cuando lo queres visualizar ves un co
digo de ASCII tipo archivo ZIP en vez de numeros,
es ahi donde necesitas algo que lo "abra" y lo grabe en un formato legible por
otros programas).
Bueno, espero esto te sirva.
Feliz Navidad.
Hernan.
HC-SISTEMAS
Argentina
ICQ: 14378324
Hacer un cursor modificable
Para hacer el cursor modificable te vale la siguiente funcion:
FUNCTION hazmodificable
LPARAMETERS tcalias
USE DBF(tcalias) IN 0 AGAIN alias xxTemp
USE DBF("xxTemp") IN (tcalias) AGAIN ALIAS (tcalias)
USE IN xxTemp
Hacer un SEEK o INDEXSEEK a cualquier vista
En las vistas con modo de almacenamiento en bufer a tabla (es decir 4 o 5), no s
e
les puede crear un indice, y por tanto no se puede hacer SEEK o INDEXSEEK en ell
as.
Para resolver esto se ha reealizado la sisuiente rutina:
************************************************************
*
* Funcion: INDEXVISTA
*
* Indexa cualquier tipo de vista
*
* Parametros:
*
* tcvista - Nombre de la vista
* tcexpr - expresion completa para indexar
* tctag - nombre del indice (tag)
*
* Ejemplos:
*
* ret=indexview("lv_alelin","allart+STR(mov,3)","allart")
*
* Retorno
*
* devuelve verdadero/falso si se pudo crear el indice
*
* Nota
*
* La vista debe estar abierta
*
* Ultima Modificacion: 05/04/2000 Pablo Roca
* Creacion : 05/04/2000 Pablo Roca
*
************************************************************
FUNCTION indexvista (tcvista, tcexpr, tctag)
LOCAL lcOldBufering, llret, lcalias
IF PCOUNT()=3
lcalias = ALIAS()
SELECT (tcvista)
lcOldBufering=CURSORGETPROP("Buffering")
llret=CURSORSETPROP("Buffering",3)
IF llret
INDEX ON &tcexpr TAG (tctag)
SET ORDER TO
llret=CURSORSETPROP("Buffering",lcOldBufering)
ENDIF
IF !EMPTY(lcalias)
SELECT (lcalias)
ELSE
SELECT 0
ENDIF
ELSE
llret = .F.
ENDIF
RETURN llret
ENDFUNC
Ejemplo de uso:
ret=indexvista("lv_alelin","allart+STR(mov,3)","allart")
Con esto podremos realizar cualquier SEEK (mejor SEEK() ) o INDEXSEEK sobre la v
ista
Saber si se ha modificado un registro
GETFLDSTATE()
Necesita manejar Buffers.
Obtener los ficheros de un directorio
Aparte de adir()
lc = SYS(2000, "*.DBF")
DO WHILE NOT EMPTY(lc)
USE (lc) EXCLUSIVE
REINDEX
lc = SYS(2000, "*.DBF", 1)
ENDDO
Luis Mara Guayn
Tucumn - Argentina
Saber si existe un directorio
Agrega AUX en tu cadena de busqueda de directorio.
xDir="C:\CLIENTES /Aux"
If !File(xDir)
wait wind "No existe"
Else
Wait Wind "Ya existe"
Endif
Saber si un alias pertenece a una vista
Para saber si es vista o tabla puedes utilizar la funcin
CURSORGETPROP("SourceType", cAlias), los valores retornados son:
1 - Especifica que el origen de datos es una vista SQL local.
2 - Especifica que el origen de datos es una vista SQL remota.
3 - Especifica que el origen de datos es una tabla.
Tratar icheros .INI
Con estas funciones puedes leer y escribir archivo.ini
*----------------------------------------------------
FUNCTION WriteFileIni(tcFileName,tcSection,tcEntry,tcValue)
*----------------------------------------------------
* Escribe un valor de un archivo INI.
* Si no existe el archivo, la seccin o la entrada, la crea.
* Retorna .T. si tuvo xito
* PARAMETROS:
* tcFileName = Nombre y ruta completa del archivo.INI
* tcSection = Seccin del archivo.INI
* tcEntry = Entrada del archivo.INI
* tcValue = Valor de la entrada
* USO: WriteFileIni("C:\MiArchivo.ini","Default","Port","2")
* RETORNO: Logico
*----------------------------------------------------
DECLARE INTEGER WritePrivateProfileString ;
IN WIN32API ;
STRING cSection,STRING cEntry,STRING cEntry,;
STRING cFileName
RETURN
IIF(WritePrivateProfileString(tcSection,tcEntry,tcValue,tcFileName)=1, .T.,
.F.)
ENDFUNC
*----------------------------------------------------
FUNCTION ReadFileIni(tcFileName,tcSection,tcEntry)
*----------------------------------------------------
* Lee un valor de un archivo INI.
* Si no existe el archivo, la seccin o la entrada, retorna .NULL.
* PARAMETROS:
* tcFileName = Nombre y ruta completa del archivo.INI
* tcSection = Seccin del archivo.INI
* tcEntry = Entrada del archivo.INI
* USO: ReadFileIni("C:\MiArchivo.ini","Default","Port")
* RETORNO: Caracter
*----------------------------------------------------
LOCAL lcIniValue, lnResult, lnBufferSize
DECLARE INTEGER GetPrivateProfileString ;
IN WIN32API ;
STRING cSection,;
STRING cEntry,;
STRING cDefault,;
STRING @cRetVal,;
INTEGER nSize,;
STRING cFileName
lnBufferSize = 255
lcIniValue = spac(lnBufferSize)
lnResult=GetPrivateProfileString(tcSection,tcEntry,"*NULL*",;
@lcIniValue,lnBufferSize,tcFileName)
lcIniValue=SUBSTR(lcIniValue,1,lnResult)
IF lcIniValue="*NULL*"
lcIniValue=.NULL.
ENDIF
RETURN lcIniValue
ENDFUNC
*----------------------------------------------------
Luis Mara Guayn
Tucumn - Argentina

Formularios
Copiar el DataEnvironment a otro formulario
FoxPress - Enero 2001
<http://www.fpress.com/>
Los Dataenvironment tiene un problema y es que existen en los .scx pero no en lo
s .vcx De tal forma que cuando se crea un formulario
mediante createobjected() este formulario no tiene DE. Hay diversas formas de c
rear uno, ya sea mediante el interfaz usando el diseador
de formularios, una clase Session, o sencillamente abriendo las tablas mediante
el sistema tradicional.
Una vez tuve un problema y es que quera crear una serie de formularios con DE exa
ctamente iguales. Si los guardaba como clase perdia
el DE y al instanciarlos no lo tena ya. La solucin la encontr en el siguiente cdigo.
do form (cOldForm) name oOldForm noshow
oDE=cOldForm.DataEnvironment
oNewForm=createobject(cNewFormClass)
oNewForm.SaveAs("newform.scx", oDE)
Newform.scx tendr un DE (entorno de datos) idntico al de cOldForm.

FoxPress - Enero de 2001
2001 FoxPress. All rights reserved
Devolver ms de un valor desde un formulario
DO FORM Forma TO Devuelve1, devuelve2
Saludos.
Jess Aceves.
jaceves@fabricasselectas.com.mx <mailto:jaceves@fabricasselectas.com.mx>
Formulario ovalado
En realidad es muy fcil, siempre y cuando sea ovalada y no tridimensional.
En el evento load poner:
local lWH, lnWidth, lnHeight, lnHR, hRatio, vRatio
DECLARE INTEGER CreateEllipticRgn IN gdi32 INTEGER, INTEGER, INTEGER, INTEGER
DECLARE INTEGER SetWindowRgn IN user32 INTEGER, INTEGER , INTEGER
SET LIBRARY TO ( HOME(1)+'foxtools.fll' )
lWH = _WhToHWnd(_WFindTitl(this.caption))
hRatio=1.0 && Cambi estos valores para darle la forma a la elipse
vRatio=1.0
lnWidth = this.width / hRatio
lnHeight = this.height / vRatio
lnHR = CreateEllipticRgn(0, 0, lnWidth, lnHeight) && Devuelve un handle a la reg
ion
SetWindowRgn(lWH, lnHR, 1)
* Tener cuidado que no vas a poder cerrar la ventana con la 'x' de arriba.
Formulario redondo
SET LIBRARY TO SYS(2004)+"foxtools.fll" ADDITIVE
fcnVentanaActiva = regfn("GetActiveWindow","","I") && Funcin para encontrar el Ha
ndle de la ventana activa
*En este caso es la ventana principal de VFP
*Pueden utilizar "FindWindow" para obtener el handle de la ventana que uds quier
an
fcnRgnEliptica = regfn("CreateEllipticRgn","IIII","I") && funcin para crear la re
gion elptica
fcnColocaRegion = regfn("SetWindowRgn","III","I") && Funcin para colocar la regin
en la ventana con el handle obtenido
hWndActiva = Callfn(fcnVentanActiva) &&Obtenemos el handle de la ventana activa
IF hWndActiva <> 0 THEN && Si se encontr el handle
mRGN = callfn(FcnRgnEliptica,0,0,THISFORM.WIDTH,THISFORM.HEIGHT) &&Generamos la
regin
*Pueden modificar los parmetros para colocar la regin donde uds quieran y hacerla
ms o menos ancha
IF mRGN <> 0 THEN && Si se cre la regin
mSalida = callfn(fcnColocaRegion,hWndActiva,mRGN,1) &&Colocamos la regin en la ve
ntana de la
* que obtuvimos en handle
IF mSalida <> 0 then
WAIT WIND "FUNCIN EXITOSA"
ENDIF
ENDIF
ENDIF
Function GetHwndForm
LParameter toForm
Local lcCaption
lcCaption = toForm.Caption
toForm.Caption = Sys(3)
If not "FOXTOOLS" $ Upper( Set("Library") )
Set Library to (Home()+"\FoxTools.Fll") Additive
Endif
Local lnHWND
lnHWND = _WhToHwnd( _WFindTitl(toForm.Caption) )
toForm.Caption = m.lcCaption
Return m.lnHWND
Formulario transparente
Por Sergio E. Aguirre
Muchas veces queremos dar un aspecto "raro" a determinados formularios de una ap
licacin especfica y, casi siempre,
terminamos diciendo: "por lo visto, esto no se puede hacer" y nos resignamos a d
ejar tal cual como estaba antes el aspecto
de dicho formulario. Hoy veremos la forma de hacer formularios transparentes, u
sted dir: "Para qu necesito un formulario
transparente?" , la respuesta a esa pregunta es: "No s, pero puede necesitarlo p
ara una situacin en particular".
Ejemplo de un formulario transparente
Para poder ejecutar el ejemplo debemos crear un formulario y agregar dos nuevos
mtodos: GetHwndForm y SetTransparent.
El cdigo, que debemos agregar a los mtodos del formulario, es el siguiente:
Mtodo Init
Set Library To Home() + "Foxtools.fll" ADDITIVE
** Declaramos las funciones del API de windows que vamos a utilizar.
Declare Integer CombineRgn in "gdi32" integer hDestRgn, integer hRgn1, integer h
Rgn2, integer nMode
Declare Integer CreateRectRgn in "gdi32" integer X1, integer Y1, integer X2, int
eger Y2
Declare Integer SetWindowRgn in "user32" integer hwnd, integer hRgn, integer nRe
draw
** Llamamos al mtodo que hace transparente el formulario.
This.SetTransparent()
Mtodo GetHwndForm
** Este mtodo devuelve el windows handle o identificador
** (Hwnd) del formulario.
Local lcOldCaption, lnHWND
With Thisform
lcOldCaption = .Caption
.Caption = Sys(3)
lnHWND = _WhToHwnd(_WFindTitl(.Caption))
.Caption = lcOldCaption
EndWith
Return lnHWND
Mtodo SetTransparent
LOCAL lnControlBottom, ;
lnControlRight, ;
lnControlLeft, ;
lnControlTop, ;
lnBorderWidth, ;
lnTitleHeight, ;
lnFormHeight, ;
lnFormWidth, ;
lnInnerRgn, ;
lnOuterRgn, ;
lnCombinedRgn, ;
lnControlRgn, ;
lnControl, ;
lnRgnDiff, ;
lnRgnOr, ;
llTrue
** Asignamos valores a las variables que utilizaremos con las funciones del API
de windows.
lnRgnDiff = 4
lnRgnOr = 2
llTrue = -1
With Thisform
** Fijamos el tamao del borde y la barra de ttulo del formulario
lnBorderWidth = 3
lnTitleHeight = 23
** Obtenemos la altura y el ancho del formulario
lnFormWidth = (.Width + 1) + (lnBorderWidth * 2)
lnFormHeight = .Height + lnTitleHeight + lnBorderWidth
** Creamos la regin interna y externa del formulario
lnOuterRgn = CreateRectRgn(0, 0, lnFormWidth, lnFormHeight)
lnInnerRgn = CreateRectRgn(lnBorderWidth, lnTitleHeight, ;
lnFormWidth - lnBorderWidth, lnFormHeight - lnBorderWidth)
** Extraemos la regin interna de la regin externa
lnCombinedRgn = CreateRectRgn(0, 0, 0, 0)
CombineRgn(lnCombinedRgn, lnOuterRgn, lnInnerRgn, lnRgnDiff)
** Creamos las regiones de los controles del formulario y combinamos a stas con l
a regin anterior.
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, lnCont
rolBottom)
CombineRgn(lnCombinedRgn, lnCombinedRgn, lnControlRgn, lnRgnOr)
EndFor
** Establecemos la regin de la ventana
SetWindowRgn(.GetHwndForm(), lnCombinedRgn, llTrue)
EndWith
Mtodo Resize
** Llamamos al mtodo que hace transparente al formulario cada vez que ste cambia d
e tamao.
THIS.SetTransparent()
Espero que el truco les pueda ser de utilidad, hasta la prxima...
Sergio E. Aguirre realiza trabajos para InFox Creatividad & Tecnologa, se puede e
ntrar en contacto con l en paychon@impsat1.com.ar
Handle de un form
***************************************************************************
***************************************************************************
*
* Funcin : HandlerVentana
* Proposito : Obtiene le manejador de la ventana principal de VFP
* Parametros : Titulo de la ventana de VFP
* Nota : La ventana debe tener el mismo Caption o Texto del Titulo
* que la cadena que se pasa en el parametro
* Regresa : Numero entero con el manejador de la ventana
* Ejemplo : HandlerVentana("Calculadora")
*
***************************************************************************
***************************************************************************
FUNCTION HandlerVentana(c_Caption)
LOCAL n_HWD

DECLARE INTEGER FindWindow IN WIN32API ;
STRING cNULL, ;
STRING cWinName

n_HWD = FindWindow(0, c_Caption)

IF n_HWD > 0

RETURN n_HWD

ENDIF

ENDFUNC

***************************************************************************
Imprimir un formulario
Te envo una funcin que me encontr en internet de Mauricio Atanache, y que a m me fun
ciona correctamente.
Has de tener cargado Foxtools.FLL.
***********************************************************************
*!* ====================================
*!* Child and Parent Form Print Function -- by Mauricio Atanache
*!* ====================================
* Use this procedure as PrintForm( Thisform ) or PrintForm( _Screen )
*******************
* Author : Mauricio Atanache G.
* Date : December 10/97
* Parameters : oObjeto is an object FORM, for example THISFORM,
* ACTIVEFORM, _SCREEN
****************************************************************
Procedure PrintForm
******************
lParameters oObjeto
LOCAL cAlias, lUsado
PUBLIC cTituloFormPrint
* Save current alias
IF USED(ALIAS())
cAlias=ALIAS()
lUsado=.T.
ELSE
lUsado=.F.
ENDIF
* Put image in clipboard
If !TomaFoto( oObjeto )
Return
Endif
*SET STEP ON
* Create a cursor for store the image, uses a general field
CREATE CURSOR Foto_Pantalla (SCREEN G)
SELECT Foto_Pantalla
APPEND BLANK
* Copy the image from the clipboard to the general field
DEFINE WINDOW Ventana FROM 1,1 TO 4,4
MODIFY GENERAL Foto_Pantalla.SCREEN NOWAIT WINDOW Ventana
KEYBOARD "{CTRL+V}{CTRL+W}" CLEAR
*WAIT WIND "***************************" TIMEOUT 2
RELEASE WIND Ventana
DOEVENTS
* Debemos crear un informe llamado prtform con un OleControl y SCREEN como
* fuente
IF !EMPTY(Foto_Pantalla.SCREEN)
SELECT Foto_Pantalla
m.cTituloFormPrint = oObjeto.Caption
IF TYPE('oApp') == 'O'
IF oApp.lDesarrollo
oApp.PrintPreview('prtform')
ELSE
REPORT FORM prtform.frx NOCONSOLE TO PRINTER PROMPT
ENDIF
ELSE
REPORT FORM prtform.frx PREVIEW NOCONSOLE
ENDIF
ELSE
WAIT WINDOW "No se puede imprimir el formulario activo."
ENDIF
* Cerramos el cursor
USE IN Foto_Pantalla
* Restauramos el alias activo al entrar
IF lUsado
SELECT(cAlias)
ENDIF
Return
***************************************************************
* Author : Mauricio Atanache G.
* Date : December 10/97
* This function puts the image of the form in the clipboard, you can use
* it to send form images to other aplications as Word etc.
* Also you can modify this function to print or copy any object on
* screen.
* Parameters : oForm is an object FORM, for example THISFORM,ACTIVEFORM,
_SCREEN
**************************************************************************
Function TomaFoto
******************
lParameters oForm
Local nHwnd, tnHwnd, hDC, hDC_Mem, hBitMap, hPrevBmp
* Must use the Foxtools library, somewhere.
Declare integer FindWindow in Win32Api String cClassName, String cWindName
Declare integer GetDC in Win32Api integer nhwnd
Declare integer CreateCompatibleDC in Win32Api integer nhcd
Declare Integer BitBlt in Win32Api Integer hDestDC, Integer x, Integer y,
Integer nWidth, Integer nHeight, Integer hScrDC, Integer xsrc, Integer ysrc,
Integer dwRop
Declare Integer SelectObject in Win32Api Integer hDC, Integer hObject
Declare Integer CreateCompatibleBitmap in Win32Api Integer hDC, Integer
nWidth, Integer nHeight
Declare Integer SetClipboardData in Win32Api Integer nFormat, Integer
hObject
Declare Integer DeleteDC in Win32Api Integer hDC
Declare Integer ReleaseDC in Win32Api Integer nwnd, Integer hdc
Declare Integer DeleteObject in Win32Api Integer hDC
lnwhandle = _WFindTitl(oForm.Caption)
nHwnd = _WhToHWnd(lnwhandle)
hDC = GetDC( nHwnd )
hDC_Mem = CreateCompatibleDC( hDC )
hBitMap = CreateCompatibleBitMap( hDC, oForm.Width, oForm.Height )
If hBitMap#0
hPrevBmp = SelectObject( hDC_Mem, hBitMap )
BitBlt( hDC_Mem, 0, 0, oForm.Width, oForm.Height, hDC, 0, 0, 13369376 )
If OpenClip( nHwnd )
EmptyClip()
SetClipboardData( 2, hBitMap )
CloseClip()
Else
MessageBox( 'Error opening the clipboard', 48, 'Message' )
Endif
Else
MessageBox( 'Error creating bitmap', 48, 'Menssage' )
Endif
DeleteDC( hDC_Mem )
ReleaseDC( nHwnd, hDC )
Return .t.
*******************************************
*!* e-mail : dsmauricio@Hotmail.com <mailto:dsmauricio@Hotmail.com>
*!* Address : Crr 19 No. 75 - 20 of 401, Bogot - Colombia
*!* Telephone : 3460746 - 3460673
***********************************************************************
Saludos.
=========================
Francisco J. Simarro Lpez
f.simarro@dipualba.es <mailto:f.simarro@dipualba.es>
Departamento de Informtica
Diputacin de Albacete
<http://www.dipualba.es>
========================
Matriz a un formulario como parmetro
Luis Mara Guayn escribi en mensaje ...
La nica forma de pasar una matriz como parmetro, es pasarla por referencia.
Para ello antes de llamar al formulario:
lcAnt = SET("UDFPARMS")
SET UDFPARMS TO REFERENCE
DO FORM MiForm WITH MiMatriz
SET UDFPARMS TO (lcAnt)
Si vas a trabajar en un formulario, puedes crear una propiedad del tipo array, aa
diendo una nueva propiedad, y cuando
te pregunta el nombre le pones: aMatriz(1)
--
Luis Mara Guayn
Tucumn - Argentina

DO FORM MiForm WITH @MiMatriz


Mover una ventana sin ttulo
Hola Manuel, eso yo lo hago as:
Agrego tres propiedades al formulario
MDown: Flag para saber si est presionado el mouse
X: Referencia de la coordenada "X" donde se presion el botn
Y: Referencia de la coordenada "Y" donde se presion el boton
En el Evento: MouseDown
With ThisForm
.MDown = .T.
.X = nXCoord
.Y = nYCoord
EndWith
En el Evento: MouseUp
ThisForm.MDown = .F.
En el Evento: MouseMove
With ThisForm
If .MDown Then
.Left = .Left + nXCoord - .X
.Top = .Top + nYCoord - .Y
EndIf
EndWith
DIJ
Objetos de un formulario
No entiendo muy bien lo que quieres hacer Agustn, pero aqu van dos tips:
1) Si quieres usar el SYS(1272) para obtener una referencia a un objeto cualquie
ra, debes cambiar el nombre del formulario
en la cadena devuelta por la palabra THISFORM:
cRutaObj=STRTRAN(cRutaObj,thisform.Name,"THISFORM")
luego:
oObj=eval(cRutaObj)
2) Si lo que quieres es pasear por todos los objetos existentes en un formulario
, sin importar si los mismos estn
contenidos en containers o pageframes, puedes usar la rutina AOBJETCS() que anex
o (la incluyo para todos por que es muy pequea).
Un ejemplo de su uso:
local array aObjs[1]
local oObj,nCount
nCount=aObjects(@aObjs,thisform)
if nCount > 0
for each oObj in aObjs
....
endfor
endif
por defecto, la funcin toma en cuenta todos los objetos dentro del contenedor ind
icado (thisform en el ejemplo)
y los objetos contenidos a su vez en ellos. Si solo quieres la lista de objetos
en el contenedor, sin
incluir los que estn contenidos a su vez, solo aades .F.:
nCount=aObjects(@aObjs,thisform,.F.)
Espero que te sirva
Victor
ThisForm como parmetro
Cuando llames al formulario de busqueda debes hacerlo:
DO FORM Busquedas WHIT THISFORM
y en el Init del formulario Busquedas:
LPARAMETERS tFormPadre
ThisForm.Codigo = tFormPadre.Codigo
Con esto pasas como parmetro una referencia a todo el formulario Clientes.
Si tu necesidad es solo tomar la Propiedad Codigo del formulario Clientes, debes
llamar al formulario Busqueda:
DO FORM Busquedas WHIT ThisForm.Codigo
y en el Init del formulario Busquedas:
LPARAMETERS tCodigo
ThisForm.Codigo = tCodigo
--
Luis Mara Guayn
Tucumn - Argentina
Grficos
Dibujar cuadro, lneas, etc.
En VFP 6 lo puedes hacer con el objeto _SCREEN y FORM
Para dibujar un cuadro:
_SCREEN.Box(50,50,250,350)
Para dibujar una linea:
_SCREEN.Line(50,150,250,350)
Para dibujar un circulo:
_SCREEN.Circle(100, 200, 200, 1)
Para configurar el estilo y el ancho del trazo:
_SCREEN.DrawWith = n && n = [1..32000]
_SCREEN.DrawMode = m && m = [1..16]
_SCREEN.DrawStyle = l && l = [0..6]
Para configurar el color del trazo y fondo:
_SCREEN.ForeColor = RGB(r,g,b) && r,g,b = [0..255]
_SCREEN.BackColor = RGB(r,g,b) && r,g,b = [0..255]
Para configurar el relleno y color de las figuras:
_SCREEN.FillStyle = n && n = [0..7]
_SCREEN.FillColor = RGB(r,g,b) && r,g,b = [0..255]
Luis Mara Guayn
Tucumn - Argentina
Dimensin de una imagen
Simplemente crea el objeto Image, asigna en la propiedad picture del mismo el no
mbre archivo jpg
y le luego las propiedades width y height de la imagen:
_screen.addobject('MyPicture', 'Image')
_screen.MyPicture.picture='YourFile.jpg'
? _screen.MyPicture.width, _Screen.MyPicture.height
Saludos
Hugo
MsGraph. Tipos de grfico
Anillos -4120
Anillos seccionados 80
rea 3D -4098
rea 3D apilada 78
rea 3D 100% apilada 79
Barras 3D agrupadas 60
Barras 3D apiladas 61
Barras 3D 100% apiladas 62
Circular 3D -4102
Circular 3D seccionado 70
Circular 5
Circular seccionado 69
Circular con subgrfico circular 68
Circular con subgrfico de barras 71
Columnas 3D -4100
Columnas 3D agrupadas 54
Columnas 3D apiladas 55
Columnas 3D 100% apiladas 56
Lneas 3D -4101
rea 1
rea apilada 76
rea 100% apilada 77
Barras agrupadas 57
Barras apiladas 58
Barras 100% apiladas 59
Burbujas 15
Burbujas con efectos 3D 87
Columnas agrupadas 51
Columnas apiladas 52
Columnas 100% apiladas 53
Barra cnica agrupada 102
Barra cnica apilada 103
Barra cnica 100% apilada 104
Columna 3D cnica 105
Columna cnica agrupada 99
Columna cnica apilada 100
Columna cnica 100% apilada 101
Barra cilndrica agrupada 95
Barra cilndrica apilada 96
Barra cilndrica 100% apilada 97
Columna 3D cilndrica 98
Columna cilndrica agrupada 92
Columna cilndrica apilada 93
Columna cilndrica 100% apilada 94
Lneas 4
Lneas con marcadores 65
Lneas apilada con marcadores 66
Lnea 100% apilada con marcadores 67
Lneas apiladas 63
Lneas 100% apiladas 64
Barra piramidal agrupada 109
Barra piramidal apilada 110
Barra piramidal 100% apilada 111
Columna piramidal 3D 112
Columna piramidal agrupada 106
Columna piramidal apilada 107
Columna piramidal 100% apilada 108
Superficie 3D 83
Superficie (vista superior) 85
Superficie (estructura metlica vista superior) 86
Superficie 3D (estructura metlica) 84
Dispersin -4169
Dispersin con lneas 74
Dispersin con lneas y sin marcadores de datos 75
Dispersin con lneas optimizadas 72
Dispersin con lneas optimizadas y sin marcadores de datos 73
Radial -4151
Radial relleno 82
Radial con marcadores de datos 81
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
.OCX similar a Paint
MetaDraw en <http://www.bennet-tec.com>
ImageXpress pro en <http://www.pegasustools.com/>
pero no se si funcionen con Visual FoxPro, es cuestion de probar..!
Impresora
Cambiar la Impresora por defecto
Por Ed Rahu
Puede existir algunos casos en los que nos interese que nuestro programa estable
zca la impresora por defecto en
vez de 'someterse' a la que windows le tiene marcada. Para esto puedes utilizar
GetPrinter pero la verdad es que
no acaba de funcionar como a uno le gustara.
En realidad la clave est en usar la funcin APRINTERS(), y la clave del Registry pa
ra el usuario acutal.
La clave del Registry
HKEY_CURRENT_CONFIG\System\CurrentControlSet\Control\Print\Printers
Contiene la lista de las impresoras definidas en el sistema para el usuario que
ha hecho el login. Cada impresora se
define en una subclave y sta es la lista que nos devuelve APRINTERS() en la prim
era columna del array de dos dimensiones.
En la clave de impresoras del Registry existe una clave llamada Default que cont
iene el valor de la impresora por defecto.
Si en vez de sa escribes el nombre de la impresora que quieres usar como impreso
ra por defecto, tanto VFP como el resto de las aplicaciones Windows utilizarn esa
impresora como la impresora por defecto
EMail: edrauh@earthlink.net
Cmo configurar Reports cuya longitud del impreso sea configurable por el usuario
en Win 9x/NT para impresoras matriciales
Jos Manuel Soria
Cmo configurar Reports cuya longitud del impreso sea configurable por el usuario
en Win 9x/NT para impresoras matriciales
El Driver
- Tener instalado en la impresora el driver adecuado.
El Report
- En El Report, en el campo del primer registro se debe de poner:
Tag: vaco
Tag2: Vaco
Expr: ORIENTATION=0 + CHR(13)+CHAR(10)+PAPERSIZE=+
ALLTRIM(STR(PRTINFO(2)))+CHR(13)+CHR(10)+DEFAULTSOURCE=8
Consideraciones:
- El Report debe ser externo. Se podra reemplazar PRTINFO(2), por una variable pbl
ica para evitar que fuera externo
- Antes de realizar la impresin seleccionar la impresora y modificar el registro
Expr en modo RunTime.
- La funcin PRTINFO(2) devuelve el papel seleccionado en la impresora.
- La impresora debe ser capaz de soportar papel personalizado.
Configuracin del Driver de Impresora
- Configurar el driver de impresora en papel como personalizado (en Impresora ve
r Propiedades/Papel).
- Asignar ancho y largo adecuado
Observaciones:
Se podra configurar dos tipos de drivers iguales para una misma impresora una par
a los listados normales
y otra para los de papel personalizado de sta forma se puede trabajar con dos t
ipos de papel en la misma impresora.
Controlar un poco la impresora
Puede ser que en alguna ocasin te interese tener un control un poco ms determinado
de la impresora pudiendo saber
si tiene papel o no, si tiene tonner, si est bloqueada, etc...
Esto propiamente no se puede hacer con VFP pero s con el API de Windows. Mira est
o:
DECLARE SHORT OpenPrinter IN ;
Winspool.drv;
STRING @pPrinterName,;
INTEGER @phPrinter,;
STRING @pDefault
DECLARE SHORT ClosePrinter IN Winspool.drv;
INTEGER hPrinter
DECLARE SHORT GetPrinter IN Winspool.drv AS GetPrinterInfo;
INTEGER hPrinter, INTEGER Level,;
STRING @pPrinter, INTEGER cbBuf,;
INTEGER @pcbNeeded
lcprinter = 'LPT1:'
lnhandle = 0
llresult = (OpenPrinter(@lcprinter,;
@lnhandle, 0) # 0)
IF llresult
lnsize = 0
= GetPrinterInfo(lnhandle, 2,;
0, 0, @lnsize)
lcstruct = REPLICATE(CHR(0), lnsize)
llresult = (GetPrinterInfo(lnhandle,;
2, @lcstruct, lnsize, @lnsize) # 0)
IF llresult
lcstatus = SUBSTR(lcstruct, 73, 4)
lnstatus = 0
FOR lni = 1 TO 4
lnstatus = lnstatus + ASC(SUBSTR(;
lcstatus, lni, 1)) * ;
(256 ^ (lni - 1))
NEXT
? lnstatus
ENDIF
= ClosePrinter(lnhandle)
ENDIF
* Imprime los cdigos devueltos por Win95/98
#define PRINTER_STATUS_PAUSED 0x00000001
#define PRINTER_STATUS_ERROR 0x00000002
#define PRINTER_STATUS_PENDING_DELETION 0x00000004
#define PRINTER_STATUS_PAPER_JAM 0x00000008
#define PRINTER_STATUS_PAPER_OUT 0x00000010
#define PRINTER_STATUS_MANUAL_FEED 0x00000020
#define PRINTER_STATUS_PAPER_PROBLEM 0x00000040
#define PRINTER_STATUS_OFFLINE 0x00000080
#define PRINTER_STATUS_IO_ACTIVE 0x00000100
#define PRINTER_STATUS_BUSY 0x00000200
#define PRINTER_STATUS_PRINTING 0x00000400
#define PRINTER_STATUS_OUTPUT_BIN_FULL 0x00000800
#define PRINTER_STATUS_NOT_AVAILABLE 0x00001000
#define PRINTER_STATUS_WAITING 0x00002000
#define PRINTER_STATUS_PROCESSING 0x00004000
#define PRINTER_STATUS_INITIALIZING 0x00008000
#define PRINTER_STATUS_WARMING_UP 0x00010000
#define PRINTER_STATUS_TONER_LOW 0x00020000
#define PRINTER_STATUS_NO_TONER 0x00040000
#define PRINTER_STATUS_PAGE_PUNT 0x00080000
#define PRINTER_STATUS_USER_INTERVENTION 0x00100000
#define PRINTER_STATUS_OUT_OF_MEMORY 0x00200000
#define PRINTER_STATUS_DOOR_OPEN 0x00400000
#define PRINTER_STATUS_SERVER_UNKNOWN 0x00800000
#define PRINTER_STATUS_POWER_SAVE 0x01000000
Cuelgues
Despues de muchas horas de investigacin, probando con w95, w98, con sp3, sin sp3,
con otros drivers etc. Hemos descubierto
que al menos con impresorad stylus color 600, laserjet 6p/6m y otras muchas el c
uelgue de la impresora se soluciona cambiando
en la bios el modo de lpt1 (EPP+SPP) u otro modo, lo mejor probar con todos.
Para cuelgue de stylus 600, se soluciona con el driver que viene con w98, puesto
que con los drivers que estn en las paginas
de epson, da igual la versin del driver (la ltima es de 1998) se cuelga, adems camb
iar el modo de lpt1 a (EPP+SPP) por ejemplo.
Nada mas y si espero que a alguien le sirva.
Un saludo a todos.
Imprimir en cualquier impresora
Abre el fichero frx del report como si fuera una tabla y en el primer registro d
eja en blanco los campos tag, tag2 y expr.
Cuidado porque esto se cuelga y da errores en NT.
Angela.
Impresora por Defecto
Por la Redaccin de FoxPress
<http://www.fpress.com/>
Otro tema recurrente es la forma de cambiar la impresora por defecto que usa la
aplicacin.
De forma interactiva se puede usar mediante SYS(1037) y SET PRINTER TO
NAME GETPRINTER()
Pero quizs la forma mejor de hacerla por cdigo sea usando el Windows Sripting Host
con un cdigo parecido a:
oWshNet = CREATEOBJ('Wscript.Network')
oWshNet.SetDefaultPrinter(Nombre de la impresora o del device)
Este cdigo funciona con la versin 2.0 del WSH pero no con la versin 1.0
FoxPress - Enero de 2000
1999 FoxPress. All rights reserved
Imprimir formularios
printscreen(_whtohwnd(_wontop()), "Ventana Activa")
function printscreen
LPARAMETERS tnHWnd, tcJobName
LOCAL lcJobName && Print job name
LOCAL lnRetVal && Return value from API functions
DECLARE INTEGER PrintWindow IN DibApi32 ;
INTEGER HWnd, ;
INTEGER fPrintArea, ;
INTEGER fPrintOpt, ;
INTEGER wxScale, ;
INTEGER wyScale, ;
STRING @ szJobName
*!* Print entire window or just client area
#DEFINE PW_WINDOW 1
#DEFINE PW_CLIENT 2
*!* How to size the printed image
*!* PW_BESTFIT resizes to fill paper while retaining proportions
*!* PW_STRETCHTOPAGE resizes to completely fill paper, distorts proportions
*!* PR_SCALE scale print size
#DEFINE PW_BESTFIT 1
#DEFINE PW_STRETCHTOPAGE 2
#DEFINE PW_SCALE 3
lcJobName = tcJobName + CHR(0)
lnRetVal = PrintWindow( tnHWnd, PW_WINDOW, PW_STRETCHTOPAGE, 0, 0,
@lcJobName)
IF lnRetVal != 0
IF lnRetVal != 6 && 6 = User canceled printing
= MESSAGEBOX("No se puede imprimir la ventana" + chr(13) + chr(10) + ;
"La llamada a 'PrintWindow' de API ha devuelto: " + STR(lnRetVal), ;
0 + 48, ;
"A.G.P.")
ENDIF
ENDIF
--
Saludos,
-----------------------------
Carlos Yohn Zubiria

Papel de tamao personalizado
Para el tamao personalizado del papel.
Abre tu reporte como una tabla, as:
Use mireporte.frx
inmediatamente ejecutas
Blank Fileds Expr, Tag, Tag2
la instruccin anterior elimna los datos de los campos memo especificados del prim
er registro, estos campos
continen informacin del tamao de hoja.
Use Para cerrar la Tabla.
De esta forma, a la hora de imprimir el reporte tomar el tamao de hoja especificad
o en la impresora.
Saludos!
Del Gaviln!
Puertos
El Set printer actua a travs del SO (Windows), para saltarse windows directamente
al puerto utiliza ... TO LPT1 o LPT2,
es decir report form ... to lpt1 o lpt2.
Francisco M.
Redireccionar impresion
Para solucionar esto puedes hacer lo siguiente.
1. a una variable cualquiera guardas la impresora que tienes por defecto ej. ide
fault=set("PRINTER",2)
2. buscas con aprinters el nombre de la otra impresora para tener el nombre de e
sta. ej. =aprinters(x)
en esta matriz tienes todas las impresoras instaladas en tu pc. entonces
3. a otra variable asignas el nombre de la otra impresora asi itemporal=x(1,1) o
itemporal=x(2,1) ...
en pocas palabras debes conocer el nombre de la otra impresora.
4. ahora preparas el envio.
set printer on
set device to print
set printer to name (itemporal)
@ prow(),0 say "Primera linea"
@ prow()+1,0 say "Segunda linea"
.
.
5. haces el cambio de la impresora para imprimir el otro reporte.
set printer to name (idefault)
@ prow(),0 say ""
....
Espero te sirva.
Roger
Informes
2 tamaos para un report
Ricardo,
Si el informe no est incluido en el proyecto (pues entonces sera de solo lectura)
puedes antes de emitirlo cambiar los valores del
campo 'expr' del primer registro del archivo frx, que como sabes es una tabla fo
x.
Por ejemplo para poner tamao personalizado a 600 x 500 decimas de milimetro tendra
s que incluir las siguientes lneas
(sustituyendo las existentes):
PAPERSIZE=256
PAPERLENGTH=600
PAPERWIDTH=500
Espero que te sirva.
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
3 informes en uno
Primero subes el ENCABEZADO DE PAGINA al Tope del Reporte.
Luego Bajas el DETALLE al final del reporte. en el espacio intermedio creas tu r
eporte.
Yo lo hice para emitir Cheques. Tengo una primera parte con el detalle del chequ
e, luego en la mitad est el cheque y
al final otra copia del detalle.
Esto lo hice con ARREGLOS (arrays) en vez de campos de la Base de Datos.
Anclar la barra del preview
Por la Redaccin de FoxPress
Copyrights 1998 by FoxPress, All rights reserved
FoxPress, Octubre 1998
Qu te parece....
Report Form ... Preview Nowait
if wexist("Print Preview")
move window 'Print Preview' to 10,10
mouse dblclick at 11,11
endif
Centrar verticalmente un report
Para centrar las filas agrupadas calcula las filas en blanco (nNumLineasInsertar
) que deberas insertar al principio de la cabecera.
Solo necesitas saber el nmero total de lneas que caben en el report.
Defines una variable en el report llamada cRetornos
cRetornos la puedes calcular en el Evento <al entrar> de la cabecera del report
correspondiente a la parte agrupada.
Para ello utilizas una funcin, por ejemplo CalculaLineasInsertar(@cRetornos)
La funcin ser de la siguiente forma:
Function CalculaLineasInsertar(tcRetornos)
.... calcular nNumLineasInsertar
tcRetornos = REPLICATE( CHR(13), nNumLineasInsertar )
return
Pintas cRetornos en una caja de texto que ocupe todo el ancho del report, y la c
olocas inmediatamente encima de donde quieras
que se desplace el contenido del report.
Activas la opcin <ajustar al contenido del texto>.
Todos los controles del grupo los pones flotantes.
De esta forma el grupo de lneas subir o bajar de altura de acuerdo al valor de cRet
ornos.
Prubalo .....
Un saludo
Paco Satu
Cmo abrir un Report con un Zoom determinado
Por la Redaccin de FoxPress
En los preview de los Report se pueden hacer Zoom pero puede ser que al cliente
le interese que se abran con un tipo
de Zoom determinado. Que yo sepa no hay una forma fcil de hacer esto. Lo que se m
e ocurri es lo siguiente:

report form myreport preview nowait
move window "Print Preview" to 20,40
mouse click at 22,70
keyboard '{DNARROW}' && 75%
keyboard '{DNARROW}' && 50%
keyboard '{ENTER}'
Si conoces una forma mejor?
Cmo exportar los Report a HTML
Vladimir Shevchenko
Copyrights 1998 by FoxPress, All rights reserved
FoxPress, Mayo 1998
Muchos programas de tratamiento de texto o generadores de informes tienen la pos
ibilidad de exportar sus resultados a documentos
con formato HTML. Sin saber HTML, puedes tener lo mismo usando algn pequeo truco
como el que te comento a cotinuacin.
Lo nico que tienes que hacer es crear un fichero ASCII usando las funciones de ba
jo nivel de Visual FoxPro.
Algo como lo siguiente puede servir.
LOCAL lnCanal,lcOutput
lnCanal=FCREATE('test.html')
lcOutput='
Esto es un test
'
FPUTS(lnCanal,lcOutput)
FCLOSE(lnCanal)
Sonrie por favor....
Cmo incluir la Barra de Herramientas del diseador de Reports en tiempo de ejecucin
Basado en Q138969
En los ejecutables que uno realiza le puede interesar dotar a sus usuarios de la
posibilidad de modificarse los informes
para incorporar nuevos campos o eliminar algunos de los que has puesto.
Esta posibilidad la puedes incluir poniendo el MODI REPORT con el report corresp
ondiente.
No obstante, la barra de herramientas del diseador de Reports no siempre se muest
ra y es relativamente fcil
que el usuario la pierda. A continuacin se explica como dejar disponible para el
susuario esa Barra de Herramientas
Hay dos mtodos: el primero pasa por el archivo de recursos FoxUser. El segundo ut
iliza el men y el men del sistema.
Mtodo UNO
La informacin de la Barra de Herramientas se guarda en el archivo de recursos Fox
user. Si un report se modifica o se crea
de nuevo en el entorno de desarrollo teniendo las barras de herramientas abierta
s cuando el informe queda guardado tal estado
quedar de manifiesto cuando se ejecute el report.
NOTA: El submen de Barra de Herramientas no est disponible hasta que se abre un re
port. Cuando usas este mtodo
para asegurar que las barras de herramientas estn disponibles desde dentro de la
aplicacin , debes tener en cuenta estas
condiciones:
Deberas haber modificado o crado un report en el entorno de desarrollo con una ba
rra de herramientas abierta.
A continuacin deberas guardar el report con lo que se guardar el entorno y por tan
to la barra de herramientas.
El archivo de recursos Foxuser se debera distribuir con la aplicacin. El archivo d
e recursos se debera introducir dentro
de tu aplicacin o debera ser marcado como Readn-Only. Si no se acta as, cuando se mo
difique el report y se
cierre la barra de herramientas y el report guardado, el estado de la barra de h
erramientas tambin quedar guardada.
Si no est cuando se modifica el report y se cierra la barra de herramientas el es
tado de la barra de herramientas
tambin queda guardado. Como resultado al quedar la barra de herramientas cerrada
no hay forma de reabrirla desde
dentro de tu aplicacin. Marcando el archivo de recursos como de solo lectura, si
el usuario cierra las barras de
herramientas, el archivo de recursos no ser actualizado con el nuevo estado de cer
rado.
Mtodo Dos
Una segunda forma y quizs ms fcil para obtener el mismo resultado pasa por el uso d
el men de sistema de Visual FoxPro.
El siguiente ejemplo muestra como hacer esto:
1. En la ventana de rdenes escribe: CREATE MENU TESTMENU
2. En el prompt, escribe la palabra "Ver" El resultado debera ser de establecer u
n Submenu.
3. Click el botn de Opciones.
4. Debido a que la opcin Ver te lleva a un submen, necesitas hacer click en el botn
de Create localizado a la derecha del
Submenu. Para el prompt, el texto standard es "Toolbars"
5. Establece el resultado a Bar #. El prompt a la derecha deber ser _mvi_toolb.
6. En la opcin del men Ver, click las opciones del Men, y llama al men _mview.
Cuando compiles el men deberas tener la funcionalidad de la Barra de Herramientas
en tu aplicacin.
1999 FoxPress. All rights reserved.
Cmo quitar el botn de imprimir de los Preview de los Report en los ejecutables
De la Web
1) SET resource OFF
2) USE main_esource_file_name
3) COPY structure to "ViewOnly.DBF"
4) SET resource to "ViewOnly.DBF"
5) SET resource ON 6) Select "View", "Toolbars".
7) Escoge "Print Preview", and click Customize
8) Click-and-drag el botn con el icono de la impresora OFF del Preview Toolbar
9) Click "Close" en la Customize Toolbar window
10) Si normalmente quieres que el Preveiw Toolbar este anclado (docked), hazlo a
hora
11) SET resource OFF
12) SET resource TO main_resource_file_name
13) SET resource ON
14) USE "ViewOnly.DBF" exclusive
15) BROWSE
16) Localiza el registro donde ID="TTOOLBAR" y Memo contiene "Print Preview"
17) Change ReadOnly to True
18) Exit the Browse-window & close the "ViewOnly.DBF" table.
19) INCLUDE the "ViewOnly.DBF" and "ViewOnly.FPT" files in your project.
20) Cuando quieras hacer un preview de un report SIN el icono de imprimir, usa l
as siguientes rdenes:
21) m.OldResourceOnOff = SET("RESOURCE")
22) m.OldResourceName=SET("RESOURCE", 1)
23) SET resource OFF
24) SET resource TO "ViewOnly.DBF"
25) RELEASE window "Print Preview"
26) REPORT FORM my_report PREVIEW
27) SET resource OFF
28) SET resource to &OldResourceName
29) SET resource &OldResourceOnOff
30) RELEASE window "Print Preview"
La rden para borrar la ventana del "Print Preview" se incluye para asegurarse de
que FoxPro usara la configuracin del ToolBar en el nuevo archivo de recursos; en c
aso de que el preview de un report haya sido realizado bajo un archivo de recurs
os diferente (o con ninguno), donde el icono de la impresora s que estaba disponi
ble. En ese caso sin la rden RELEASE, FoxPro usara la configuracin del original too
lBar, en lugar de los valores establecidos en el archivo de recursos "ViewOnly".
Esto no es algo fcil de imaginar pues ni la forma de adaptar esas barras de herr
amientas ni los archivos de recursos son explicados con detalle en la documentac
in de VFP.
1999 FoxPress. All rights reserved.
Contador de hojas
Se corre el reporte dos veces. La primera vez la salida del reporte va a una ven
tana no visible.
* Se define la ventana
Define Window x From 1,1 To 20,20
* Se activa la ventana de manera invisible
Activate Window x NoShow
* Se prepara una variable pblica para recibir el nmero de hojas
oApp.nPaginas = 0
* Se ejecura el reporte, cuyo nombre est en la variable cReporte
Report Form (cReporte)
* Se guarda el nmero de hojas del reporte
oApp.nPaginas = _PAGENO
* Se elimina la ventana de paso
Release Window x
* Se activa la ventana actual, en este caso "informes"
Activate Window Informes
* Se ejecuta el reporte a la impresora, como quieras
* Dentro de tu reporte usas la variable oApp.nPaginas para la expresin que
deseas.
* Por ejemplo "ALLTRIM(STR( _pageno)) de oApp.nPaginas"
Crystal Report. Cambiar datos
Creo que lo que quieres es conectar tu reporte a otra base de datos, (si no es a
si disculpa).
para realizar esto debes entonces realizar lo siguiente:
CrystalReport1.DataFiles(0) = cPathDB
donde cPathDB es una varible donde colocas la direccion de la base de datos.
Cristal Report. Enviar parmetros
Hola claro que se pueden enviar parametros, puedes enviar algun valor a una form
ula que este insertada en el reporte por
ejemplo
En tu reporte puedes insertar un fomula field (o campo formula), tu por default
o por que te dieron ganas le asignaste
el valor de: "Miercoles", y cuando vas a mandar llamar el reporte ya no quieres
que diga Miercoles sino
Lunes entonces lo que debes hacer es dentro del codigo de visual establecer
reporte.formulas(0)="FORMULA='" + DATO + " ' "
aqui cabe sealar que las formulas dentro de un reporte se manejan o se hacen refe
rencias como elementos de un arreglo,
pero no quiere decir que la formula "FORMULA", sea el elemento 0 del arreglo si
no que le indicas al
crystal cuantas formulas estas usando me entiendes?? lo de menos es el indice qu
e le des.
Crystal Report. Informes
Select * from myTable where Something into cursor myCursor
_CRReport("myCursor","c:\myCR_RPT_Files\", "myTest.RPT", "myTable")
return
Function _CRReport
Lparameters tcCursorName, tcPath, tcRPTName, tcTableName
lcAlias = alias()
Select (tcCursorName)
lcTemp = sys(2015)
Copy to (tcPath+lcTemp) type fox2x
oCrystal=CreateObject("Crystal.CRPE.Application")
#Define WS_MAXIMIZE 29949952
Declare integer GetForegroundWindow in WIN32API
Declare short IsWindow in WIN32API integer
oRpt = oCrystal.OpenReport(tcRPTName)
With oRpt
With .Database.Tables(tcTableName)
.Location = tcPath+lcTemp+".dbf"
Endwith
With .PrintWindowOptions
.CanDrillDown = .t.
.HasCancelButton = .t.
.HasCloseButton = .t.
.HasExportButton = .t.
.HasGroupTree = .t.
.HasNavigationControls = .t.
.HasPrintButton = .t.
.HasPrintSetupButton =.t.
.HasProgressControls =.t.
.HasRefreshButton =.f.
.HasSearchButton =.t.
.HasZoomControl =.t.
Endwith
.preview ("Report Preview "+"by VFP",,,,,WS_MAXIMIZE,0)
Endwith
lnHwndActiveX = GetForegroundWindow() && Save window handle
Do while IsWindow(lnHwndActiveX) # 0 && Wait while ActiveX Alive
Enddo
Clear dlls
Erase (tcPath+lcTemp+".*")
If !empty(lcAlias)and used(lcAlias)
Select (lcAlias)
Endif
Eliminar el botn cancelar al imprimir
Para quitar el icono de impresora:
En modo diseo:
1.- Modifica cualquier informe
2.- Asegrate de que ves alguna barra de herramientas (por ejemplo la de controles
de informes)
3.- Pincha con el botn derecho en cualquier barra de herramientas.
4.- De la lista que aparece selecciona 'Vista preliminar (Aparece la barra vista
preliminar)
5.- Pincha con el botn derecho en la barra de herramientas 'Vista preliminar'
6.- Elige la opcin 'personalizar' (Aparece la ventana 'Personalizar barra de herr
amientas...')
7.- Pincha el botn 'imprimir' (icono impresora) de la barra de herramientas y arrs
tralo fuera de ella (desaparecer de la barra)
8.- Sal del diseo de informe (no es necesario guardar cambios)
9.- Distribuye tu archivo de recursos (foxuser.dbf y foxuser.fpt) junto con las
aplicaciones.
Para evitar que lo vuelvan a poner:
1.- Abre la tabla de recursos (use foxuser again shared)
2.- Busca un registro cuyo 'name' es 'Vista preliminar' (locate for name = "vist
a preliminar")
3.- Cambia el valor del campo 'readonly' de ese registro a .t.
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Enviar un informe por e-mail
Mira, yo he visto en otras noticias anteriores y he encontrado una pgina que cont
iene un software que te permite enviar
tus reportes por mail. La pgina es www.hotsend.com <http://www.hotsend.com> en el
la lo puedes bajar. es absolutamente
gratis y facil de usar. Te crea una Impresora, la cual tu seleccionas al tirar e
l reporte y luego te carga un programa que te
indica si quieres enviar el reporte o guardarlo en disco. ES MUY BUENO.
Fuente predeterminada
Bueno, yo solo conozco una manera y se hace despues de crear el informe, no es n
ada intuitiva pero funciona... me explico:
1. USE miinforme.frx (creo que te lo podias imaginar :)
2. REPLACE fontface with "Tahoma", fontsize WITH 12, fontstyle WITH 1 FOR objtyp
e = 1
Con esto ponemos como predeterminado la fuente Tahoma a 12 puntos y negrilla, si
en fontstyle ponemos 0 tendremos letra normal.
Con esto se podria hacer una rutina que investigara en el directorio y lo hicier
a para todos los informes, o sea recursiva.
Saludos,
Pablo Roca
La Corua - Espaa
<http://pagina.de/visualfox> (Portal Gratuito de VisualFoxPro en espaol)
Impresoras matriciales
Mira el archivos DOSPRINT.ZIP en la seccin Archivos de mi pgina. Es una clase que
te facilita la vida a la hora
de generar reportes para impresoras matriciales.
Victor Espina
<http://www.mitrompo.com/vespina>
Imprimir con formato de Excel
#define xlLastCell 11
#define xlMaximized -4137
#define xlRangeAutoformatClassic2 2
#define xlPortrait 1
use MyTable && or SELECT * INTO MyCursor
cFileName = "MyXLSFile" && o lo que sea, incluyendo ruta
*copy to (cFileName) fields (cFields) TYPE xls
copy to (cFileName) TYPE xls
* abrir excel y formatear datos
oExcel = CreateObject("Excel.Application")
if vartype(oExcel) != "O"
* mostar mensaje de error aqui
return .F.
endif
* hacer a Excel visible durante desarrollo
*oExcel.visible = .T.
* abrir el workbook
oExcel.SheetsInNewWorkBook = 1
oWorkbook = oExcel.Workbooks.Open(cFileName)
* enombrar la pgina (shhet) a lo que quiera
oActiveSheet = oExcel.ActiveSheet
oActiveSheet.Name = "MyData"
oExcelApp = oExcel.Application
oExcelApp.WindowState = xlMaximized
* buscar direccin de la ltima celda
lcLastCell = oExcel.ActiveCell.SpecialCells(xlLastCell).Address()
* ajustar ancho de columnas
lnMarker1 = at("$",lcLastCell,1) && i.e. 1 when lcLastCell = "$AF$105"
lnMarker2 = at("$",lcLastCell,2) && i.e. 4 when lcLastCell = "$AF$105"
lnStartPos = lnMarker1 + 1
lnStrLen = lnMarker2 - lnStartPos
oExcel.Columns("A:" + substr ;
(lcLastCell,lnStartPos,lnStrLen)).EntireColumn.AutoFit
* usar autoformat (aqui usamos 2 como ejemplo)
oExcel.Range("A" + alltrim(str(nTOPBLANKROWS+1)) + ":" + lcLastCell).Select
oExcel.Selection.AutoFormat(xlRangeAutoformatClassic2,.t.,.t.,.t.,.t.,.t.,.t
.)
* marcar area a imprimir
oActiveSheet.PageSetup.PrintArea = "$A$1:" + lcLastCell
* definir pie de pgina
With loActiveSheet.PageSetup
*.LeftHeader = ""
*.CenterHeader = ""
*.RightHeader = ""
.LeftFooter = "&BMy Footer goes here&B"
.CenterFooter = "&D"
.RightFooter = "Page &P"
*.PrintHeadings = .F.
.PrintGridlines = .F.
.CenterHorizontally = .T.
.CenterVertically = .F.
.Orientation = xlPortrait
endwith
* guardar Excel en formato nuevo (COPY TO XLS usa formato viejo)
oWorkbook.Save()
* mostrar Excel al usuario
oExcel.visible = .T.
Espero te sea de ayuda
--
Alex Feldstein - MCP
----------------------------------------------------------
Imprimir texto DOS desde VFP
set printer to lpt1
set device to print
copy file NomArchivo.prn to lpt1
set printer to
set device to screen

Informe con nmero total de pginas (Hoja x de y)
Para imprimir un informe con un Pie de pgina que tenga el formato "Pgina # de #",
donde se indica el n de pgina actual y
el total de pginas del informe, se debe usar una funcin definida por el usuario,
tal como se explica a continuacin.
Para obtener el nmero total de pginas, es necesario ejecutar el informe dos veces.
Para lanzar el informe se puede utilizar
el siguiente cdigo :
**********PRINCIPIO DE PROGRAMA*****************
CLEAR
CLOSE DATABASES
USE tabla.dbf && tabla.dbf es la tabla utilizada por el Informe
pgcnt = 0 && Almacenar el nmero de pginas total
check =.T. && Para ejecutar la funcin pgcnt solo una vez
Old_Con = SET('CONSOLE')
SET CONSOLE OFF
REPORT FORM Informe NOCONSOLE && 'Informe' se lanza una 1 vez
REPORT FORM Informe TO PRINTER && 'Informe' se imprime
SET CONSOLE&Old_Con
PROCEDURE pgcnt
check =.F.
pgcnt = _PAGENO && Obtiene el nmero total de pginas
RETURN ''
************FIN DE PROGRAMA***********************
La variable 'check' se utiliza para impedir que la funcin PGCNT() se ejecute ms de
una vez.
Se debe modificar el informe para introducir en la Banda de Resumen un campo con
la siguiente expresin:
IIF(check=.T.,PGCNT(),'')
En el Pie de pgina del informe, se debe introducir:
Pgina _PAGENO de PGCNT
donde 'Pgina' y 'de' se pueden introducir mediante un objeto Etiqueta y _PAGENO y
PGCNT serian las expresiones de dos objetos campo.
La funcin IIF() comprueba si la variable 'check' es.T. la primera vez que se ejec
uta el informe; si 'check' es.T., ejecutar la funcin
PGCNT(). Esta funcin simplemente almacena la variable _PAGENO en otra variable ll
amada 'pgcnt'.
En el Informe final, 'pgcnt' tendr el valor correcto.
Informe en Word
Si te refieres a la clase frx2word aqui tienes un ejemplo
USE D:\COMPARTIR\VALCAR_05-09-2000
lcTitulo = "PRUEBA"
oFrx2Word = CREATEOBJECT('Frx2Word')
oFrx2Word.SaveFolder="C:\Temp\"
oFrx2Word.DOC_FileName="Wordprueba.doc"
nSuccess=oFrx2Word.ReportForm("Clan_Email")
IF nSucces = 0
= messagebox('siiiiiiiiiii', 48 )
else
= messagebox('no funciona.....', 48 )
endif
Saludos, Emiliano.
--
-------------------------------------------------------------
Mail to: Emil_39 ARROBA hotmail.com
-----------------------
ICQ 34013175
Informe en HTML
** Abri el table (esta o caulquira)
USE d:\vfp50\samples\data\employee.dbf
**********************
** el siguiente codigo te hace un report de todos los fields
** te recomiendo que en vez de esto agas el reporte como
** lo queres y lo unico que tenes que hacer es cabiar el nombre que
** le das a tu reporte por la palabra "EXAMPLE" y delete CREATE REPORT line
CREATE REPORT EXAMPLE FROM employee
DO (_GENHTML) WITH "EXAMPLE","EXAMPLE.FRX"
**********************
Sebastin Menndez.
Informes en miniatura
Supongo que te imprime en miniatura cuando utilizas la clusula PROMPT en el REPOR
T FORM ...
Yo evit el problema lanzando un SYS(1037) (creo que es ese) antes del REPORT FORM
... en lugar de aadir PROMPT.
Miquel ngel Guerrero
Interrumpir impresin
O poner el UDF en el while del report form.
Report form reporte while sigue()
func sigue
** aqui chequear inkey() o algun flag activado con un
** on key , etc. Hay muchas formas.
Imprimir varias copias de un informe
Printjob
_pcopies = total_copias
report form informe noconsole to printer
endprintjob
Hay dos maneras posibles. La primera es mas sencilla pero tiene el problema de q
ue es bastante mas lenta
1) FOR i=1 To ncopias
REPORT FORM ...
ENDFOR
2) =ReportCopias("c:\listados\mireport",ncopias)
REPORT FORM ...
=ReportCopias("c:\listados\mireport",1)
FUNCTION ReportCopias
LPARAMETER lcFRX, lnCopias
LOCAL lcNewExpr, lnStartCopiesLine, lcStartAtCopiesLine, lnEndCopiesLine ;
lnLenCopiesLine, lcTop, lcBottom, lcAlias
#DEFINE vfCRLF CHR(13) + CHR(10)
IF !(UPPER(RIGHT(lcFRX, 4)) = ".FRX")
lcFRX = lcFRX + ".FRX"
ENDIF
lcAlias = ALIAS()
SELECT 0
USE (lcFRX)
LOCATE FOR objType = 1 AND objCode = 53
IF EMPTY(EXPR)
lcNewExpr = "COPIES=" + ALLT(STR(lnCopias)) + vfCRLF
ELSE
lnStartCopiesLine = ATC("COPIES", EXPR)
lcStartAtCopiesLine = SUBSTR(EXPR, lnStartCopiesLine)
lnEndCopiesLine = ATC(vfCRLF, lcStartAtCopiesLine)
lnLenCopiesLine = LEN(SUBSTR(lcStartAtCopiesLine, 1, lnEndCopiesLine))
lcTop = SUBSTR(EXPR, 1, lnStartCopiesLine - 1)
lcBottom = SUBSTR(EXPR, (LEN(lcTop) + lnLenCopiesLine))
lcNewExpr = lcTop + "COPIES=" + ALLT(STR(lnCopias)) + lcBottom
ENDIF
REPLACE EXPR WITH lcNewExpr
USE
IF !EMPTY(lcAlias)
SELECT (lcAlias)
ENDIF
ENDFUNC
Maximizar venta de print preview
Hay un truco que funciona muy bien:
KEYBOARD '{CTRL+F10}'
REPORT FORM MiReporte PREVIEW
Luis Mara Guayn
Tucumn - Argentina
Nmero de copias de un Report
Por la Redaccin de FoxPress
<http://www.fpress.com/>
Otro problema comn es el nmero de copias de un report.
Tenemos varias opciones:
El sistema clsico lea el cdigo de dentro de la tabla del report y cambiaba el valor
de la variable copias por las que
te interesaba: el cdigo que hace eso es:
close all
set defau to g:\
lcnomInf = 'inform3.frx'
lcAlias = 'inform3'
lncopias = 3
lcCopias = ALLTRIM( PADR(lnCopias,2) )
SELECT 0
*- Abre el report
USE (lcNomInf) AGAIN ALIAS (lcAlias)
set step on
GO TOP
IF lnCopias > 1
*- Cambia el nmero de copias
lnPos = AT('COPIES', &lcAlias..EXPR)
IF lnPos > 0
REPLACE &lcAlias..EXPR WITH ;
STUFF(&lcAlias..EXPR, lnPos+7,;
1, lcCopias)
ENDIF
ENDIF
Otro sistema ms sencillo es usar la rden PRINTJOB.
En la Ayuda dice que: PRINTJOB ... ENDPRINTJOB inicializa la impresora y algunas
variables del sistema que
afectan al resultado impreso. Puede enviar cdigos de control a la impresora, expu
lsar una pgina en la impresora
antes o despus de un trabajo de impresin, inicializar el nmero de columna de la imp
resora y controlar el nmero de copias impresas.
Con lo que bastara que antes de iniciar el proceso de impresora se estableciera e
l valor de la variable del sistema _PCOPIES
al valor que nos interesa y meter el REPORT FORM dentro de un bucle PRINTJOB...
ENDPRINTJOB.
Una vez salido del bucle deberamos reestablecer el _PCOPIES = 1 .
FoxPress - Enero de 2000
1999 FoxPress. All rights reserved
Nmero total de pginas
************************************************************
*
* Clase: report_contarpaginas
*
* Devuelve el nmero de paginas de un report
*
* Parametros:
*
* Nombre del report
*
* Ejemplos:
*
* lntotpaginas = report_contapaginas("minforme")
*
* Retorno
*
* El numero de paginas del informe.
*
* Nota
*
*
* Creacin : 08/09/1999 PRR
* Ultima Modificacin: 14/04/2000 RAPY Rafael Angel Ponce Yllanes <mailto:rafaelp@
dms.com.pe>
*
************************************************************
PARAMETERS lc_report
LOCAL nPaginas
nPaginas = 0
DEFINE WINDOW x FROM 1,1 TO 2,2
ACTIVATE WINDOW x NOSHOW
REPORT FORM (lc_report) NOCONSOLE
nPaginas = _PAGENO
RELEASE WINDOW x
RETURN npaginas
NOTA: gracias a Jose Luis Santana Blasco <mailto:jlsantana@tabimed.cam.es> y a R
afael Angel Ponce Yllanes <mailto:rafaelp@dms.com.pe>
por la aclaracin del NOCONSOLE, con esto se mejora mucho la velocidad.
Preview de Report con seleccionar impresora
Por la Redaccin de FoxPress
<http://www.fpress.com/>
El Diseador de informes de VFP est muy bien pues puedes distribuirlo sin tener que
pagar royaltees pero tiene un look un poco
anticuado y MS no parece tener muchas intenciones en mejorarlo.
Uno de los problemas ms frecuentes que se encuentran los desarrolladores es la fo
rma de tener una preview del report y luego
dar la posibilidad de escoger la impresora: muchos se encuentran con la imposibi
lidad de compaginar las dos cosas
(preview y seleccionar la impresora), pues bien, el cdigo para poder compaginar l
as dos cosas es:
REPORT FORM inform1 NOCONSOLE TO PRINTER PROMPT PREVIEW
FoxPress - Enero de 2000
1999 FoxPress. All rights reserved
Quitar barra de herramientas
Fede, debes aadir 'nowait' a tu linea 'report' y en la siguiente linea de comando
la instruccin 'hide/release windows'.
Por cierto, para que incluyes 'while ! eof()' es que no te hace todos los registr
os en tu informe si no la pones? Prueba a quitar ese 'while'
Francisco Lorente. Murcia
******************************
Tamao de Report Personalizado
Por la Redaccin de FoxPress
<http://www.fpress.com/>
Uno de los problemas ms frecuentes con los report es la necesidad de adapta el ta
mao al que te indica un cliente que
quiere reaprovechar papel.
Muchas veces lo mejor ser cambiar el contenido del campo EXPR del primer registro
del report para cambiar las dimensiones
del report. Mira la funcin PRTINFO() para obtener las claves de las dimensiones e
xactas.
FoxPress - Febrero de 2000
1993-2000 FoxPress. All rights reserved
Ttulos de los Report
Por la Redaccin de FoxPress
Cuando previsualizas un Report con la rden:
REPORT FORM miForm PREVIEW
El caption del report aparece en la ventana de previsualizacin. La forma de conse
guir que no salga es
definir una ventana para que dentro de ella se visualice el previsionado del Rep
ort y ahora s que le podemos
poner un ttulo a esa ventana:
DEFINE WINDOW lw_report FROM 0,0 TO SROWS(), SCOLS() title "Mi Report"
REPORT FORM miReport PREVIEW WINDOW lw_report
Con lo anterior ya te basta pero si quieres ponerlo en una clase y dejarlo ya pr
eparado para todos tus reports podras escribir:
Define Class PreviewWindow As Form
Name = "frmPreview"
Caption = 'Report'
WindowState = 2
Proc Init
Parameters ThisTitulo
If PCount()>0
This.Caption = ThisTitulo
Endif
This.Show
EndProc
EndDefine
Y para invocarlo podrs escribir:
Local oPrev
oPrev = CreateObject("PreviewWindow", "My Custom Caption")
REPORT FORM myrepform NOCONSOLE PREVIEW WINDOW frmPreview
Truco para el preview de los reports
Debido a que varios amigos no encontraban el "truco" para los previews el cual t
enia por asunto "Un poco mas de control
sobre los Previews....", lo vuelvo a enviar de nuevo con otro asunto.
Un saludo a todos:
Jess Sanz
Aplicante - Spain
-----------------------------------------------------------------------
Siempre me han 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 (cosa que ha muchos de mis clientes no le
s parece muy correcto).
ltimamente he visto en el grupo que se han hecho varias consultas, acerca del tem
a, y me he dicho:
"Venga Jess, a ver si haces algo que valga para todo el grupo de fox que tanto te
ha enseado a ti"
Y mira por donde, dando algunas que otras vueltas, me ha salido la siguiente rut
ina. 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
DEFINE WINDOW wPreview FROM 0,0 TO 1,1;
TITLE 'Vista preliminar' CLOSE SYSTEM NAME oPreview
ZOOM WINDOW wPreview MAX
ON KEY LABEL UPARROW;
MOUSE CLICK AT 5,oPreview.Width-8;
PIXELS WINDOW wPreview
ON KEY LABEL DNARROW;
MOUSE CLICK AT oPreview.Height-22,oPreview.Width-8;
PIXELS WINDOW wPreview
ON KEY LABEL LEFTARROW;
MOUSE CLICK AT oPreview.Height-10,6;
PIXELS WINDOW wPreview
ON KEY LABEL RIGHTARROW;
MOUSE CLICK AT oPreview.Height-10,oPreview.Width-22;
PIXELS WINDOW wPreview
ON KEY LABEL HOME;
MOUSE DBLCLICK AT 18,oPreview.Width-8;
PIXELS WINDOW wPreview
ON KEY LABEL END;
MOUSE DBLCLICK AT oPreview.Height-35,oPreview.Width-8;
PIXELS WINDOW wPreview
REPORT FORM (NombreInforme);
TO PRINTER PROMPT PREVIEW WINDOW wPreview
POP KEY
SET RESOURCE ON
Internet
Conexin a archivo
poExplorer = CreateObject("InternetExplorer.Application")
*-- el sitio donde esta el archivo .zip
poExplorer.Navigate("ftp://www.vicentetrapani.com/download/constant.zip")
poExplorer.Visible=.T.
Release poExplorer
--
Luis Mara Guayn
Tucumn - Argentina
Descargar archivos
en realidad es muy facil descargar un archivo desde la web. ya sea desde el expl
orador o desde vfp, lo importante es que el cliente
acceda a traves de una pagina de html. la descarga de cualquier archivo es una s
imple referencia a el. por ej. link ->
<a href=www.miservidro.com/miarchivo.exe>
bueno, ver html para detalles...
solo debes pedir al cliente que ejecute el archivo envez de abrirlo o que lo
ejecute manualmente luego del download.
Direccin URL. Llamar a una
loExplorer = CreateObject("InternetExplorer.Application")
loExplorer.Navigate("http://www.vicentetrapani.com")
loExplorer.Visible=.T.
Release.loExplorer
Luis Mara Guayn
Tucumn - Argentina

Local lcCOMANDO
lcCOMANDO = "START.EXE <http://www.microsoft.com>"
RUN &lcCOMANDO
Enviar/Recibir mensajes con Outlook Express
Your Init on the form will creat the object for the Session:
public lcCurdir
lcCurdir = sys(5) + curdir()
Thisform.Session1.signon && turns on OE if it is not already open.
Send mail with preset Text and an attachment:
lnSessionID = thisform.session1.SessionID
If lnSessionID > 0
If vartype(thisform.message1) = "O"
with Thisform.message1
.SessionID = lnSessionID
.Compose()
.AttachmentIndex = 0
.AddressResolveUI = .f.
.MsgSubject = "New version of your program"
.MsgNoteText = " Message Text here "
.RecipAddress =
endwith
If thisform.message1.MsgIndex = -1.
If file(your file name here)
Thisform.message1.AttachmentPathName =
Thisform.message1.AttachmentName =
Endif
Endif
Thisform.message1.Send()
Wait window nowait "Message sent..."
Endif && vartype(thisform.message1) = "O"
Thisform.session1.SignOff()
Endif && lnSessionID > 0
Return
READ MAIL:
Thisform.Message1.sessionid = thisform.Session1.sessionid && Session #
Thisform.Message1.fetchunreadonly = .t. && Type of Mail
Thisform.Message1.fetch && Get it
m = 0
ms1 = thisform.Message1.msgcount && How many pieces id we received?
*-- run through all the pieces looking for an attachment. XXXX.new
For ms = 1 to ms1
*Wait wind Thisform.Message1.msgorigaddress
*Wait wind thisform.Message1.attachmentname
lcfile = thisform.Message1.attachmentname
cd \ && lcCurdir for instance
if lower(right(lcfile,3))='new'
wait wind nowait ' Installing a new version of the program '
Copy file (lcfile) to c:\
endif
Endif
m = m + 1
If m <> ms1
*-- change the message underneath
Thisform.Message1.msgindex = m
Endif
Next
Outlook Express. Agregar registros a Libreta de direcciones
oOutlook = CreateObject("Outlook.Application")
oContacto = oOutlook.CreateItem(2)
oContacto.businesstelephonenumber = "999876543"
oContacto.companyname = "Empresa 3"
oContacto.department = "ventas"
oContacto.email1address = "agp@kender.es <mailto:agp@kender.es>"
oContacto.firstname = "Pepito"
oContacto.lastname = "de los palotes"
etc...
oContacto.save()
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Outlook Express. Libreta de direcciones
o = createob('outlook.application')
ospace = o.getnamespace('mapi')
ocarpetacontactos = ospace.getdefaultfolder(10)
contactos = ocarpetacontactos.items
for each persona in contactos
with persona
wait window .FileAs
endwith
endfor
Salu2
Ariel Gimenez
Ms Agents
Idioma
Para Espaol:
Merlin.LanguageID = 3082
Merlin.LanguageId= "&HC0A"
Para Ingles:
Merlin.LanguageID = 1033
Saludes
Sergio Rocha Tenorio
Pantalla
Cantidad de colores
** GetBitsPixel () -> nBitsPorPixel
** Devuelve la cantidad de bits por pixel.
** La cantidad de colores es 2 ** nBitsPixel (ej.: 8 bits = 256 colores, 16 = 65
536, ...)
**--------------------------------------------------------------------------
FUNCTION GetBitsPixel
LOCAL nBitsPixel, hSrcDC, hWnd
DECLARE Integer GetDesktopWindow in User32
DECLARE Integer GetDC in User32 Integer
DECLARE Integer GetDeviceCaps in Gdi32 Integer, Integer
DECLARE Integer ReleaseDC in User32 Integer, Integer
hWnd = GetDesktopWindow ()
hSrcDC = GetDC (hWnd)
nBitsPixel = GetDeviceCaps (hSrcDC, 12)
ReleaseDC (hWnd, hSrcDC)
RETURN nBitsPixel
Capturar la pantalla
Entra en www.universalthread.com <http://www.universalthread.com> y en la seccio
n archivos hay ejemplos de como hacer
esto con funciones de la API.
Salu2
Ariel Gimenez
Colores. Calcular
16.777.215 es (256^3) - 1
VFP usa la funcin RGB(255,255,255)
donde:
nColor = RGB(nRojo, nVerde, nAzul)
y la frmula es:
nAzul * (256^2) + nVerde * 256 + nRojo
Ocultar/Mostrar la barra de tareas de Windows
Aqu va el cdigo
Saludos Alexandre ahedreville@krafteurope.com <mailto:ahedreville@krafteurope.co
m>
*!* Constantes para ocultar o mostrar la barra de tareas de windows
#DEFINE TOGGLE_HIDEWINDOW 128
#DEFINE TOGGLE_UNHIDEWINDOW 64
*!* Oculta la barra de tareas de windows
*!* Sintaxis: HideTaskBar()
*!* Valor devuelto:
*!* Argumentos:
FUNCTION HideTaskBar
LOCAL lnHwnd
*!* Valores
lnHwnd = 0
*!* Instrucciones DECLARE DLL para manipular la barra de tareas
DECLARE INTEGER FindWindowA IN Win32API STRING lpClassName, STRING
lpWindowName
DECLARE INTEGER SetWindowPos IN Win32API INTEGER hwnd, INTEGER
hwndInsertAfter, INTEGER x, INTEGER y, INTEGER cx, INTEGER cy, INTEGER
wFlags
*!* Valores
lnHwnd = FindWindowA('Shell_traywnd', '')
*!* Ocultar la barra de tareas
IF lnHwnd <> 0
SetWindowPos(lnHwnd, 0, 0, 0, 0, 0, TOGGLE_HIDEWINDOW)
ENDIF
ENDFUNC
*!* Muestra la barra de tareas de windows
*!* Sintaxis: ShowTaskBar()
*!* Valor devuelto:
*!* Argumentos:
FUNCTION ShowTaskBar
LOCAL lnHwnd
*!* Valores
lnHwnd = 0
*!* Instrucciones DECLARE DLL para manipular la barra de tareas
DECLARE INTEGER FindWindowA IN Win32API STRING lpClassName, STRING
lpWindowName
DECLARE INTEGER SetWindowPos IN Win32API INTEGER hwnd, INTEGER
hwndInsertAfter, INTEGER x, INTEGER y, INTEGER cx, INTEGER cy, INTEGER
wFlags
*!* Valores
lnHwnd = FindWindowA('Shell_traywnd', '')
*!* Mostrar la barra de tareas
IF lnHwnd <> 0
SetWindowPos(lnHwnd, 0, 0, 0, 0, 0, TOGGLE_UNHIDEWINDOW)
ENDIF
ENDFUNC
Resolucin en pantalla
Esta es la ms rpida que he encontrado.
DECLARE Integer GetSystemMetrics IN Win32API Integer nIndex
?GeTSystemMetrics(1) && Devuelve la resolucin vertical, 600
?GeTSystemMetrics(16) && Devuelve la resolucin horizontal, 800
Josep
Redes
Dominio. Conocer
Fijate si asi te sirve:
oWsh = CreateObject("WScript.Network")
? oWsh.UserDomain
? oWsh.UserName
? oWsh.ComputerName
Ramon Giubi
Hora del servidor
Estas rutinas las envio Luis M. Guayn.
...con esta funcin puedes tomar sincronizar la fecha-hora de un
servidor:
*--------------------------------------------------------------
* FUNCTION NetDateTime(tcSrv, tlSet)
*--------------------------------------------------------------
* Retorna la fecha-hora de la PC remota "tcSrv"
* Si "tlSet" es .T. cambia la hora de la PC
* por la fecha-hora de la PC remota "tcSrv"
* PARAMETROS:
* tcSrv: Nombre de la PC remota
* tlSet: .T. - Si cambia la hora de la PC
* RETORNO:
* DateTime: La fecha-hora de la PC remota
* Numrico: 0 - Si se cambi la fecha-hora correctamente
* -1 - No se pudo cambiar la fecha-hora
* -2 - No se encontr la PC remota
* USO: ? NetDateTime("\\MiServidor", .F.)
* AUTOR: LMG
*--------------------------------------------------------------
FUNCTION NetDateTime(tcSrv, tlSet)
LOCAL lRet, lcStrDW, lnPtr, lcToD, lpTZI, ln, lnZT, ;
lnAno, lnMes, lnDDS, lnDia, lnHor, lnMin, lnSeg
DECLARE INTEGER NetRemoteTOD IN NETAPI32 ;
STRING @lcSvr, ;
INTEGER @lnPtr
DECLARE RtlMoveMemory IN WIN32API ;
STRING @lcToD, ;
INTEGER lnPtr, ;
INTEGER ln
DECLARE SetSystemTime IN WIN32API ;
STRING lcStrDW
DECLARE GetTimeZoneInformation IN KERNEL32 ;
STRING @lpTZI
tcSrv = STRCONV(STRCONV(tcSrv,1),5) + CHR(0)
lnPtr = 0
ln = NetRemoteTOD(@tcSrv, @lnPtr)
IF ln = 0
lcToD = REPLICATE(CHR(0), 48)
ln = RtlMoveMemory(@lcToD, lnPtr, 48)
lnAno = DW2N(SUBSTR(lcToD, 41, 4))
lnMes = DW2N(SUBSTR(lcToD, 37, 4))
lnDDS = DW2N(SUBSTR(lcToD, 45, 4))
lnDia = DW2N(SUBSTR(lcToD, 33, 4))
lnHor = DW2N(SUBSTR(lcToD, 09, 4))
lnMin = DW2N(SUBSTR(lcToD, 13, 4))
lnSeg = DW2N(SUBSTR(lcToD, 17, 4))
IF tlSet
lcStrDW = N2DW(lnAno) + N2DW(lnMes) + ;
N2DW(lnDDS) + N2DW(lnDia) + ;
N2DW(lnHor) + N2DW(lnMin) + ;
N2DW(lnSeg) + N2DW(0)
lRet = IIF(SetSystemTime(lcStrDW), 0, -1)
ELSE
lpTZI = SPACE(255)
ln = GetTimeZoneInformation(@lpTZI)
lnZT = DW2N(SUBSTR(lpTZI, 1, 2))
IF lnZT > 720
lnZT = (2^16) - lnZT
ELSE
lnZT = (-1) * lnZT
ENDIF
lRet = DATETIME(lnAno, lnMes, lnDia, ;
lnHor, lnMin, lnSeg) + lnZT * 60
ENDIF
ELSE
lRet = -2
ENDIF
RETURN lRet
ENDFUNC
* - - - - - - - - - - - - - - - - - - - - - - - -
* FUNCTION DW2N(tcDW)
* Usada por NetDateTime()
* - - - - - - - - - - - - - - - - - - - - - - - -
FUNCTION DW2N(tcDW)
RETURN ASC(SUBSTR(tcDW, 4, 1))*(256^3) + ;
ASC(SUBSTR(tcDW, 3, 1))*(256^2) + ;
ASC(SUBSTR(tcDW, 2, 1))*(256) + ;
ASC(SUBSTR(tcDW, 1, 1))
ENDFUNC
* - - - - - - - - - - - - - - - - - - - - - - - -
* FUNCTION N2DW(tnN)
* Usada por NetDateTime()
* - - - - - - - - - - - - - - - - - - - - - - - -
FUNCTION N2DW(tnN)
RETURN CHR(MOD(tnN, 256)) + CHR(INT(tnN/256))
ENDFUNC
*--------------------------------------------------------------
Pero... (siempre hay un pero), leyendo la Base de Conocimientos de
Microsoft, en el artculo Q249716
<http://support.microsoft.com/support/kb/articles/Q249/7/16.ASP> dice que la
funcin API NetRemoteTOD solo funciona con Windows NT y Windows 2000. En
dicho artculo hay un ejemplo para VFP6.
--
Luis Mara Guayn
Tucumn - Argentina
SQL
Buscar palabra en tabla
lcBusca = "%" + Cadena + "%"
Select * from tabla where campo LIKE lcBusca
--
Atentamente,
---------------------------------------
Pere Pujol i Espua
<mailto:ppujole@airtel.net>
Valores .NULL.
Si tu quieres todos los registros de la tabla Elementos, para que no te salga e
l valor .NULL. en las consultas debes especificar los
campos como:
...,NVL(detalles.precio,0),...
Tablas
Actualizar datos que no existen en otra tabla
Select * From Tabla1 Where Id Not In (Select Id From Tabla2)
Append from desde una vista
APPEND FROM DBF('NombreVista')
Busca un campo en una tabla y retorna .T. si tuvo xito
*--------------------------------------------------------
* FUNCTION FindField(lcCampo, lcAlias)
*--------------------------------------------------------
* Busca un nombre de campo en una tabla y retorna .T. si tuvo exito.
* USO: ? FindField("MiCampo", "MiAlias")
* ? FindField("MiCampo") && Busca en el alias corriente
*--------------------------------------------------------
FUNCTION FindField(lcCampo, lcAlias)
LOCAL ln
IF EMPTY(lcAlias)
lcAlias = ALIAS()
ENDIF
IF USED(lcAlias)
ln = AFIELDS(MiArray, lcAlias)
IF ln > 0
ln = ASCAN(MiArray, UPPER(lcCampo))
ENDIF
ELSE
ln = 0
MESSAGEBOX("El alias no existe.",16)
ENDIF
RETURN ln # 0
ENDFUNC
Campos memo
Dada su problemtica:
1.- Cambiar por C(250)
2.- Substituir por fichero .txt (crear cuando necesario) y utilizar control Rich
Text
Crear tablas con campos variables
cCmd="CREATE TABLE 'tempo.dbf' name tempo (obra c(10) NOT NULL,NOMB_OBR C(40) NO
T NULL,TIPO C(10) NOT NULL"
for i=1 to nCount
cCampo=aCampos[i]
cCmd=cCmd + "," + cCampo + " N (12,2) NOT NULL"
endfor
&cCmd
Crear tablas de referencias cruzadas
ID Artculo:
Fecha de Creacin:
Fecha de Revisin:
E10119
22-nov-1996
19-APR-1997
La informacin en este artculo se refiere a:
-Microsoft FoxPro, versin 3.0 5.0
RESUMEN
Este artculo le infroma sobre la creacin y visualizacin de Tablas/Consultas de Refe
rencias Cruzadas en Visual FoxPro 3.0 / 5.0
para la visualizacin de datos de una tabla en forma de Hoja de Clculo.
MS INFORMACIN
En Visual FoxPro 3.0 / 5.0 se pueden crear Tablas de Referencias Cruzadas (que v
isualizan los datos en formato hoja de clculo) como
las de Excel mediante programacin.
Este tipo de Tablas de Referencias Cruzadas son muy usadas en Microsoft Access.
Por ejemplo, supongamos que tenemos una tabla de empleados en la que almacenamos
la ventas que al mes realiza cada empleado.
Regularmente, querremos obtener una tabla de referencias cruzadas, en la que de
un rpido vistazo podamos ver cunto ha vendido
cada empleado por mes, y cuando ha vendido en el total de los meses.
Para visualizar este tipo de informacin es muy til usar el formato Hoja de Clculo,
donde podremos ver en forma de filas por
columnas esta informacin. Por ejemplo:
EMPLEADO Mes1 Mes2 Total
---------------------------------
E1 11 12 23
E2 5 7 12
En esta consulta, rpidamente se ve cunto ha vendido en el Mes1, en el Mes2 y en el
Total de ambos meses, por ejemplo, el empleado E1.
Hay un Asistente (se ejecuta accediendo al men de Visual FoxPro : Herramientas /
Asistentes / Consulta /Asistente para tablas de
Referencias Cruzadas / en la versin inglesa sera el men: Tools / Wizards / Query /
Cross-Tab Wizard) para crearlas.
Una vez que este asistente nos ha creado la consulta (.QPR) a partir de una tabl
a (.DBF) que contiene los datos, podemos coger
el cdigo SQL generado, llevarlo a un programa y ejecutarlo (en respuesta a un eve
nto de un objeto) cuando necesitemos crear/visualizar
la tabla/consulta de referencias cruzadas.
Por ejemplo:
1. Creamos una Tabla (por ejemplo, nombre: 'REFSCRUZ.DBF') que va a
contener los datos para la Consulta de Referencias Cruzadas, con
la siguiente estructura:
campo 1: Empleadocarcter(2)
campo 2: Mesnumrico(2)
campo 3: Ventasnumrico(5)
La tabla de ejemplo contiene los siguientes datos (registros):
Empleado Mes Ventas
---------------------------
E1 1 5
E1 1 2
E1 2 5
E1 2 3
E1 2 4
E2 1 3
E2 1 2
E2 2 4
E2 2 2
E2 2 1
2. El Cdigo que genera el Asistente de Referencias Cruzadas basado
en la tabla 'REFSCRUZ.DBF' al usar como campo Fila (Empleado),
como campo Columna (Mes) y como Valor (Ventas, operacin: Suma)
es el siguiente:
SELECT REFSCRUZ.Empleado, REFSCRUZ.Mes, SUM(REFSCRUZ.Ventas);
FROM 'REFSCRUZ.DBF' REFSCRUZ;
GROUP BY REFSCRUZ.Empleado, REFSCRUZ.Mes;
ORDER BY REFSCRUZ.Empleado, REFSCRUZ.Mes;
INTO CURSOR SYS(2015)
DO (_GENXTAB) WITH 'Asiscons',.t.,.t.,.t.,,,,.t.,0
BROWSE NOMODIFY
Podemos crear un programa (xxx.PRG) con el cdigo anterior y
ejecutarlo en nuestra aplicacin, con DO xxx.PRG, en respuesta a
un evento de un objeto concreto (por ejemplo en el evento click
de un botn de comando con el ttulo (caption) "Visualizar Tabla
de Referencias Cruzadas"), de tal forma que cuando el usuario
haga click en dicho botn del formulario, se visualice de forma
automtica la tabla de referencias cruzadas.
El resultado de ejecutar la consulta o ese cdigo en un.PRG (programa de VFP 3.0 /
5.0) con la tabla 'REFSCRUZ.DBF' dada como
ejemplo en este artculo:
EMPLEADO N_1 N_2 Total
------------------------------
E1 11 12 23
E2 5 7 12
Pasar datos de un cursor a una tabla
APPEND FROM DBF('Cur_Pedidos')
Comprobar si ya existe un valor
-En el valid del campo realiza lo siguiente
Local LcRecno
LcRecno=Recno()
SEEK THIS.VALUE
if !eof() and LcRecno!=Recno()
Messagebox("La clave ya existe...",16,"Validacin de campo")
return 0
ENDIF
go Lcrecno
Con este procedimiento espero que soluciones el problema
Nota: Tener en cuenta que esta validacin es optima y sin ningun error cuando la t
abla tiene como mnimo 1 registro ya digitado,
te recomiendo modificar el procedimiento para detectar cuando la tabla esta vaci
a.
Insertar registro en una posicin
GO RECO 5
INSERT BLANK BEFORE
pero a menos que esto lo estes haciendo sobre un cursor temporal de L/E, me uno
al consejo general de no intentar este tipo de manejos sobre tablas medianas o g
randes, ya que es muy lento y adems necesitas abrir la tabla en forma exclusiva.
Renombrar campo de una tabla
ALTER TABLE MiTabla CREATE COLUMN nuevocampo c (10)
SELECT MiTabla
REPLACE ALL nuevocampo WITH viejocampo
ALTER TABLE MiTabla DROP COLUMN viejocampo
Reparacin de encabezado (Tabla)
En UniversalThread (www.universalthread.com <http://www.universalthread.com>) en
la seccion de archivos, tienes una utilidad
(CMRepair) que te lo hace.
Tablas que pertenecen a una DBC
Puedes cargar los nombres de las tablas en un vector:
OPEN DATABASE P:\MiDataBase
ln = ADBOBJECT(MiVector, "TABLE")
FOR EACH lc IN MIVector
? lc
ENDFOR
--
Luis Mara Guayn
Tucumn - Argentina
Ttulo del campo
cTitulo=DBGETPROP("Tabla.Columna","FIELD","Caption")
--
Victor Espina
<http://www.mitrompo.com/vespina>
Transaccin
************************************************************
*
* Funcin: IO_TRANSACCION
*
* Realiza una transaccin con las tablas pasadas entre comas
*
* Parametros:
*
* tctablas - tablas que participan en la transaccion (entre comas)
* tlforzar - forzar la grabacion aunque hubiera cambios de otro usuario
* tlanularsifalla - descartar los cambios en el buffer si falla la transac
cion
*
* Ejemplos:
*
* llret = GoCsApp.io_transaccion("lv_ventas, clientes, articulos")
* llret = GoCsApp.io_transaccion("lv_ventas, clientes, articulos",.T.,.T.)
es igual que la anterior
* llret = GoCsApp.io_transaccion("lv_ventas, clientes, articulos",.F.,.F.)
esto lo haria Jim Booth
*
* Retorno
*
* .T. / .F. Indicando si se pudo o no realizar la transaccin
*
* Nota
*
* La tablas deben estar abiertas
*
* Usa la funcion st_partes <../faq/formularios/00049.htm>
*
* Importante resear que se efectuaran en el orden en que se hayan
* pasado en la lista
*
* En caso de no poder realizar la transaccion anula todos los TABLEUPDATES
* y retorna las tablas/vistas a su situacion original, si tlanularsifalla es .
T.
* o no se pone este parametro
*
* Creacin : 17/04/2000 PRR
* Ultima Modificacion: 30/04/2000 PRR
*
************************************************************
FUNCTION IO_TRANSACCION
PARAMETERS tctablas, tlforzar, tlanularsifalla
LOCAL lnnumtablas, llRollBack, llret, lni
PRIVATE patabla
DIMENSION patabla[1]
patabla[1] = ""
*valores por defecto
LOCAL llforzar
llforzar = .T.
LOCAL llanularsifalla
llanularsifalla = .T.
llret = .T.
llRollBack = .F.
IF PCOUNT()<>0 AND AT(",",tctablas)<>0
ST_PARTES(tctablas,"patabla")
ENDIF
lnnumtablas = ALEN(patabla)
IF PCOUNT()=0 OR lnnumtablas = 0
MESSAGEBOX("Error de parametros, debe haber al menos una tabla",48,"ATEN
CION")
llret = .F.
ELSE
IF PCOUNT()>2
llforzar = tlforzar
ENDIF
IF PCOUNT()=3
llanularsifalla = tlanularsifalla
ENDIF
BEGIN TRANSACTION
FOR lni = 1 TO lnnumtablas
IF NOT llRollBack AND NOT TABLEUPDATE(1,llforzar,patabla
[lni])
llRollBack = .T.
EXIT
ENDIF
ENDFOR
IF llRollBack
ROLLBACK
IF llanularsifalla
FOR lni = 1 TO lnnumtablas
=TABLEREVERT(.T.,patabla[lni])
ENDFOR
ENDIF
lnret = .F. && error en la grabacion/actuali
zacion
ELSE
END TRANSACTION
ENDIF
ENDIF
RELEASE patabla
RETURN llret
Varios
Acceso directo en el escritorio
Puedes usar Windows Script Host:
oWsh = CreateObject("WScript.Shell")
cDesktopDir = oWsh.SpecialFolders("Desktop")
oLnk = oWsh.CreateShortcut(cDesktopDir + "\\Shortcut <file://\\Shortcut> to Note
pad.lnk")
oLnk.TargetPath = cDesktopDir + "\\notepad.lnk <file://\\notepad.lnk>"
oLnk.Save()
--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------

Aqui tienes una solucion enviada por Fernando Suarez al grupo:
*********************************************
function CreaAccesoDirecto(cShortCutName,cTargetPath)
*********************************************
*
LOCAL cOldDir, oWshShell, oShortCut, lNormalShortCut, cExt
*
cOldDir = SET("Directory")
*
* DCC - Get extension. Determine if this is a URL shortcut or a normal
(lnk) shortcut.
cExt = UPPER( pciAllTrim( JUSTEXT( cShortCutName ) ) )
lNormalShortCut = ( cExt == "LNK" )
*
* DCC - Create your windows scripting host (WSH) shell to enable a move to
the desk top directory
oWshShell = CreateObject( "WScript.Shell" )
SET DIRECTORY TO (oWshShell.SpecialFolders("Desktop"))
*
* DCC - Use your WSH object to create your shortcut.
oShortCut = oWshShell.CreateShortcut( cShortCutName )
* DCC - Set your properties and save the shortcut
oShortCut.TargetPath = cTargetPath
*
*!* * DCC - The following properties are only available for normal short
cuts.
*!* IF llNormalShortCut
*
*!* * DCC - Below are other properties and examples of setting them.
*!* loShortCut.IconLocation = "notepad.exe, 0"
*!* loShortCut.Description = "Currently running script."
*!* loShortCut.Hotkey = "ALT+CTRL+F"
*!* loShortCut.WindowStyle = 7 && minimized
*!* loShortCut.WorkingDirectory = "c:\"
*!*
*!* * DCC - Display full path of the executable
*!* ?loShortCut.Fullname
*!*
*!* ENDIF
*
*!* * DCC - Must save the short cut. The short cut saves in the current
directory, which is why we moved to the directory
*!* * DCC - prior to creating the shortcut.
*
oShortCut.Save
*
* DCC - Now move back to your starting directory
SET DIRECTORY TO (cOldDir)
*
--
Saludos,
Pablo Roca (Xproca@clavo.net <mailto:Xproca@clavo.net>) (quitar la X)
La Corua - Espaa
ICQ 5035887
Sysop del Portal Gratuito de VisualFoxPro en Espaol
<http://clik.to/visualfox>
Actualizar el cursor de un grid
Tuve un problema similar y lo solucione de la forma mas salvaje, sin mayor inves
tigacion pero me funciono y ahora trabajo solo asi
con los grid.
Convierte el grid en un objeto, cuyo recorsource sea el cursos que actualizas y
cada vez que modificas el cursors saca y vuelve a poner
el objeto del grid. Por ejemplo, yo un cursor que a cada rato lo modifico
select distinct queja, id_queja from principal into cursor Lista order
by principal.orden , principal.numqueja
por lo que debo refrescar sacando y volviendo a colocar el objeto que me represe
nta el grid en la forma
* Actualizo el objeto en la pantalla
thisform.RemoveObject('c_listaactual1')
thisform.AddObject('C_LISTAACTUAL1','C_LISTAACTUAL') && Add a Line control to th
e form
thisform.C_LISTAACTUAL1.Visible = .T. && Make Line control visible
thisform.C_LISTAACTUAL1.Top = 27 && Specify Line control row
thisform.C_LISTAACTUAL1.Left = 698 && Specify Line control column
Esto me soluciono el problema que el grid se quede en blanco cada vez que modifi
co el cursor,
rzarza@un.guate.net <mailto:rzarza@un.guate.net>
Apagar el PC
Declare Integer ExitWindowsEx in "user32.dll" Integer uFlags, Integer
dwReserved
Algunoa de los valores para uFlags pueden ser:
0 = Reinicia windows.
1 = Apaga el sistema.
2 = Reinicia el sistema.
Y el valor para dwReserved siempre debe ser 0.
Ej: ExitWindowsEx(1,0)
Api. Datos TYPE
La declaracin quedara asi:
DECLARE LONG CreateDirectory IN kernel32.DLL STRING lpPathName, STRING @lpSecur
ityAttributes
La estructura de SECURITY_ATTRIBUTES, la tienes que pasar a string, y guardar la
informacion que contiene como se guardara
en memoria. En el caso que has mandado, si mandamos la vaca para que coga los val
ores por defecto
de seguridad sera lo siguiente :
lpSecurityAttributres = CHR(12) + REPLICATE(CHR(0), 3) + ;
REPLICATE(CHR(0), 4) + ;
REPLICATE(CHR(0), 4)
--
rcano@borsan.es <mailto:rcano@borsan.es>
Rafael Cano Palomino
Dpto. Desarrollo
Informtica Borsan, S.L.
c/Antonio Lpez, 249 - 3 J
Madrid (Espaa)
Arrancar el Internet Explorer e ir a una pgina Web
poExplorer = CreateObject("InternetExplorer.Application")
poExplorer.Navigate("http://www.altavista.com")
poExplorer.Visible=.T.
Release.poExplorer
C.C.C. Dgito de control
Hace unos das, y perdn por el retraso, un compaero me pidi que le enviara como hacer
el clculo de los dgitos
de control de la Cuenta Corriente Bancria (para los bancos espaoles -> BBBB-EEEE-C
C-XXXXXXXXXX [BBBB:Cdigo
del Banco; EEEE: Cdigo de la Entidad; CC: Dgitos de control; XXXXXXXXXX: Cuenta pa
rticular]):
Pues ah va:
*****************************************************
Enviamos la Cuenta a validar como parmetro
*****************************************************
lparameters Cuenta
DECLARE pesos(10)
LOCAL i,j,k,suma,suma1
pesos(1)=6
pesos(2)=3
pesos(3)=7
pesos(4)=9
pesos(5)=10
pesos(6)=5
pesos(7)=8
pesos(8)=4
pesos(9)=2
pesos(10)=1
IF !empty(Cuenta)
IF len(alltrim(Cuenta))<23
k=0
FOR i=1 to 4
k=k+val(substr(Cuenta,i,1))
ENDFOR
IF k<>0
=MESSAGEBOX("Cuenta erronea. Faltan dgitos",64," Atencin !")
return .f.
ENDIF
ELSE
j=9
k=1
suma=0
suma1=0
FOR i=1 to 9
IF isdigit(substr(Cuenta,i,1))
suma=suma+(val(substr(Cuenta,j,1))*pesos(k))
ELSE
k=k-1
ENDIF
j=j-1
k=k+1
ENDFOR
j=23
k=1
FOR i=1 to 10
suma1=suma1+(val(substr(Cuenta,j,1))*pesos(k))
j=j-1
k=k+1
ENDFOR
j=MOD(suma,11)
k=MOD(suma1,11)
j=iif(j=0,11,j)
j=iif(j=1,10,j)
k=iif(k=0,11,k)
k=iif(k=1,10,k)
IF val(substr(Cuenta,11,1))=(11-j)
IF val(substr(Cuenta,12,1))<>(11-k)
=MESSAGEBOX("Cuenta erronea. No corresponde el segundo dgito de control",64," Aten
cin !")
return .f.
ENDIF
ELSE
=MESSAGEBOX("Cuenta erronea. No corresponde el primer dgito de control",64," Atenc
in !"!"))
return .f.
ENDIF
ENDIF
RETURN .t.
ELSE
RETURN .f.
ENDIF
Copiar al portapapeles
cValorMemo=tutabla.campo
_cliptext = cValormemo
Copiar, cortar y pegar
No se si te sirva, pero pods usar _cliptext para copy/cut/paste, por ejemplo si t
enes dos textboxes (string), t1 y t2 por ejemplo podes hacer:
_cliptext=t1.value && Copy de todo
t1.value='' && Cut luego del copy
_cliptext=t1.seltext && Copy del texto seleccionado
t1.value=stuff(t1.value, t1.selstart, t1.sellength, '') && Cut luego del copy
t2.value=_cliptext && Paste
Deberias verificar algunas condiciones, como por ejemplo sellength>0, etc.
Hugo
Conectar a Internet
loExplorer = CreateObject("InternetExplorer.Application")
loExplorer.Navigate("<http://www.midireccion.com>")
loExplorer.Visible=.T.
Drivers. Listar
Para listar drives:
oFSO = CREATEOBJECT("Scripting.FileSystemObject")
FOR EACH oDrive IN oFSO.Drives
? oDrive.DriveLetter
ENDFOR
--
Alex Feldstein - MCP
Ejecutar un sonido
Yo pongo los ficheros de sonido en una carpeta, con formato WAV y en el cdigo de
un objeto pongo lo siguiente:
SET BELL TO "NO.WAV"
?? CHR(7)
SET BELL TO

*------------------------------------------------
*FUNCTION PlayWav(lcWaveFile,lnPlayType)
*------------------------------------------------
* Ejecuta un archivo .WAV
* USO: _PlayWave(<Arch_WAV> [,<Tipo_Ejecucion>])
* Arch_WAV = Ruta completa del archivo .WAV
* Tipo_Ejecucion = 1 - Ejecucin en background (default)
* 0 - La aplicacin espera la ejecucin
* 2 - Si el archivo no existe, no ejecuta el default
* 4 - Apaga el sonido que se est ejecutando
* 8 - Continuado
* RETORNA: .T. Si el sonido fue ejecutado
*------------------------------------------------
lnPlayType = IIF(TYPE("lnPlayType")="N",lnPlayType,1)
DECLARE INTEGER PlaySound ;
IN WINMM.dll ;
STRING cWave, ;
INTEGER nModule, ;
INTEGER nType
RETURN IIF(PlaySound(lcWaveFile,0,lnPlayType) = 1, .T., .F.)
ENDFUNC
*------------------------------------------------
Encriptacin de cadenas
FUNCTION FnEncripta(Texto)
* ------------------------------------------------
* Encripta un texto
* USO: FnEncripta("Texto a encriptar")
* RETORNA: Texto encriptado
* ------------------------------------------------
LOCAL Clave, TextoEnc, j, letra
clave = ')&H%$V1#@^+=?/><;:MN*-'
TextoEnc = SPACE(0)
C=1
FOR j = 1 TO LEN(texto)
letra = MOD(ASC(SUBSTR(texto,j,1)) + ASC(SUBSTR(clave,C,1)),256)
TextoEnc = TextoEnc + CHR(letra)
C=C+1
IF C>=LEN(clave)
C=1
ENDIF
NEXT
RETURN TextoEnc
FUNCTION FnDesencripta(TextoEnc)
* ------------------------------------------------
* Desencripta un texto
* USO: FnDesencripta("Texto encriptado")
* RETORNA: Texto desencriptado
* ------------------------------------------------
local Texto, c, j, clave
clave = ')&H%$V1#@^+=?/><;:MN*-'
Texto = SPACE(0)
C=1
FOR j = 1 TO LEN(TextoEnc)
letra = MOD((256+ASC(SUBSTR(TextoEnc,j,1))) - ASC(SUBSTR(clave,C,1)), 256)
C=C+1
IF C>=LEN(clave)
C=1
ENDIF
Texto = Texto + CHR(letra)
NEXT
RETURN Texto
Enviar un email por Outlook
strProfile = "nombredeusuarioperfil"
strPassword = "passwordperfil"
strRecipient = "aquien@dominio.com"
strSubject = "Asunto"
strBody = "Este es el mensaje..."
theApp = CreateObject("Outlook.Application")
theNameSpace = theApp.GetNameSpace("MAPI")
theNameSpace.Logon(strProfile , strPassword)
theMailItem = theApp.CreateItem(0)
theMailItem.Recipients.Add( strRecipient )
theMailItem.Subject = strSubject
theMailItem.Body = strBody
theMailItem.Send
theNameSpace.Logoff
Fax. Envio desde VFP
Winfax funciona muy bien. (<http://www.delrina.com/)>
Lo puedes manejar facilmente a travs de COM:
oWinFax = CreateObject("WinFax.SDKSend")
oWinFax.SetSubject("Test Fax")
oWinFax.SetNumber("1234567")
oWinFax.SetAreaCode("555")
oWinFax.SetCompany("Alguna Compaa")
oWinFax.AddRecipient() && requerido
oWinFax.SetPrintFromApp(1)
oWinFax.AddAttachmentFile("") && aqui va archivo si quieres
oWinFax.Send(1)
SET PRINTER TO NAME winfax
REPORT FORM MyReport TO PRINT NOCONSOLE
SET PRINTER TO
RELEASE oWinFax
HTH
--
Alex Feldstein - MCP Visual FoxPro
Formatear un diskette
SHFD_CAPACITY_DEFAULT = 0 &&' capacidad del drive por default
SHFD_CAPACITY_360 = 3 &&' 360KB, para 5.25" :-)
SHFD_CAPACITY_720 = 5 &&' 720KB, para 3.5" : -(
SHFD_FORMAT_QUICK = 0 &&' formato rpido
SHFD_FORMAT_FULL = 1 &&' formato completo
SHFD_FORMAT_SYSONLY = 2 &&' copia solamente los archivos del sistema (Solo Win95
)
DECLARE INTEGER SHFormatDrive IN "SHELL32.DLL" INTEGER, INTEGER, INTEGER, INTEGE
R
hWnd = GetHwndForm(THISFORM)
iDrive = 0
IF hWnd <> 0 THEN
Resultado = SHFormatDrive(hWnd, iDrive,SHFD_CAPACITY_DEFAULT, SHFD_FORMAT_QUICK)
ENDIF
*==========================================================
* Esta funcin recibe una referencia hacia el formulario y devuelve el HWND
* (window handle) de esta ventana o formulario.
*==========================================================
Function GetHwndForm
LParameter toForm
Local lcCaption
lcCaption = toForm.Caption
toForm.Caption = Sys(3)
If not "FOXTOOLS" $ Upper( Set("Library") )
Set Library to (Home()+"\FoxTools.Fll") Additive
Endif
Local lnHWND
lnHWND = _WhToHwnd( _WFindTitl(toForm.Caption) )
toForm.Caption = m.lcCaption
Return m.lnHWND
Formatear un diskette (1)
Mira este truco que apareci en FoxPress de Noviembre de 2000
<http://www.fpress.com/revista/Num0011/dtruco.htm>
run/n rundll32.exe shell32.dll,SHFormatDrive
--
Luis Mara Guayn
Tucumn - Argentina
Funcin de consecutivos
FUNCTION NUEV(tcAlias)
public lnID
LOCAL lcAlias, ;
lcOldReprocess, ;
lnOldArea
lnOldArea = SELECT()
IF PARAMETERS() < 1
lcAlias = UPPER(ALIAS())
ELSE
lcAlias = UPPER(tcAlias)
ENDIF
lcOldReprocess = SET('REPROCESS')
*-- Lock until user presses Esc
SET REPROCESS TO AUTOMATIC
IF !USED("cont")
USE nominas!cont IN 0
ENDIF
SELECT cont
IF SEEK(lcAlias, "cont", "table")
IF RLOCK()
lnID = cont.nextid
REPLACE cont.nextid WITH cont.nextid + 1
UNLOCK
ENDIF
ENDIF
SELECT (lnOldArea)
SET REPROCESS TO lcOldReprocess
idinf=lnID
RETURN lnID
ENDFUNC
Funcin para quitar acentos
lc = "Luis Mara Guayn, Tucumn"
? CHRTRAN(lc, "", "aeiouAEIOU")
Funciones matemticas
Aunque ya VFP trae la funcin STD() para registros de una tabla, se pueden aprovec
har las funciones de Excel
(que son muchas) desde VFP. (Obvio que debes tener instalado Excel en la PC).
Para el caso de la Desviacin Estndar:
loExcel = CREATEOBJECT("Excel.Application")
ln = loExcel.WorksheetFunction.STDev(23,26,33,32,22,30)
MESSAGEBOX(TRANSFORM(ln),0, "Desviacin Estndar")
RELEASE loExcel
Es una opcin mas, que en este caso no sea lo ptimo, pero en otras funciones de Exc
el s.
--
Luis Mara Guayn
Tucumn - Argentina
Marcador telefnico
Puedes hacerlo con mscomm (El ocx) lo insertas en un formulario, donde tengas ta
mbien una caja de texto para ingresar el numero,
despues en el procedimiento donde quieras que se realice el marcado incluyes:
MSCOMM.SETTINGS="9800,N,8,1"
MSCOMM.COMMPORT=1 (Supongo el modem conectado al com1)
MSCOMM.PORTOPEN=.T.
MSCOMM.OUTPUT = "ATDT "+Numero+chr(13)
Y listo, el modem marcar el numero indicado
Saludos, espero que te sirva
Emilio Fernandez
Nmero de serie del disco
loFSO = CREATEOBJECT("Scripting.FileSystemObject")
lcSerialNumber = lofso.drives("c:").serialnumber
o tambin:
*-----------------------------------------------
FUNCTION GetVol(lpRoot)
*-----------------------------------------------
* Nuestra informacin del volumen
* USO: GetVol("C:\")
* PARAMETRO: lpRoot = LetraDrive + ":\"
*-----------------------------------------------
LOCAL lnRet, lcString, lpVolName, ;
nVolSize, lpVolNumber, ;
lpMaxComp, lpFlags, ;
lpFSName, nFSSize
IF EMPTY(lpRoot)
lpRoot = "c:\"
ENDIF
lpVolName = SPACE(256)
nVolSize = 256
lpVolNumber = 0
lpMaxComp = 256
lpFlags = 0
lpFSName = SPACE(256)
nFSSize = 256
DECLARE INTEGER GetVolumeInformation ;
IN Win32API AS GetVolInfo ;
STRING @lpRoot, ;
STRING @lpVolName, ;
INTEGER nVolSize, ;
INTEGER @lpVolNumber, ;
INTEGER @lpMaxComp, ;
INTEGER @lpFlags, ;
STRING @lpFSName, ;
INTEGER nFSSize
lnRet=GetVolInfo(@lpRoot, @lpVolName, ;
nVolSize, @lpVolNumber, ;
@lpMaxComp, @lpFlags, ;
@lpFSName, nFSSize)
IF lnRet > 0
lcString = "Drive name: " + ;
ALLT(lpRoot)+CHR(13)+ ;
"Vol name: " + ;
LEFT(ALLT(lpVolName),LEN(ALLT(lpVolName))-1)+CHR(13)+ ;
"Max #/chars in vol name: " + ;
ALLT(STR(nVolSize))+CHR(13)+ ;
"Vol Serial #: " + ;
ALLT(STR(lpVolNumber))+CHR(13)+ ;
"Max #/chars in dir/file names: " + ;
ALLT(STR(lpMaxComp))+CHR(13)+ ;
"File Sys Flags: " + ;
ALLT(STR(lpFlags))+CHR(13)+ ;
"File Sys type: " + ;
LEFT(ALLT(lpFSName),LEN(ALLT(lpFSName))-1)+CHR(13)+ ;
"File Sys Name Size: " + ;
ALLT(STR(nFSSize))
ELSE
lcString = "No se pudo ver informacin"
ENDIF
=MESSAGEBOX(lcString, "Informacin del volumen")
RETURN ""
ENDFUNC
Leonardo Velazquez
Nmeros a letras
Hola Visualfoxproeros.
Ah les mando una rutina sencilla para pasar nmeros a letras :
NOTA : ABRAN LA VENTANA AL MXIMO, HAY LNEAS QUE TERMINAN EN PUNTO Y COMA
****************************************************************************
*
PROCEDURE NTOL
****************************************************************************
*
PARAMETERS MI_NUMERO
PUBLIC C_ENTERO, C_DECIMAL
C_ENTERO=RIGHT(("00"+ALLTRIM(STR(INT(MI_NUMERO)))),INT(((LEN(ALLTRIM(STR(INT
(MI_NUMERO))))+2)/3))*3)
C_DECIMAL=RIGHT("00"+ALLTRIM(STR((MI_NUMERO-INT(MI_NUMERO))*100)),3)
PUBLIC DIMENSION CENTENA(1,10), DECENA(1,10), UNIDAD(1,15)
UNIDAD(1)=" UN"
UNIDAD(2)=" DOS"
UNIDAD(3)=" TRES"
UNIDAD(4)=" CUATRO"
UNIDAD(5)=" CINCO"
UNIDAD(6)=" SEIS"
UNIDAD(7)=" SIETE"
UNIDAD(8)=" OCHO"
UNIDAD(9)=" NUEVE"
UNIDAD(11)=" ONCE"
UNIDAD(12)=" DOCE"
UNIDAD(13)=" TRECE"
UNIDAD(14)=" CATORCE"
UNIDAD(15)=" QUINCE"
DECENA(1)=" DIEZ"
DECENA(2)=" VEINTE"
DECENA(3)=" TREINTA"
DECENA(4)=" CUARENTA"
DECENA(5)=" CINCUENTA"
DECENA(6)=" SESENTA"
DECENA(7)=" SETENTA"
DECENA(8)=" OCHENTA"
DECENA(9)=" NOVENTA"
CENTENA(1)=" CIENTO"
CENTENA(2)=" DOSCIENTOS"
CENTENA(3)=" TRESCIENTOS"
CENTENA(4)=" CUATROCIENTOS"
CENTENA(5)=" QUINIENTOS"
CENTENA(6)=" SEISCIENTOS"
CENTENA(7)=" SETECIENTOS"
CENTENA(8)=" OCHOCHIENTOS"
CENTENA(9)=" NOVECIENTOS"
STORE "" TO UNIDAD(10),DECENA(10),CENTENA(10)
RC=IIF(VAL(C_ENTERO)=0,"CERO","")
FOR i2=1 TO IIF(VAL(C_DECIMAL)>0,2,1)
VALOR_N=IIF(i2=1,C_ENTERO,C_DECIMAL)
FOR i1=1 TO LEN(VALOR_N) STEP 3
FN=SUBSTR(VALOR_N,i1,3)
RC=RC+IIF(VAL(FN)=100," CIEN",;
CENTENA(IIF(VAL(LEFT(FN,1))=0,10,VAL(LEFT(FN,1)))))+;
IIF(VAL(RIGHT(FN,2))>10 .AND. VAL(RIGHT(FN,2))<16,;
UNIDAD(VAL(RIGHT(FN,2))),DECENA(IIF(VAL(SUBSTR(FN,2,1))=0,10,VAL(SUBSTR(FN,2
,1))))+;
IIF(VAL(SUBSTR(FN,2,1))<>0 .AND. VAL(SUBSTR(FN,3,1))<>0," Y","")+;
UNIDAD(IIF(VAL(SUBSTR(FN,3,1))=0,10,VAL(SUBSTR(FN,3,1)))))+;
IIF((LEN(VALOR_N)=6 .AND. i1=1) .OR. (LEN(VALOR_N)=9 .AND. i1=4 .AND.
VAL(FN)<>0) .OR.;
(LEN(VALOR_N)=12 .AND. i1=1).OR.;
(LEN(VALOR_N)=12 .AND. i1=7 .AND. VAL(SUBSTR(VALOR_N,7,3))<>0),"
MIL","")+;
IIF((LEN(VALOR_N)=9 .AND. i1=1).OR. (LEN(VALOR_N)=12 .AND. i1=4),;
IIF(VAL(LEFT(VALOR_N,3))=1,IIF(LEN(VALOR_N)=12," MILLONES"," MILLN"),"
MILLONES"),"")
ENDFOR
RC=RC+IIF(i2=1," PESOS"+IIF(VAL(C_DECIMAL)>0," CON"," M/L")," CENTAVOS
M/L")
ENDFOR
RETURN RC
Nmeros a letras (1)
DEVOLVER UN NUMERO EN LETRAS
Dada la cantidad de consultas que he recibido por el tema de referencia,
mando la
rutina que lo resulve, aplicable a CLIPPER, FoxPro y VisualFoxPro para que
la
publiques en la WEB.
PRIMERO CARGAS EL NUMERO EN UNA VARIABLE (Ej. NUMEROV) Y APLICAS
EN EL .PRG LA SIGUIENTE RUTINA.
ENTEROV=INT(NUMEROV)
N = ""
N1 = "UNO"
N2 = "DOS"
N3 = "TRES"
N4 = "CUATRO"
N5 = "CINCO"
N6 = "SEIS"
N7 = "SIETE"
N8 = "OCHO"
N9 = "NUEVE"
N10 = "DIEZ"
N11 = "ONCE"
N12 = "DOCE"
N13 = "TRECE"
N14 = "CATORCE"
N15 = "QUINCE"
N16 = "DIECISEIS"
N17 = "DIECISIETE"
N18 = "DIECIOCHO"
N19 = "DIECINUEVE"
N20 = "VEINTE"
N30 = "TREINTA"
N40 = "CUARENTA"
N50 = "CINCUENTA"
N60 = "SESENTA"
N70 = "SETENTA"
N80 = "OCHENTA"
N90 = "NOVENTA"
IF ENTEROV <> 100
N100 = "CIENTO"
ENDIF
IF ENTEROV = 100
N100="CIEN"
ENDIF
N200 = "DOSCIENTOS"
N300 = "TRESCIENTOS"
N400 = "CUATROCIENTOS"
N500 = "QUINIENTOS"
N600 = "SEISCIENTOS"
N700 = "SETECIENTOS"
N800 = "OCHOCIENTOS"
N900 = "NOVECIENTOS"
CONTADOR = 1
INICIO = 1
CADENA = STR(ENTEROV,9)
NUMP = " "
DO WHILE CONTADOR < 4
SUBCADENA = SUBSTR(CADENA,INICIO,3)
CENTENA = SUBSTR(SUBCADENA,1,1)+"00"
DECENA = SUBSTR(SUBCADENA,2,2)
UNIDAD = SUBSTR(SUBCADENA,3,1)
IF VAL(SUBCADENA) > 99
NUMP = NUMP + N&CENTENA + " "
ENDIF (SUBCADENA > 99)
T = VAL(DECENA)
IF T > 0
DO CASE
CASE (INT(T/10.0) = T/10.0) .OR. (T > 9 .AND. T <20)
NUMP = NUMP + N&DECENA
CASE T > 9 .AND. (INT(T/10.0) # T/10.0)
DECENA = SUBSTR(DECENA,1,1) + "0"
IF DECENA # "20"
NUMP = NUMP + N&DECENA + " Y " + N&UNIDAD
ELSE
NUMP = NUMP + "VENTI" +N&UNIDAD
ENDIF
CASE T < 10
NUMP = NUMP + N&UNIDAD
ENDCASE
ENDIF (T > 0)
IF ENTEROV > 999999 .AND. CONTADOR = 1
NUMP = NUMP + " MILLONES "
ENDIF
IF NUMP = " UNO MILLONES "
NUMP = " UN MILLON "
ENDIF
IF ENTEROV > 999 .AND. CONTADOR = 2 .AND. VAL(SUBCADENA) > 0
NUMP = NUMP + " MIL "
ENDIF
IF NUMP = " UNO MIL "
NUMP = " UN MIL "
ENDIF
INICIO = CONTADOR * 3 + 1
CONTADOR = CONTADOR + 1
ENDDO
CENTAV = (THISFORM.VABO.VALUE - INT(THISFORM.VABO.VALUE))
CENTAV = ROUND((CENTAV*100),0)
CENTAV = INT(CENTAV)
CENTAV = STR(CENTAV,2)
CENTAV = STRTRAN(CENTAV," ","0")
NUMP = "Pesos" + NUMP + " con " + CENTAV + "/100"
EN LA VARIABLE NUMP TE QUEDA EN LETRAS CON LOS CENTAVOS, DE
ACUERDO AL TIPO DE MONEDA QUE UTILICES REEMPLAZAR "Pesos" POR ****
"Dlares", "Francos", etc. Y NADA MAS.... ASI DE SENCILLO
Juan Carlos Doorman Gonzlez
doorman@abaconet.com.ar <mailto:doorman@abaconet.com.ar>
Novato <jfmarbau@teleline.es <mailto:jfmarbau@teleline.es>> escribi en el mensaje
de noticias
8j9q5h$mkd$1@talia.mad.ttd.net <mailto:8j9q5h$mkd$1@talia.mad.ttd.net>...
Pasar un nmero de color a formato RGB
*----------------------------------------------------------
* FUNCTION Col2RGB(tnColor)
*----------------------------------------------------------
* Pasa un nmero de color a formato RGB
* USO: Col2RGB(<Nro_Color>)
* RETORNA: Caracter RGB(nR, nG, nB)
* AUTOR: LMG
*----------------------------------------------------------
FUNCTION Col2RGB(tnColor)
LOCAL lcRGB, ln
lcRGB="RGB("
FOR ln=1 TO 3
lcRGB=lcRGB+TRAN(tnColor%256,"999")+IIF(ln=3, "", ",")
tnColor=INT(tnColor/256)
ENDFOR
lcRGB=lcRGB+")"
RETURN lcRGB
ENDFUNC
*----------------------------------------------------------
--
Luis Mara Guayn
Tucumn - Argentina
PROCEDURE Color2RGB(nColor)
*
local nRed,nGreen,nBlue
nBlue=int(nColor / 65536)
nColor=nColor - (nBlue * 65536)
nGreen=int(nColor / 256)
nColor=nColor - (nGreen * 256)
nRed=nColor
return allt(str(nRed))+","+allt(str(nGreen))+","+allt(str(nBlue))
*
ENDPROC
HTH
Victor
Prototipos al vuelo
Ej:
#define CRLF chr(13)+chr(10)
cCode="IF month(date())=2" + CRLF + ;
" messagebox('Febrero') + CRLF + ;
"ENDIF" + CRLF
strtofile(cCode,"TEST.PRG")
compile test
do test
Esto se puede hacer en tiempo de ejecucin si tienes VFP6 + SP3 o superior. En la
aplicacin que estoy desarrollando no solo se
generan PRG's dinmicamente, sino incluso formas y clases!.
Por eso es que digo que VB no es ni remotamente lo ms indicado para hacer ese tip
o de aplicacin para prototipos.
--
Victor Espina
<http://www.mitrompo.com/vespina>
Tamao del disco
La funcin SYS(2020) te devuelve el tamao total, en bytes, del disco predeterminado
.
Validacin CIF
Con respecto al significado de la primera letra, nosotros no lo tenemos muy clar
o pero sabemos que:
A- Sociedades Anonimas
B- Sociedades limitadas
E- Comunidades de Bienes
F- Sociedades Cooperativas
G- Asociaciones, Clubes deportivos.
H- Comunidades de Vecinos
P- Entidades Locales (Ej. Ayuntamientos, Juntas Vecinales)
Q-Asociaciones Religiosas
S- Organismos oficiales (Ej. Ministerios)
Y nosotros no sabemos mas.
Si no entendeis algo de la funcion no dudeis en preguntar
cDigitoContrtol= SUBSTR("JABCDEFGHI", ObtenerDCCif(PADL(cNumero, 7, "0")) +
1, 1)
FUNCTION ObtenerDCCif()
PARAMETERS cCIF
LOCAl nConta, nConta2, nTotal, cValor
*Iniciamos las variables.
nTotal = 0
*Recorremos el nmero del CIF.
FOR nConta = 1 TO 7
*Comprobamos si estamos en una posicin par ...
IF MOD(nConta, 2) = 0
*... para sumarle el nmero.
nTotal = nTotal + VAL(SUBSTR(cCIF, nConta, 1))
*... o impar para sumarle la suma de los dgitos del nmero que ha sido
multiplicado por 2.
ELSE
cValor = ALLTRIM(STR(VAL(SUBSTR(cCIF, nConta, 1)) * 2))
FOR nConta2 = 1 TO LEN(cValor)
nTotal = nTotal + VAL(SUBSTR(cValor, nConta2, 1))
ENDFOR
ENDIF
ENDFOR
*Devolvemos el nmero de control.
RETURN ROUND(VAL(RIGHT(STR(10 - VAL(RIGHT(STR(nTotal), 1))), 1)), 0)
ENDFUNC
Saludos
Oscar Fernndez
GESPRO S.A.
Madrid-Espaa
Uso de la coma como separador decimal
Sin ningun problema interceptas la tecla punto en el keypress y la cambias por l
a coma, mira:
Keypress del texbox:
LPARAMETERS nKeyCode, nShiftAltCtrl
DODEFAULT(nKeyCode, nShiftAltCtrl)
IF nKeyCode = 46
NODEFAULT
KEYBOARD ","
ENDIF
Saludos,
Pablo Roca (proca@clavo.net <mailto:proca@clavo.net>)
La Corua - Espaa
ICQ 5035887
Sysop del Portal Gratuito de VisualFoxPro en Espaol
<http://clik.to/visualfox>
Vistas y Consultas
Consultas. Ejecucin
lcCadena = "SELECT * FROM MiTabla "
&lcCadena
Nivel de optimizacin de consultas
Usando sys(3054, [0] [1] [11]) podrs ver el nivel de optimizacin de tus consultas.
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Poder hacer un SEEK o INDEXSEEK a cualquier vista
En las vistas con modo de almacenamiento en bufer a tabla (es decir 4 o 5), no s
e
les puede crear un indice, y por tanto no se puede hacer SEEK o INDEXSEEK en ell
as.
Para resolver esto se ha reealizado la sisuiente rutina:
************************************************************
*
* Funcion: INDEXVISTA
*
* Indexa cualquier tipo de vista
*
* Parametros:
*
* tcvista - Nombre de la vista
* tcexpr - expresion completa para indexar
* tctag - nombre del indice (tag)
*
* Ejemplos:
*
* ret=indexview("lv_alelin","allart+STR(mov,3)","allart")
*
* Retorno
*
* devuelve verdadero/falso si se pudo crear el indice
*
* Nota
*
* La vista debe estar abierta
*
* Ultima Modificacion: 05/04/2000 Pablo Roca
* Creacion : 05/04/2000 Pablo Roca
*
************************************************************
FUNCTION indexvista (tcvista, tcexpr, tctag)
LOCAL lcOldBufering, llret, lcalias
IF PCOUNT()=3
lcalias = ALIAS()
SELECT (tcvista)
lcOldBufering=CURSORGETPROP("Buffering")
llret=CURSORSETPROP("Buffering",3)
IF llret
INDEX ON &tcexpr TAG (tctag)
SET ORDER TO
llret=CURSORSETPROP("Buffering",lcOldBufering)
ENDIF
IF !EMPTY(lcalias)
SELECT (lcalias)
ELSE
SELECT 0
ENDIF
ELSE
llret = .F.
ENDIF
RETURN llret
ENDFUNC
Ejemplo de uso:
ret=indexvista("lv_alelin","allart+STR(mov,3)","allart")
Con esto podremos realizar cualquier SEEK (mejor SEEK() ) o INDEXSEEK sobre la v
ista
Velocidad del select
Pues si, en la lista los incluyo todos, pero lo encuentro lgico, ya que asi no ti
ene que traducir el asterisco por la estructura de la tabla, si no que le dices
exactamente lo que quieres.
En la prueba inclui todos los campos.
La diferencia de los tiempos ronda sobre el minuto.
Es mas rapido :
SELECT campo1, campo2, campo3,... FROM tabla1
Que :
SELECT * FROM tabla1
Es cierto, la prueba se ha hecho con una tabla con un millon de registros con In
dice Unico.
Alejo Almela Gonzalez
aalmela@circulolectores.com <mailto:aalmela@circulolectores.com>
Circulo de Lectores S.A
Vistas. Como cambiar el criterio
El otro da se me plante la necesidad cargar una vista con una condicin que puede se
r variable.
Primero pens en generar una vista en tiempo de ejecucin. Pero despus me di cuenta q
ue en realidad lo nico que cambia en la
sentencia es la parte del where, por lo que se puede tener definida una vista co
n la siguiente sentencia SQL:
select * from Tabla where &cCondicion
Entonces antes de hacer el Requery de la vista se carga cCondicion con la condic
in y listo, funciona. No es necesario estar
redefiniendo vistas y tocar el DBC. La vista es siempre la misma.
El nico problema con este mtodo es que la vista se debe definir por cdigo es decir
con:
create sql view Vista as select * from Table where &cCondicion
porque con el generador no se puede poner esa condicin, y si la intentas abrir da
un error de sintaxis.
Espero que te sirva.
Saludos
Marcos Jerouchalmi
Montevideo, Uruguay
Vistas. Como cambiar el formato de campos
Usted puede utilizar DBSETPROP para asegurarse de que los datos pulsan o el form
ato es cmo usted lo desea:
DBSetProp('vista.campo','Field','DataTyp, " N(9,2) ")
y/o
DBSetProp('vista.campo','Field','Format', " 999.999,99 ")
--
John Koziol
MCSD, Microsoft MVP FoxPro
Vistas actualizables
marcar un campo clave:
dbsetprop("mivista.micampo", "field", "keyfield", .t.)
marco los campos a actualizar
dbsetprop("mivista.micampo", "field", "updatable", .t.)
--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Vistas parametrizadas en una cuadrcula
ID Artculo:
Fecha de Creacin:
Fecha de Revisin:
E10115
22-nov-1996
19-APR-1997
La informacin en este artculo se refiere a:
-Microsoft FoxPro, versin 3.0
RESUMEN
Este artculo informa de cmo actualizar una Cuadrcula usando una vista parametrizada
.
MS INFORMACIN
Una situacin que puede darse es que los datos mostrados por una Cuadrcula necesite
n cambiar en base a una accin del usuario,
como por ejemplo la seleccin de un cliente nuevo en un Cuadro combinado, de maner
a que, dependiendo del cliente seleccionado
en el Cuadro combinado, la Cuadrcula muestre solo los registros correspondientes
a ese cliente.
En este caso se puede utilizar una Vista parametrizada para proporcionar los reg
istros que debe mostrar la Cuadrcula.
Cuando se seleccione un nuevo cliente en el Cuadro combinado, se establece el pa
rmetro al nuevo valor del Cuadro,
y usando la funcin REQUERY() se actualiza la Vista y refresca la Cuadrcula.
1. Cree un proyecto nuevo y agregue la base de datos TestData del
directorio VFP\SAMPLES\DATA.
2. Cree una nueva vista usando la tabla Orders e incluyendo todos
los campos.
3. En la ficha Seleccin, introduzca ORDERS.CUST_ID en Nombre de
campo y ?thecust en Ejemplo.
4. Cierre la vista con el nombre PARMGRID.
5. Cree un nuevo Formulario en el proyecto.
6. Agregue Customer, Orders y la vista Parmgrid al Entorno de datos
del Formulario.
7. Abra la ventana Propiedades del Entorno de datos e incluya en el
evento BeforeOpenTables del Dataenvironment el siguiente cdigo:
PUBLIC thecust
thecust = "ALFKI"
8. Cierre el Entorno de datos.
9. Agregue un Cuadro combinado al Formulario y establezca las
siguientes propiedades :
RowSource = Customer.Cust_id
RowSourceType = 6 - Campos
Value = 1
10. Aada el siguiente cdigo al evento InteractiveChange del
Cuadro combinado:
thecust = THIS.DisplayValue
=REQUERY("parmgrid")
THISFORM.Refresh
11. Aada una Cuadrcula al formulario y establezca las siguientes
propiedades:
RecordSource = parmgrid
RecordSourceType = 1-Alias
12. Guarde el formulario y ejectelo.
Vistas parametrizadas que contengan el contenido de un campo
La idea es que me muestre los registos cuyo campo nombre contiene la cadena que
est en lcNom.
?lcNom = "MARIA"
REQUERY("MiVista")
en donde MiVista se crea con:
CREATE SQL VIEW MiVista ;
REMOTE CONNECT MiConeccion ;
SELECT * FROM dbo.Personal Personal ;
WHERE Personal.Nombre LIKE '%'+?lcNom+'%'

You might also like