Foxpro Funciones Muy Bueno

download Foxpro Funciones Muy Bueno

If you can't read please download the document

description

funciones foxpro

Transcript of Foxpro Funciones Muy Bueno

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 INTEGER INTEGER INTEGER InternetDial IN wininet.dll; hwndParent, STRING @ lpszConnectoid, ; dwFlags, INTEGER @ lpdwConnection, ; dwReservedDECLARE 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 DECLARE DECLARE DECLARE Integer Integer Integer Integer GetDesktopWindow in User32 GetDC in User32 Integer GetDeviceCaps in Gdi32 Integer, Integer ReleaseDC in User32 Integer, IntegerhWnd = 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" ;ENDIF FCLOSE( lnFileHandle ) lcResBuff = SPACE(128)+ CHR(13) + "Este es necesario para poder continuar" RETURN lcRetValDECLARE 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 2 3 5 9 19 13 14 17 18 Background (Windows Desktop) Title Bar (Active Window) Title Bar (Inactive Window) Window Background Title Bar Caption Text (Active Window) Title Bar Caption Text (Inactive Window) Highlighted Item Background Highlighted Item Text Command Button 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 ELSE ENDIF=MESSAGEBOX("No se encuentra el cursor") ENDIF =MESSAGEBOX("No es del tipo cursor")--------------------------------------------------------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 RemoveFontResourceHa 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 = 511lnShortPathLen = 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 #define #define #define #define GENERIC_READ 2147483648 GENERIC_WRITE 1073741824 FILE_SHARE_READ 1 OPEN_EXISTING 3 FILE_ATTRIBUTE_ARCHIVE 32hfile = 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( keybd_event( keybd_event( keybd_event( DOEVENTS VK_LMENU, 0, VK_SNAPSHOT, VK_SNAPSHOT, VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY, 0 ) 0, KEYEVENTF_EXTENDEDKEY, 0 ) 0, KEYEVENTF_EXTENDEDKEY + ; KEYEVENTF_KEYUP, 0 ) KEYEVENTF_EXTENDEDKEY + ; KEYEVENTF_KEYUP, 0 )-------------------------------------------------------------------------------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 dela 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 #DEFINE #DEFINE #DEFINETHREAD_PRIORITY_ABOVE_NORMAL 1 THREAD_PRIORITY_NORMAL 0 THREAD_PRIORITY_BELOW_NORMAL -1 THREAD_PRIORITY_LOWEST -2IF 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" 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 &&Debe estar abierta la ventana----------------------------------------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 Integer Integer Integer Integer Integer Integer Integer SetWindowPos In "user32" ; hwnd , ; hWndInsertAfter , ; x ,; y , ; cx ,; cy ,; wFlagsDeclare 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) 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. && oculta el cursorDECLARE 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 INTEGER INTEGER INTEGER INTEGER SHFormatDrive IN shell32.dll ; hwnd, ; diskID, ; fmtID, ; Option#DEFINE SHFMT_ID_DEFAULT 0xFFFF #DEFINE DRIVE_A 0 DECLARE INTEGER GetActiveWindow IN WIN32API IF SHFormatDrive(GetActiveWindow(), DRIVE_A, SHFMT_ID_DEFAULT, 0) = 0ELSE ENDIF=messagebox ( "Formateado") =messagebox ("Imposible formatear")-----------------------------------------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 AutomatizacinUn 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. .ActivateENDWITH---------------------------------------------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 locomdialog.ShowPrinter() && Mostrar Fuente && Mostrar Impresoralocomdialog.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 MUSICAoShell.open(10) oShell.open(9) oShell.open(8) oShell.open(6) oShell.open(5) oShell.open(4) oShell.open(3) oShell.open(2) oShell.open(1) oShell.open(17) oShell.open(18) oShell.open(19) oShell.open(20)&& CAPETRA DE MENU INICIO && ENVIAR A && RECIENTE && FAVORITOS && MIS DOCUMENTOS && IMPRESORAS && PANEL DE CONTROL && PROGRAMAS && INTERNET EXPLORER && MI PC && MIS SITIOS DE RED && ENTORNO DE RED && 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 #define #define #define #define #define CF_SCREENFONTS 0x00000001 CF_PRINTERFONTS 0x00000002 CF_BOTH (CF_SCREENFONTS + CF_PRINTERFONTS) CF_SHOWHELP 0x00000004 CF_USESTYLE 0x00000080 CF_EFFECTS 0x00000100loComDialog = 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 1 2 3 4 5 6 7 Desplazamiento Desplazamiento Desplazamiento Desplazamiento Desplazamiento Desplazamiento Desplazamiento Desplazamiento hacia arriba hacia abajo retroceso de pgina avance de pgina a la izquierda a la derecha pgina a la izquierda 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" EndIfEndFor ------------------------------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 #define #define #define SM_CXSCREEN 0 && Ancho de Screen en Pxeles SM_CYSCREEN 1 && Alto de Screen en Pxeles SM_CXFULLSCREEN 16 && Ancho rea de cliente SM_CYFULLSCREEN 17 && Alto rea de clienteDECLARE 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 parte 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('[email protected]' , '[email protected]' , '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)+nLowerLimitENDCASE---------------------------------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 estiloACTIVATE 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 ENDIF&& Muestra las 25 primeras fuentesFOR 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 &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 es invocando una funcin API el parmetro al programa RUN la ventana del DOS, seccin de APIS. . . . . . . . . . . .Formularios Grficos Impresora Informes Internet Ms Agents Pantalla Redes SQL Tablas Varios Vistas y ConsultasAplicaciones 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 VFPCurso 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 edadCalcular 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 parmetrosCrystal 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 WebC.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 cuadrculaAplicaciones 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. 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 ") *-------------------------------------------------------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 Version(2) = 2 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) && Ejecutable && Proyecto* LA ACTIVAMOS SetActiveWindow(nHWD) RETURN .T. ELSE * VENTANA NO ACTIVA RETURN .F. ENDIF FileSystemObject 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 aplicacion. 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(, 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 HugoNmero 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 apertura. 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 #DEFINE #DEFINE #DEFINE NORMAL_PRIORITY_CLASS 32 IDLE_PRIORITY_CLASS 64 HIGH_PRIORITY_CLASS 128 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 - ArgentinaTamao 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 withPor 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: El WIki de Fox tiene mucho material sobre VFP+ADO: Alli encontras un buen juego de ejemplos en: 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 AccessSi 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 (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." 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 propiedad DATABASE de todos los objetos Cursor que hubiera en el Entorno