VerifyScreenSavePwd Muestra el cuadro de diálogo para comprobar el password del protector de pantalla actual de Window Declare integer VerifyScreenSavePwdin "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 conexión 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, ; dwReserved DECLARE INTEGER InternetAutodial IN wininet.dll; INTEGER dwFlags, INTEGER hwndParent DECLARE INTEGER InternetAutodialHangup IN wininet.dll; INTEGER dwReserved * Conecta con una conexión determinada strConnection = "Internet" nConnection = 0 *= InternetDial(0, strConnection, INTERNET_AUTODIAL_FORCE_UNATTENDED, ; * nConnection, 0) * Conecta con la conexión por defecto = InternetAutodial(INTERNET_AUTODIAL_FORCE_ONLINE, 0) * Conecta mostrando el cuadro de conexión *= InternetAutodial(INTERNET_AUTODIAL_FORCE_UNATTENDED, 0) * Disconecta *= InternetAutodialHangup(0) ----------------------------------------------------------------TextOut y GetWindowDC A través de estas funciones podemos imprimir texto en cualquier posición de la pantalla, y con características 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 configuración de Windows. Este es el dato que aparece en la configuración 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, 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 extensión LOCAL lcRetVal, lcFileExt, lcFileName, lnFileHandle,;lcDirectory, lcResBuff STORE "" TO lcRetVal, lcFileExt, lcFileName, lcDirectory tcExt = "SCX" && Extensión a buscar lcFileExt = UPPER( ALLTRIM( tcExt )) * Intenta crear un archivo con la extensión 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 lcRetVal DECLARE INTEGER FindExecutable IN SHELL32 ; STRING @cFileName, ; STRING @cDirectory, ; STRING @cBuffer * llama a la función Findexecutable lnRetVal = FindExecutable( @lcFileName, @lcDirectory, @lcResBuff) lcMsgTxt = "" * Determina el valor retornado por la función 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 extensión " + lcFileExt OTHERWISE * Obtiene la ruta y exe asociado a la extensión lcRetVal = LEFT(lcResBuff, AT(CHR(0), lcResBuff) - 1) ENDCASE * Borra el archivo creado DELETE FILE (lcFileName) IF ! EMPTY( lcMsgTxt ) MESSAGEBOX( lcMsgTxt, 16, "Fallo la búsqueda" ) 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" "") lcRetVal = IIF( lnSuccess = 1. "Creado".255) lnBuffer = 255 lnDirLen = GetWindowsDirectory( @lcSysDir.255) lnBuffer = 255 lnDirLen = GetSystemDirectory( @lcSysDir. STRING @cBuffer. INTEGER nSize lcSysDir = REPLICATE(CHR(0).lnSuccess = CreateDirectory ( tcDirName. lnDirLen ) ?lcRetVal ---------------------------------------------------------GetCurrentDirectory Devuelve la ruta del directorio actual de trabajo DECLARE INTEGER GetCurrentDirectory IN Win32API . . STRING cKillDir tcDirName ="c:\dav" lnSuccess = RemoveDirectory( tcDirName) lcRetVal = IIF( lnSuccess = 1. "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 ) lcRetVal = LEFT( lcSysDir. "Removed". STRING @cBuffer *** Call the function lcSysDir = REPLICATE(CHR(0). . INTEGER nSize. lnDirLen ) ? lcRetVal -------------------------------------------------GetSystemDirectory Devuelve la ruta del directorio System de Windows DECLARE INTEGER GetSystemDirectory IN Win32API . lnBuffer ) lcRetVal = LEFT( lcSysDir. "Fallo" ) Api para Eliminar Directorio DECLARE INTEGER RemoveDirectory IN WIN32API . tnCursorType ) . 'CUR'. @lcSysDir ) lcRetVal = LEFT( lcSysDir. 'ANI' ) IF FILE( tcCursorFile ) DECLARE INTEGER LoadCursorFromFile in Win32Api String DECLARE SetSystemCursor in Win32Api Integer.ANI" tnCursorType = 32513 IF INLIST( JUSTEXT( tcCursorFile )." + 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. lnSq256 ) lcBlue = TRANSFORM( INT( lnWinCol/lnSq256 ) ) lcGreen = TRANSFORM( INT( lnRedGrn/256) ) lcRed = TRANSFORM( MOD( lnRedGrn.256) ) ? (lcRed + ". Integer lcNewCursor = LoadCursorFromFile( tcCursorFile ) Lt = SetSystemCursor( lcNewCursor.lnBuffer = 255 lnDirLen = GetCurrentDirectory( lnBuffer. 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. LOCAL lcNewCursor tcCursorFile = "c:\windows\cursors\globe." + lcGreen + ". 5)+CHR(0) tcUserName=STRCONV(STRCONV(tcUserName. String pName. Long hwnd.STRING @ tcServer=STRCONV(STRCONV(tcServer.5)+CHR(0) LOCAL lnError lnError=NetUserDel(@tcServer. Declare integer ConfigurePort in "winspool.@tcUserName) IF lnError>0 MESSAGEBOX('Imposible borrar Usuario') ENDIF -------------------------------------------------------ConfigurePort A través de la función ConfigurePort podemos presentar las propiedades del los puertos pasados como parámetro y configurar así sus valores.drv". "LPT1:")) ---------------------------------------------------AddFontResource y RemoveFontResource . "COM1:") =ConfigurePort("".1).1). String pPortName =ConfigurePort("".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 @. 0 . 0 . He observado algunos procedimientos de VB para ver como lo hacen pero creo que se complican mucho. Declare Long AddFontResource 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. además enviarlo directamente al puerto paralelo.DLL" . DECLARE INTEGER CopyFile IN KERNEL32. en esta caso a través de GETFILE( ).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. STRING @SourceFileName.'LPT1:'. 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. pero ultimamente estoy utilizando una llamada la API que lo hace de manera facil y contundente.Ha copiado una nueva fuente y desea instalarla? o desea quitar una fuente que ya ha sido instalada?. obtenemos la fuente a instalar. String lpFileName Declare Long RemoveFontResource in "gdi32". . devolviendo un valor que indica si el proceso se realizo de manera satisfactoria. INTEGER bFailIfExists IF CopyFile('C:\autoexec. STRING @DestFileName.bat'.DLL . String lpDllName nombredll="c:\rutadondeestaelocxodll\" liRet = DLLSelfRegister(NombreDll) . . Es utilizada por Windows cuando se pulsa Delete o Ctrl o Shift. STRING @lpClassName. DECLARE SHORT GetKeyState in WIN32API INTEGER KEYCODE && Evalúa si esta presionada la tecla SHIFT IF (GETKEYSTATE(16) < 0) MESSAGEBOX("Shift presionado") ENDIF && Evalúa si esta presionada la tecla CONTROL (CTRL) IF (GETKEYSTATE(17) < 0) MESSAGEBOX("CTRL presionado") ENDIF && Evalúa si esta presionada la tecla ALT IF (GETKEYSTATE(18) < 0) MESSAGEBOX("Alt presionado") ENDIF . para determinar como realiza la operación de copiado.If liRet = 0 Then SelfRegisterDLL = . . MessageBox ("Error. @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 través de esta función podemos determinar si una tecla esta presionada en cualquier instante. STRING @lpWindowName &&Debe estar abierta la ventana Windows lcApplicationTitle = "WINDOWS" lnHWnd = FindWindow(0.f.t. MessageBox ("Registrado ocx") Else SelfRegisterDLL = . DECLARE INTEGER FindWindow IN Win32API. etc. borrado. Se le debe pasar el "Caption" de la ventana a buscar.No Registrado ocx") EndIf ----------------------------------------------------FindWindows Determina si una ventana ventana existe o también puede ser implementada para conocer si nuestra aplicación esta ejecutándose. --------------------------------------------------GetKeyboardState Muy parecido al anterior pero verifica a través 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 tendrán 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 función GetSystemMetrics provee mucha información 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 configuración del monitor, resolución, numero de colores soportados, entre otros. Útil para programación 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 tamaño de un archivo determinado, He recibido muchas consultas sobre esta función, 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 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 INTEGER. Podemos capturar la ventana activa a través de esta función. Long . INTEGER.0 Declare integer GetActiveWindow in win32api Declare integer IsIconic in "user32.0 Para Visual Fox Pro 6.0 y 5. INTEGER. Declare integer keybd_event in "user32" .dll" Long hwnd ?IsIconic(thisForm. 0 ) 0. 0. VK_SNAPSHOT. KEYEVENTF_KEYUP. 1. INTEGER VK_SNAPSHOT = 44 VK_LMENU = 164 KEYEVENTF_KEYUP = 2 KEYEVENTF_EXTENDEDKEY = 1 DOEVENTS keybd_event(VK_SNAPSHOT. 0 ) DOEVENTS DOEVENTS keybd_event( keybd_event( keybd_event( keybd_event( DOEVENTS VK_LMENU. integer. KEYEVENTF_KEYUP. 0. esto también es posible con las funciones Findwindow y Postmessage. KEYEVENTF_EXTENDEDKEY. long. así que aquí esta. 0 ) -------------------------------------------------------------------------------Otra utilidad de esta función es minimizar todas las ventanas que se encuentran activas. highorder) --------------------------------------------------IsIconic Devuelve un valor el cual determina si la aplicación pasada a la función se encuentra minimizada.hWnd) && Solo para Visual Fox Pro 7. 1. 0 ) keybd_event(VK_SNAPSHOT. KEYEVENTF_EXTENDEDKEY.?GetFileSize(hfile. En este caso determina si la aplicación activa se encuentra minimizada. He recibido muchas consultas sobre este tema. integer. KEYEVENTF_KEYUP. 0 ) KEYEVENTF_EXTENDEDKEY + .dll" Long hwnd ApliActiva = GetActivateWindow() ?IsIconic(ApliActiva) ----------------------------------------------Keybd_event Esta función tiene múltiples propósitos. 0. Declare integer IsIconic in "user32. DECLARE INTEGER keybd_event IN Win32API . pero todos ellos enfocados al manejo de ventanas. VK_SNAPSHOT. 0 ) 0. VK_LMENU. KEYEVENTF_EXTENDEDKEY + . #define KEYEVENTF_KEYUP 2 #define VK_LWIN 91 =keybd_event(VK_LWIN. Para esto le pasamos el handle de la ventana. 0) =keybd_event(VK_LWIN. String lpText. 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 función manda un mensaje de Windows.WAV en la ruta especificada. Long hwnd. Long wLanguageId =MessageBoxEx(0. KEYEVENTF_KEYUP. 0. 0) ---------------------------------------------------LockWindowUpdate Impide la actualización de una ventana o la actualiza dependiendo el valor pasado como parámetro. iResult = mciExecute("Play c:\windows\ding.wav") ---------------------------------------- .. 0.dll" String lpstrCommand && Debe existir el archivo DING.0) --------------------------------------------mciExecute Otra función para reproducir un sonido WAV. 0."Mensaje para probar función api". en este caso se bloqueara la ventana activa. 0) =keybd_event(77. Intente y cuéntenme Declare integer mciExecute in "winmm. Long uType. 0."API". pero mucho mas completa e interesante. es una extensión de la función MessageBox..0. 0. Declare integer MessageBoxEx in "user32"... String lpCaption. No estoy seguro si se puede reproducir sonidos de otra extensión tales como MIDIS. ."".avi fullScreen" -------------------------------------------------------------------------------Enviamos una cadena a la función mciSendString la cual hara que se cierre la unidad de CD-ROM Declare integer mciSendString in "winmm. .mciSendString Algunas veces queremos implementar una caracteristica multimedia a nuestras apli caciones. esta función permite reproducir un video creo que de cualquier extensión. Long uReturnLength. String pstrCommand. String lpstrReturnString. En este caso se le pasara el titulo de una ventana y a través de .AVI en C:\ cVal = "play c:\cool.dll" . 127.. Este crea una ventana especial donde se reproduce el video. String lpstrCommand. Long hwndCallback &&& Debe existir un archivo llamado COOL. String lpstrReturnString. 0.dll" . String lpstrReturnString. "". . Long uReturnLength. 0) -------------------------------------------------------------------------------Enviamos una cadena a la función mciSendString la cual hara que se abra la unidad de CD-ROM Declare integer mciSendString in "winmm. 0. String lpstrCommand. Long hwndCallback = mcisendstring("set CDAudio door closed".avi" ReturnVal = mciSendString(cVal. Posee otras utilidades referentes a la multimedia Declare integer mciSendString in "winmm. . Long hwndCallback retvalue = mcisendstring("set CDAudio door open". Long uReturnLength. .. 0) ----------------------------------------PostMessage Una de las utilidades de la función PostMessage es comunicarse con las ventanas y controles pero de manera diferente que la función Sendmessage.dll". 127... 1) && Si queremos ver el video a pantalla completa cVal = "play c:\cool. 0) ---------------------------------------------RegisterServiceProcess He recibido muchas consultas de como evitar que la aplicación aparezca registrada cuando presionamos la combinación de teclas ALT + CTRL + SUP. string lpClassName. Long wParam. LOCAL n_CurrProc DECLARE LONG RegisterServiceProcess IN KERNEL32. por lo tanto abra esta ventana Declare integer PostMessage in "user32" . Long hWnd. El ejemplo se explica con la ventana Panel de Control. Long hwnd. Long wParam. String lpWindowName #define WM_COMMAND 273 #define MIN_ALL 419 #define MIN_ALL_UNDO 416 &&restaura todo lo minimizado lngHwnd = FindWindow("Shell_TrayWnd".la función FindWindow se obtendrá el handle de ella y se le pasara el argumento para cerrar esta ventana.. Bueno aquí esta la solución. string lpWindowName cCerrar = FindWindow(0. MIN_ALL . Long wMsg.WM_CLOSE. Declare integer PostMessage in "user32". WM_COMMAND. 0) && Minimiza todo lngHwnd = FindWindow("Shell_TrayWnd". WM_COMMAND. LONG ProcessID. Long wMsg. LONG ServiceFlags DECLARE LONG GetCurrentProcessId IN KERNEL32."Panel de control") =PostMessage(cCerrar . esta caracteristicas también es posible con la función Keyb_Event.DLL . "") =PostMessage(lngHwnd.DLL . String lpClassName. . MIN_ALL_UNDO . . "") =PostMessage(lngHwnd. 0. Long lParam Declare integer FindWindow in "user32" . Long lParam #define WM_CLOSE 16 Declare integer FindWindow in "user32" . 0) -------------------------------------------------------------------------------También podemos utilizar estas dos funciones (FindWindow y PostMessage) para minimizar y restaurar todas las ventanas activas. etc. Long lParam Declare integer GetActiveWindow in win32api =SendMessage(GetActiveWindow(). desde una ruta determinada. String lpComputerName =SetComputerName("Equipo_1") -------------------------------------------------SetCurrentDirectory Establece el directorio para la búsqueda de archivo. pasándole los parámetros podemos cerrar una aplicación.f. etc. 0) ENDIF ---------------------------------------SendMessage La función SendMessage se utiliza para establecer una comunicación con otra aplicación. Long hwnd. 0) -----------------------------------------SetComputerName Se utiliza cuando queremos cambiar el nombre de un computador en la red. Además podemos interactuar con controles tales como Combos. 61760. Long wMsg. . 274. && remueve el flag (bandera) de servicio RegisterServiceProcess(n_CurrProc. Declare integer SendMessage in "user32" . Listas especialmente pronto publicare un ejemplo con estas. 1) ELSE && crea el falg (bandera) de servicio de la aplicación RegisterServiceProcess(n_CurrProc. IF lOcultarApp = . se cambiara el nombre del equipo. formularios. Importante cuando queremos abrir tablas.&& obtiene el identificador de proceso n_CurrProc = GetCurrentProcessId() lOcultarApp = . En este caso ejecuta el protector de pantalla que se encuentre configurado. Es decir. Long wParam. En este caso se le colocará al computador el nombre de Equipo_1... Declare integer SetComputerName in "kernel32" .T.. que prioridad tiene determinada aplicación al momento de asignarle recursos. En este ejemplo cambia el papel tapiz de Windows. Long fForce =SetSystemPowerState(1. String lpPathName =SetCurrentDirectory("c:\") ---------------------------------------------------SystemParametersInfo Esta función tiene muchas utilidades.. Long fSuspend.. string lpvParam..0) ----------------------------------------SetThreadPriority y GetCurrentThread Determinan y establecen las prioridades de las aplicaciones y procesos en Windows. el equipo entrara en un estado de hibernación. este ejemplo pide que busque un archivo con extensión BMP para colocarlo de papel tapiz. Declare integer SetSystemPowerState in "kernel32". INTEGER nPriority DECLARE INTEGER GetCurrentThread in KERNEL32. ..Es mejor que la función de VFP SET DEFAULT TO "RUTA" Declare integer SetCurrentDirectory in "kernel32". Long uParam.lfFile. es decir.DLL . Declare integer SystemParametersInfo in "user32".DLL #DEFINE THREAD_PRIORITY_HIGHEST 2 . INTEGER hThread. 0. Long fuWinIni lfFile = getfile() IF !empty(lfFile) = SystemParametersInfo(20. Long uAction. DECLARE INTEGER SetThreadPriority IN KERNEL32. 1) ENDIF -------------------------------------------------SetSystemPowerState Con esta función API podemos implementar la opción SUSPENDER que viene con Windows. . Para probar el ejemplo abra la ventana del Panel de Control y coloque el siguiente código en un botón. STRING @ lpString declare integer FindWindow in win32api string c. string t cTitulo="Panel de control" hWnd=FindWindow(0. DECLARE INTEGER SetVolumeLabel IN KERNEL32. STRING @ lpRootPathName.DLL . STRING @ lpVolumeName IF SetVolumeLabel('C:\'+CHR(0). DECLARE SHORT SetWindowText IN USER32.THREAD_PRIORITY_HIGHEST) # 0 =messagebox("Prioridad alta establecida") ELSE =messagebox("Error al establecer prioridad") ENDIF ---------------------------------------------SetVolumeLabel Cambia la etiqueta (label) del disco pasado como parámetro.cTitulo) IF SetWindowText(hWnd.DLL .#DEFINE #DEFINE #DEFINE #DEFINE THREAD_PRIORITY_ABOVE_NORMAL 1 THREAD_PRIORITY_NORMAL 0 THREAD_PRIORITY_BELOW_NORMAL -1 THREAD_PRIORITY_LOWEST -2 IF SetThreadPriority(GetCurrentThread(). Primero se obtiene el handle de la ventana a cambiarle el titulo y luego se le pasa a la función el handle y el nuevo titulo. bueno esta es la declaración para hacerlo."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 . vera como cambia el titulo de la ventana del panel de Control.'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. . INTEGER hWnd. 0. 0. Long lFlags. 0. 128 ) && oculta Wait windows "barra ocultada" time 3 =SetWindowPos (Ventana. hWndInsertAfter . es decir. hwnd ..----------------------------------------SetWindowPos Esta función es de las más solicitadas. String ByVal NewFile="d:\cool. 0. . es decir aparecerá un acceso directo al archivo pasado como parámetro. 0. String lpWindowName Ventana = FindWindowA("Shell_traywnd". A través de ella podemos interactuar con las ventanas. Long lPv =SHAddToRecentDocs(0. String lpClassName. . . 0. Declare integer SHAddToRecentDocs in "shell32. 0. 0. en esta caso en la posición 2.avi" nF=SHAddToRecentDocs(2. 0. en este caso ocultara la barra de tareas de windows Declare Integer Integer Integer Integer Integer Integer Integer Integer SetWindowPos In "user32" .."") =SetWindowPos (Ventana. . 0. todos los accesos directos a los documentos ejecutados recientemente. Long uFlags.NewFile) ----------------------------------------------- .. podemos establecer además en que posición se agregara el archivo. y .. x .0) wait windows "Espere un momento" timeout 3 -------------------------------------------------------------------------------Otra utilidad es agregar archivos a la carpeta de documentos. wFlags Declare Integer FindWindow In "user32" As "FindWindowA" . Declare integer SHAddToRecentDocs in "Shell32" .dll". cx . cy . 64) && muestra -----------------------------------------SHAddToRecentDocs Vacía la carpeta de documentos utilizados en Windows. ShellAbout Permite mostrar una ventana de acerca muy profesional basada en las típicas ventanas acerca de Windows. editar.F. Ofreciendo información del Sistema. Declare integer ShellExecute in "shell32. tales como abrir.."c:\". Declare integer ShowCursor in "user32". Incluye además algunos otros procedimientos como imprimir. String lpParameters.. abrir. también podemos pasarle . String szApp. String lpFile. 0) ---------------------------------------------ShowCursor Muestra u oculta el cursor del mouse.. buscar. && oculta el cursor . Declare integer ShellAbout in "shell32. dependiendo el valor pasado. desde cual directorio quiere empezar la búsqueda. String lpDirectory. Esta utiliza algunos parámetros como. una implementación de esta función es abrir el cuadro de diálogo "Buscar".. "Copyright 2000". integer hWnd. si es 0 lo oculta y si es 1 lo muestra.. etc. imprimir. o . dependiendo el parámetro que se le mande a la función. "Find". "". "". Long hIcon =ShellAbout(0. el archivo a buscar entre otros.dll" . Long nShowCmd =ShellExecute(0. Long hwnd. Prueba modificando algunos valores y aprenderás un poco más. "La Web de Davphantom". 0) -------------------------------------------------------------------------------Se utiliza para ejecutar cualquier archivo con su respectivo programa asociado. Long cursorestado =showcursor(0) Para mostrarlo =showcursor(1) ------------------------------------------ShellExecute Es una de las funciones que más se utiliza en Windows. String lpOperation. String szOtherStuff.dll" . a través del cual Windows realiza sus búsquedas.T. tiene que ver con todos las ejecuciones de archivos y los procesos que sobre estos se realizan. bat" este archivo debe existir =Shellexecute(0.cjb. .DECLARE INTEGER ShellExecute IN "Shell32. diskID. . STRING lpFile. INTEGER hWnd."". el valor de este flag es 1 y 0.0) -------------------------------------------------SHEmptyRecycleBin Es utilizada para vaciar la papelera de reciclaje. lcDrive. . en este ejemplo se intentara formatear el disco A:\.0) * Imprime el archivo "c:\autoexec. ."c:\prueba. INTEGER dwFlags #define SHERB_NOCONFIRMATION 0x00000001 #define SHERB_NOPROGRESSUI 0x00000002 #define SHERB_NOSOUND 0x00000004 lcDrive = "C:" + CHR(0) SHEmptyRecycleBin( 0."Open"."". fmtID."Print". DECLARE INTEGER SHEmptyRecycleBin IN Shell32 . STRING @lpszRootPath. Option #DEFINE SHFMT_ID_DEFAULT 0xFFFF #DEFINE DRIVE_A 0 DECLARE INTEGER GetActiveWindow IN WIN32API IF SHFormatDrive(GetActiveWindow()."".bat".doc". DRIVE_A. INTEGER hwnd. el flag. SHFMT_ID_DEFAULT. . 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 parámetro. STRING lpVerb."". hwnd. STRING lpParameters.doc" Este documento debe existir =Shellexecute(0. indica si se muestra mensaje para vaciar la papelera o no. . ."Open"."c:autoexec. .dll ."".davphantom. DECLARE INTEGER INTEGER INTEGER INTEGER INTEGER SHFormatDrive IN shell32.net". ."http://www. LONG nShowCmd * Abre el documento "c:\prueba.0) * Abre el explorador por defecto en la pagina de Davphantom =Shellexecute(0. . 0) = 0 ."". si es 0 muestra mensaje para la eliminación y si es 1 no muestra ningún mensaje. STRING lpDirectory.dll" . Declare Long tapiRequestMakeCall in "TAPI32. String DestAddress. String AppName. Declare Integer waveOutGetNumDevs in "winmm.DLL".exe" llamandoa = "David" ValDev = tapiRequestMakeCall(Numero. Declare integer Sleep in "kernel32" . pasándole los parámetros a este.."hola como estas") -----------------------------------------waveOutGetNumDevs Devuelve un valor 1 el cual determina si Windows tiene instalada o no la tarjeta de sonido.ELSE ENDIF =messagebox ( "Formateado") =messagebox ("Imposible formatear") -----------------------------------------Sleep Muchas veces deseamos bloquear nuestra ventana o aplicación hasta que se realice un proceso determinado.") Else =MessageBox "Tarjeta de sonido no soportada. Long dwMilliseconds =Sleep(5000) && Impide la actualización de la ventana por 5 segundos (5000 milisegundos) -----------------------------------------------------------TapiRequestMakeCall Podemos realizar llamadas a través del marcador de teléfono de Windows.. String CalledParty. NombreProg. llamandoa .. los cambios hechos en esta ventana se reflejaran después del tiempo indicado.dll" () inf = waveOutGetNumDevs() If inf > 0 Then =MessageBox ("Tarjeta de sonido soportada. es una forma fácil de incluir en tus aplicaciones procedimientos profesionales de una manera sencilla. Impide la actualización de una ventana por un determinado tiempo.") endif . bueno la función SLEEP del api de Windows lo hace. String Comment Numero = "6690725" NombreProg = "c:\windows\dialer. cPassword. -------------------------------------WNetCancelConnection Desconecta una terminal de la unidad de red. DECLARE INTEGER WNetCancelConnection IN "mpr. cDriveLetter) Si no es posible la conexión esta enviara un valor de error que puede ser interceptado.------------------------------------WNetAddConnection este función permite agregar o conectar a una unidad de red pasando los parámetros de la ruta a la unidad. . permitiendo una conexión fácil con un dispositivo remoto. . STRING cRemoteName. así mismo como el password DECLARE INTEGER WNetAddConnection IN "mpr.0) ------------------------------------------WNetConnectionDialog Muestra el cuadro de dialogo para conectar a una Unidad de Red. dependiendo el valor pasado a esta función. INTEGER nResourceType DECLARE INTEGER GetActiveWindow IN WIN32API IF WNetConnectionDialog(GetActiveWindow(). STRING cLocalName cResource = "\\SERVIDOR\UNIDADRED" cPassword = "password" cDriveLetter = "Y:" ? WNetAddConnection(cResource.dll" . .1) = 0 =messagebox("La conexión establecida") ELSE =messagebox("Nno fue posible la conexión") ENDIF ================================================================================ ======== Creando tablas en Word con VFP a través de Automatización . STRING cPassword. INTEGER hWnd. STRING cName.dll" . DECLARE INTEGER WNetConnectionDialog IN WIN32API . . INTEGER nForce nForce = 1 && Forza a la desconexión =WNetCancelConnection("Y:". esta es la forma sencilla de h acerlo.ActiveDocument .txt' COPY fields empl_id.Un ejemplo como podemos crear tablas en Word con datos de tablas de VFP.Activate ENDWITH ---------------------------------------------Invocar cuadros de dialogo de Windows Existe una forma sencilla de invocar cuadros de dialogo de Windows. oShell = CREATEOBJECT("Shell.lnFields) ENDWITH .'') erase (lcTemp) #define wdSeparateByCommas 2 oWordDocument=createobject("word. Ayuda.Range..application") && Create word object WITH oWordDocument .ShowSave() && Mostrar Guardar loComDialog. USE employee lcTemp = SYS(2015)+'. pero se nos complica un poco. tales como: Guardar. .ShowFont locomdialog.ConvertToTable(wdSeparateByCommas.open(11) && MIS MUSICA .commondialog" ) locomdialog.ShowColor() && Mostrar Colores locomdialog.t. last_name TO (lcTemp) TYPE csv lnFields = 2 _ClipText = chrtran(FileToStr(lcTemp).documents. Impresoras.Paste . Fuentes.'"'. Abrir.Application") oShell.open(14) && MIS VIDEOS oShell. loComDialog = newobject( "mscomdlg.Range.visible = .open(16) && ESCRITORIO oShell.ShowOpen && Mostrar Abrir ------------------------------------------------Llamar a carpetas importantes de Windows En algunas ocasiones queremos mostrar la carpeta de mis documentos u otra carpeta de Windows.ShowPrinter() && Mostrar Fuente && Mostrar Impresora locomdialog.add WITH . Color. a través de Automatización. lcNombreArchivo = Sys(2015) + ".open(18) oShell. . lcNombreArchivo ) Compile (lcNombreArchivo) && en VFP 6 SP 3 o superior DO (lcNombreArchivo) ExecScript(CampoMemo) && En VFP 7 . #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 0x00000100 loComDialog = newobject( "mscomdlg.oShell.open(9) oShell. .open(5) oShell. En VFP 6 se puede utilizar Compile (service Pack 3 creo). . texto. .open(8) oShell.FontName.open(10) oShell.FontSize.open(19) oShell.open(6) oShell.Color ENDWITH -------------------------------------Compilando código desde tiempo de Ejecución Una de las funciones más robustas e importantes que han sido agregadas a VFP 7 es Execscript.FontName = "Arial" &&Valor Iniciales . .open(3) oShell.FontStrikeThru.open(2) oShell. Permite compilar código desde campos memos.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 características Agregue un cuadro de dialogo en el cual le permita establecer todas las características de un tipo de letra.FontItalic.ShowFont() && Resultado del tipo de letra seleccionado ? .FontBold.FontSize = 22 &&Valor Iniciales .commondialog" ) WITH loComDialog .Flags = CF_BOTH + CF_EFFECTS && Muestra las fuentes Imprimibles y de la Ventana .FontU nderline.open(17) oShell.open(1) oShell.prg" Strtofile(CampoMemo.open(4) oShell. . etc y compilarlo. Drives('c'). objXLchart.vcx") cEncryptedString = [] cEncryptedString2 = [] oCrypt. oFS=CreateObject('scripting."clave". "Column") . intRotate objXL = CreateObject("Excel. este es un BUEN ejemplo de como hacerlo. La clase permite que sea muy fácil hacerlo oCrypt = NEWOBJECT("_cryptapi".Add() objXL.Rotation = intRotate Next For intRotate = 175 To 0 Step -5 objXLchart..1).Add objXL. . LOCAL objXL.Cells(1.2).Visible = .encryptSessionStreamString(" Encriptando Texto".Type = -4100 For intRotate = 5 To 180 Step 5 objXLchart. THISFORM.Cells(1.Range("A1:C1").3).Application") objXL. esta forma es súper sencilla y con poco código.Value = 10 objXL.Value = 15 objXL.----------------------------------------Encriptar con clase de VFP7 Se agrego a VFP7 una clase que permite encriptar invocando algunas funciones API .SetAll("Resizable".Value = 50 objXL. @cEncryptedStrin g) ------------------------------------Gráficos con Excel y con buenos efectos Uno de los temas más solicitados a mi correo son los gráficos.Cells(1. objXLchart.t.SerialNumber ------------------------------Impedir que cambien el tamaño de las Columnas de un Grid Si quiere que nadie cambie el tamaño de las columnas de un grid. y además agregándole un gran efecto. puede utilizar es ta forma.Select objXLchart = objXL.filesystemobject') ? oFS.HOME()+"\ffc\_crypt.F.Charts.Workbooks.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.Grid1. Grid1. sino ocurrirá un error.txt") --------------------------------------Copiar archivos utilizando WSH De las formas más sencillas de copiar y mover archivos y carpetas. ofs=createobject("scripting.txt + Archivo2.filesystemobject") ofs.DoScroll(3) Donde los parámetros de este método 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 página avance de página a la izquierda a la derecha página a la izquierda página 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 . "Destino.Grid1.DoScroll(2) Thisform. Select Tabla For i = 1 To TagCount() If Tag(i) = "nId_campo" Wait Window "SI" EndIf . Thisform.txt") + filetostr("Archivo2.txt").'e:\Destino') Donde origen y destino pueden ser directorios --------------------------------Desplazarse por un Grid Forma de avanzar o retroceder dentro de un grid.copyfolder('c:\Origen'.txt Otra forma seria utilizando la función strtofile strtofile(filetostr("Archivo1. RUN COPY Archivo1.-----------------------------------Copiar el contenido de dos archivos de Texto en Uno Este ejemplo demuestra como podemos copiar dos archivos o más en uno solo.txt Destino. Esta es la forma de omitir esa ventana #define #define #define #define SM_CXSCREEN 0 && Ancho de Screen en Píxeles SM_CYSCREEN 1 && Alto de Screen en Píxeles SM_CXFULLSCREEN 16 && Ancho área de cliente SM_CYFULLSCREEN 17 && Alto área de cliente DECLARE INTEGER GetSystemMetrics IN Win32API. 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 actualización de la pantalla REPORT FORM NombreReporte. pero siempre nos muestras la ventanita "Imprimiendo".frx TO PRINTER LockWindowUpdate(0) && No actualiza la pantalla -------------------------------Conocer la resolución actual de la pantalla en Windows Cuando mandamos reportes a la Impresora algunas veces queremos personalizar esta operación.ico" zoom -----------------------------------Suprimir cuadro de diálogo "Imprimiendo" con el API Cuando mandamos reportes a la Impresora algunas veces queremos personalizar esta operación. Este truco resuelve el problema. podemos modificar el aspecto de la ventana (Screen) de VFP MODIFY WINDOW "screen" TITLE "La Web de VFP" ZOOM icon file "dav. INTEGER nIndex ? ? ? ? GetSystemMetrics(SM_CXSCREEN) GetSystemMetrics(SM_CYSCREEN) GetSystemMetrics(SM_CXFULLSCREEN) GetSystemMetrics(SM_CYFULLSCREEN) ------------------------------------Agregar un Month View desde código 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.EndFor ------------------------------Modificar la Ventana de VFP con un solo comando Si necesidad de estar escribiendo varios comandos. El Month View lo podemos agregar en cualquier p . MonthView.Visible = .Top = 2 oForm. oForm. LnVar = 350 && Variable a agregar 0 ?PADL(lnVar.'0') && el número 5 especifica el ancho de la cadena de números Resultado 00350 -------------------------------------------Convertir a Hexadecimal números Existen diversas formas de convertir a Hexadecimal. 'MSComCtl2. pero talvez esta es la más fácil . pero para determi nar si tenemos instalado alguno y cual versión utilice este truco.Show() ---------------------------------------Determinar el Service Pack instalado Con tantos errores de VFP siempre debemos instalar algunos SP. oForm = Thisform oForm. ? Transform(123456. Se utiliza mucho en la generación de Factura. Solo convierte Enteros.t. ? OS(7) --------------------------------Conocer la versión del Sistema Operativo Nos devuelve el nombre y la versión del sistema operativo que estamos ejecutando. solo nos devuelve el nombre y versión: por e jemplo: Windows 4. Sino tiene instalad o ninguno devolverá una cadena vacía. No nos dice si es Window 98.ctlMonth. puedes hacer esto.2') oForm.arte del Form o del objeto.ctlMonth.AddObject('ctlMonth'.ctlMonth. OJO.Left = 2 oForm. eso depende de las propiedades Top y Left.9021 ? OS(1) ------------------------------------Agregar ceros ( 0 ) a la izquierda de un número Si deseas agregar 0 a un número a la izquierda de este. 95 o ME. "@0") -------------------------- . 'oleControl'.5. dbf Si deseas que el usuario final no pueda acceder a los botones debes distribuir e l archivo Foxuser. "Column") En este caso se cambia el fondo de la celda para aquellos empleados que tengan u na edad superior a 40 años -------------------------------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 opción.edad > 40. thisform. ve a la barra y con click sostenido quita todo s los botones que quieras y listo la configuración se guardara en Foxuser.dbf con tu proyecto.255.0).255))". luego selecciona la barra Print Preview (VISTA PRELIMINAR) y ahora haz click en Customize (PERSONALIZAR). "IIF( empledos. 31) + 32 && Devuelve 02/01/02 Otra forma ldAñoinicio = {^2002/01/01} ? ldAñoinicio + Val("32") . ? SYS(2023) + "\" + SYS(2015) && Genera archivos en el directorio Temp de Windows -------------------------------Cambiar dinámicamente propiedades de un Grid Muestra los datos de tu grid dependiendo una condición determinada y manipulando e l Fondo y color de las celdas. Ahora ve al menú VER. Bueno para realizar este truco te recomiendo cierres todo.SetAll("dynamicbackcolor".0. 12. RGB(255. l uego a ToolBars (Barra de herramientas). Dos formas diferente s ? date(2001.1 && Devuelve 02/01/02 ---------------------------Generar nombre de archivo de forma aleatoria Utiliza esta función de VFP si deseas crear archivos que no tengan el mismo nombre . Ahora la barra te aparecerá deshabi litada detrás de ventana de personalización. ------------------------------- .Sumar días a fechas Un buen truco si deseas sumarle días a una fecha determinada.Grid1. RGB(255. . Size = 20 .Font .ActiveSheet. 'Subject' . Utiliza un procedimiento llamado GenerarAleatorio al cual se le pasan el limite inferior y el limite superior de la generación de números Rand(-1) Create cursor Valaleatorios (rnd b(2)) For ix=1 to 1000 Insert into Valaleatorios values (round(GenerarAleatorio(2.T.Application") With oExcel. este truco te explica como hacerlo.Send('
[email protected]') && Archivo Adjunto y. 'tuemail@direccion. EndWith --------------------------------Generar números aleatorios y almacenarlos en tablas Este truco te genera una secuencia de números desde un limite inferior hasta un limite superior y los almacena en una tabla.com' . oExcel = CreateObject("Excel. y = CreateObject('cdonts.AttachFile('c:\datos\prueba.Name = "Times New Roman" . 'Texto me nsage') y=null -----------------------------------Formateando texto en Excel Automatización sencilla que te enseña como cambiar el formato de celdas de Excel des de VFP.0)) Endfor Locate Browse Function GenerarAleatorio lParameter nLowerLimit.Range("A1").8).com' . nUpperLimit DO CASE CASE nLowerLimit>nUpperLimit RETURN null CASE nLowerLimit=nUpperLimit RETURN nLowerLimit Otherwise Return rand()*(nUpperlimit-nLowerLimit)+nLowerLimit ENDCASE .newmail') y.Bold = .Envío de Email desde Windows NT Desde NT es muy fácil enviar email. .oImg.width = 640 _screen. Puedes omitir la pantalla de DOS con un truco anterior.jpg" _screen.oImg. -------------------------------------------Directorios especiales de Windows sin API Existen algunas formas sencillas y sin mucho código para conocer los directorios principales de Windows y son funciones propias de VFP. "image") _screen.visible = .T. _SCREEN.AddObject('oTime'. Esta truco te permite comprimir y descomprimir archivos fácilmente usando PKZIP. ?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. si estas comprimiendo en un Diskette y el espacio no es suficiente.oImg. 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.oImg. el carácter & te permite agregarle soporte de Spanning. _screen. Este es un buen truco para personalizar las aplicaciones.en fin.---------------------------------Comprimir fácilmente y profesionalmente con el PKZIP Uno de los temas de mayor consulta en mi correo. entonces el mismo te pedirá otro diskette. es decir en el _ screen se vea el logo de nuestro programa o de la empresa.height = 480 --------------------------------------Agregar Timer al _Screen Este uno de los trucos más solicitados a mi email.dbf Este truco te permite comprimir archivo de de forma fácil. _screen..addobject("oImg".picture = "c:\imagen.'TimerScreen') * Definicion de la Clase TimerScreen * Muestra un Reloj en un Wait Window .oImg.stretch = 1 _screen. Run PKZIP -a -& a:\nombrezip c:\programa\datos\*. 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. en este caso sólo recogerá tres parámetros Cuando ejecutes el programa debes pasar los parámetros de la siguiente manera. If inlist(nKeyCode. uParam3 El código anterior se encargara de recoger los parámetros pasados como argumentos de sde la línea de comandos. Primero debes agregar al prg principal en la primera línea PARAMETERS uParam1. 97. es decir.* Este se actualiza cada un segundo DEFINE CLASS TimerScreen AS Timer Interval= 1000 PROCEDURE Timer WAIT WINDOW (TIME()) nowait ENDPROC ENDDEFINE -------------------------------Pasar parámetros a Ejecutables En antiguos programas de MSDOS veíamos que a estos les pasábamos datos desde la línea de comandos.exe Para1 200 Para3 --------------------------------Ejecutar Protector de pantalla sin API Existen diferentes formas de ejecutar un protector de pantalla especifico. 65) nodefault keyboard "X" Eendif . bueno también es posible que un programa de VFP acepte parámetros pasados desde la línea de comandos. ten iendo en cuenta que todos son leídos por el ejecutable como tipo carácter. uParam2. si le pasas el número 80 el ejecutable lo leera como "80" de tipo carácter C:\programa. esta es de las más sencilla RUN /N nombreprotector. muchas veces deseamos colocarla anclada al resto de barras.frx preview nowait If wexist("Print Preview") move window 'Print Preview' to 10. Primero ejecutamos el reporte con la cláusula tradicional: Report Form nombrereporte.frx REPLACE fontface with "Verdana".10 mouse dblclick at 11. . fontstyle WITH 1 FOR objtype = 1 Con esto ponemos como predeterminado la fuente Verdana a 10 puntos y negrilla. fontsize WITH 10. Como sabemos un reporte no es más que una tabla donde se almacenan los objetos y las propiedades de estos que luego son invocados por el Dataenvironment. Para estos deberemos seguir utilizando la técnica de poner dentro del InputMask tantos 9 como dígitos. También tenemos que tener en cuenta que sólo es válida para caracteres y no para números. Esta propiedad anul a a InputMask. s i en fontstyle ponemos 0 tendremos letra normal. Tanto el EditBox como el TextBox incorporan la nueva propiedad MaxLength donde p odemos indicar el número máximo de caracteres que se pueden introducir.11 Endif ----------------------------------Cambiar propiedades de los reportes desde código Podemos manipular las propiedades de un formulario desde código.----------------------------------Limitar el numero de caracteres que puede introducir el usuario en un TextBox o EditBox Si queremos configurar el número máximo de caracteres que se pueden introducir en lo s Tetbox y Editbox. ------------------------------Anclar la Barra del Preview de Reportes Cuando ejecutamos un reporte y este muestra la barra de Preview. Bueno para cambiar las propiedades de los reportes desde código debemos abrir el reporte como una tabla: USE nombrereporte. Por ejemplo a la hora de querer re indexar cada tablas de la B. En el Evento Init( ) del formulario se devuelve . "aeiouAEIOU") -------------------------------------------Impedir que un formulario se cargue al ejecutarse En ocasiones se utiliza como remedio para prevenir que se ejecute múltiples veces un formulario. "áéíóúÁÉÍÓÚ". "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. y el formulario no se cargar a Método Init ( ) Return .F.---------------------------------Agregar datos de un cursor a una Tabla Este es un truco bastante importante y sencillo. D OPEN DATABASE c:\Ruta_Base_de_Datos. su aplicación 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.dbc cNomTablas = ADBOBJECT(infVector. sobre t odo al momento de realizar búsquedas dentro tablas lCadena = "El amor es el perdón más fácil" ? CHRTRAN(lCadena.F. ------------------------------------------------ . con este truco se muestra centrado en la pantalla. 11 ) && Lo Aplicamos a todos los objetos ENDWITH ------------------------------------Verificar si existe palabra en el Diccionario de Word Un truco bastante bueno a través del cual podemos verificar si ciertas cadena de caracteres están bien escrita.F.Borrar archivos fácilmente Una forma sencilla de borrar archivos sin complicaciones.Width/2 .bueno este te puede servir y muy fácil. FONT 'MS SANS SERIF'.CheckSpelling(cPalabra) && Si la palabra existe devuelve . .8 . ERASE *.Scalemode = 0 Wait Window cMensage At Int(_Screen.SetAll( 'MousePointer'.. cMensage = "Este es un ejemplo del mensaje" _Screen.Application") ? oWord. sino . -------------------------------------Wait Window centrado en la pantalla Por defecto el mensaje mostrado por Wait Window se muestra en la parte superior derecha de la pantalla. Ejemplo No 1 DEFINE WINDOW wAyuda .T.MousePointer = 11 && Establece el puntero al Reloj de arena . Les gustaran estos ejemplos.Len(cMensag e) / 2) -------------------------------------Ventana de Ayuda al estilo de Window Cuando creamos la ayuda de nuestra aplicación siempre queremos agregarle ayuda personalizada. FROM 1.Height/2).1 TO 5. Int(_Screen. WITH ThisForm . cPalabra = "pureta" && Donde quería decir puerta oWord = CreateObject("Word.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 aplicación y cuando creas que un proceso podría tardar un poco entonces colocarías esta rutina para hacer entender que la aplicación se encuen tra ocupada.35 . entre otros aGetFileVersion(aVers.exe") ? aVers(2) ? aVers(3) ? aVers(4) ? aVers(5) ----------------------------------------- .255.8 . =AFONT(gaFontArray) && Matriz que contiene nombres de fuentes gnNumFonts = ALEN(gaFontArray) && Número de fuentes IF gnNumFonts > 25 gnNumFonts = 25 ENDIF && Muestra las 25 primeras fuentes FOR nCount = 1 TO gnNumFonts ? ALLTRIM(gaFontArray(nCount)) && Muestra nombre de fuente ?? ' Esto es un ejemplo de ' .35 . STYLE 'BN' COLOR RGB(255.1 TO 3.255. + ALLTRIM(gaFontArray(nCount)) FONT gaFontArray(nCount). tales como versión. FONT 'MS SANS SERIF'. compañía desarrolladora. FROM 1.0.0. Long dwMilliseconds DEFINE WINDOW wAyuda . nombre interno . "f:\WINDOWS\EXPLORER.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" . 8 ENDFOR -------------------------------------Mostrar información de ejecutables Puedes mostrar la información de los ejecutables.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. solamente a lo que él recibe el enfoque. Primero veamos como puedo exportar un reporte a extensión . más fácil o más cómodo.ExportOptions. simplemente es otra forma de hacerlo y tiene muchas ventajas.DestinationType = 1 && Tipo de Destino a guardar oRepx.Formato de Fecha larga Podemos mostrar de forma sencilla la fecha en formato largo.application") oRepx = oCristalReport. lnSegundos nsegundos = 180 && Numero de segundo a convertir lnHoras = INT(nSegundos/3600) lnMinutos = INT(((nSegundos-(lnHoras * 3600))/60)) lnSegundos = MOD(nSegundos.) && No muestra ningun cuadro de Dialogo .TRANSFORM(lnHoras. 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 número determinado de segundo es Horas.RPT") oRepx. ----------------------------------Cristal Report y VFP Uno de los grandes problemas de VFP son los reportes.60) ? IiF(lnHoras<100. pero podemos realizar los reportes en Cristal Report y luego llamarlos desde VFP.F.doc" oRepx."@L 99") ----------------------------------Desplegar un ComboBox al recibir el Enfoque II En ocasiones queremos conocer el contenido de un ComboBoX sin hacer click en él. TRANSFORM(lnSegundos. lnMinutos.crpe. TRANSFORM(lnMinutos.ExportOptions.OpenReport("C:\reporteventas. No quiero decir con esto que sea mejor."@L 99")+":"+ ."@L 99"). Esta es la forma más fácil de hacerlo.TRANSFORM(lnHoras. En los ejemplos que demuestro estoy utilizando la versión 8 del Cristal Report de Seagate pero considero que se debe comportar igual con las demás versiones.ExportOptions. minutos y segundos LOCAL lnHoras.FormatType = 14 && Formato de Word oRepx. KEYBOARD '{F4}' En este caso agregamos este código al evento GOTFOCUS( ) y cuando el Combo reciba el enfoque entonces este se desplegara mostrando la información contenidas en él.DiskFileName = "c:\reporteventasdelmes."@L 9999")) +":"+ .Export(.DOC (Word) oCristalReport = createobject("crystal. 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.OpenReport("C:\reporteventas. ?SYS(2020) ?SYS(2023) ?SYS(2022) ?SYS(5) ?SYS(17) ?SYS(2006) Nos devuelve el Tamaño del disco Directorio de archivos temporales Sectores por cluster Unidad de disco por defecto Tipo de Procesador Clase de tarjeta de video Existen muchas funciones más pero considero que estas son las que más ayudan si te gusta interactuar con el Sistema Operativo. Bueno las funciones SYS( ) nos prestan esta utilida d.F.RPT") oRep.Printout(.crpe. Con esta pequeña explicación y ejemplo lo harás.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.Preview Para mandarlo a imprimir oCristalreport = createobject("crystal. ---------------------------------Conocer si un formulario esta ejecutado Cuando estamos trabando en una aplicación la mayoría de veces queremos evitar que un formulario se ejecute más de una vez.F.RPT") oRep. IF WEXIST('nombreventana') . Después de él indicamos la pagina de ini cio y final del reporte a imprimir.OpenReport("C:\reporteventas.) && .crpe.application") oRep = oCristalreport.application") oRep = oCristalreport. Supongamos que tenemos un reporte de 20 paginas.release oRepx release oCristalReport Los otros formatos en que podemos guardar los reportes son: Extensión RTF EXCEL 7 EXCEL 8 27 o 28 29 o 30 FormatType 4 Para ver en vista previa un reporte: oCristalreport = createobject("crystal. yo puedo mandar a imprimir de l a pagina 10 a la 15 de la siguiente manera REPORT FORM nombreinforme RANGE 10. 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. oWord = createobject("word. si no lo esta.=messagebox("la ventana ya esta ejecutada") ELSE =DO FORM nombreform. Para probarlos puede ejecutar varios formularios. Tenemos que tener en cuenta que el nombre del la ventana es el que le colocas en la propiedad NAME del Formulario. El ejemplo cambia el ancho de los formularios ejecutados. 3) Obtiene la impresora Predeterminada de Visual Fox Pro ?Set("Printer". En este ejemplo determinamos si se encuentra instalado Word en el equipo pero puede ser cualquier otra aplicación. 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". .T. presento un procedimiento fácil para hallarla. 2) ---------------------------------------Determinar si una aplicación esta instalada Cuantas veces no hemos querido saber si ya esta instalado Word. Excel u otra apl icación en el equipo. 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 años que tiene una persona.0) ? edad En el ejemplo la fecha de nacimiento es 23 octubre de 1978. En este caso el código debe ir en el botón o menú que llame a la ventana.F.scx ENDIF WEXIST te devuelve .25). si la ventana se encuentra ya ejecutada y .fechanaci) / 365. Acepto sugerencia y modificaciones fechanaci = {^1978/10/23} edad = ROUND(((DATE() . 0) BarraAzul . manipulando adec uadamente las propiedades de estos.Width + 200 EndFor -----------------------------Cambiar la hora del Sistema Fácilmente 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 presentación atractiva a nuestras aplicaciones o queremos resaltar algunos aspectos importantes de los objetos.Forms Form.RGB(150.150.For each Form in Application. Así como lo muestra la siguiente figura: Para esto en el evento Init del Combo Box colocamos el siguiente código: #DEFINE #DEFINE #DEFINE #DEFINE BarraRoja .0) BarraVerde .255.Emergente RowSource = Colores .RGB(255.0) DEFINE POPUP Colores DEFINE BAR 1 of Colores .Width = Form.RGB(0. Prompt "Rojo" COLOR BarraRoja DEFINE BAR 2 of Colores . Prompt "Amarillo" COLOR BarraAmarillo Cambie las siguientes propiedades de Combo Box RowSourceType = 9 . En verdad algunos efectos especiales como el que mostrare cambian la dinámica de los objetos y contribuyen a darle más vistosidad.RGB(0. Prompt "Verde" COLOR BarraVerde DEFINE BAR 3 of Colores . Prompt "Azul" COLOR BarraAzul DEFINE BAR 4 of Colores . En este ejemplo haré que un Combo Box muestre sus valores en distintos colore s de letra.255) BarraAmarillo .0.0. Y en el evento InteractiveChange del Combo agregué el siguiente código: CASE This.Top + 2 MOUSE CLICK AT tFila. nCnt. .F.0.4 tFila = THISFORM.Forecolor = CASE This.F.0.T.F.Value = "Red" This.Width . Al hacer click en el botón debe desplegarse automáticamente el Combo.Name) . -------------------------------------Desplegar el Contenido de un Combo En realidad muchas veces deseamos hacer esto.Value = "Yellow" This. .Forecolor = ENDCASE Espero las allá gustado este ejemplo DO CASE RGB(150.Combo1.Value = "Green" This. 1)) ENDFOR El resultado debe ser el siguiente: . tColumna PIXELS WINDOW (THISFORM.Combo1.150.T.0) RGB(0. Programa lo siguiente en el evento Gotfocus del Combo tColumna = THISFORM.T. . .T. .Left + THISFORM.0) RGB(0.Forecolor = CASE This.T.Value = "Blue" This. .F. .Forecolor = CASE This. pero lo pensamos bastante y no encontramos la forma de hacerlo.0) ----------------------------------------Evaluar Números 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.Combo1.255) RGB(255. . Crea un formulario y agrégale un Combo y un Botón. Por fin aquí esta su implementación.255. Width + 200 EndFor -----------------------------------Utilizar el MsComm Para este ejemplo es necesario crear un formulario y agregarle un control active MsComm.Forms Form.olecontrol1. nCnt. A continuación un pequeño de como hacer lo cCadena = "512 96 m sd 7ecbx */ t553rdv" cAnchoCadena = len(cCadena) cNumeros = "" FOR nCnt = 1 TO cAnchoCadena cCharacter = SUBSTR(cCadena.1" && (Supongo el modem conectado al com4) thisform.combo1.PORTOPEN = .Setfocus() -------------------------------Manipular Todos los Controles del Formulario Activo Primero hacemos un ciclo hasta el numero de controles del formulario activo. Este ejemplo llamara al número de teléfono pasado en la propiedad OUTPUT.N.8. For nNumero = 1 to _Screen. y creamos un botón. 1) .olecontrol1. thisform.Name EndFor -------------------------------------------Manipular Formularios en el _Screen Esta es solo una forma de acceder a los formularios contenidos en el _Screen.En el evento Click del botón que creaste llama al evento Setfocus() del combo.COMMPORT = 4 thisform. Así: Thisform.olecontrol1. El ejemplo cambia el ancho de los formularios ejecutados.OUTPUT = "ATDT6608196" +chr(13) La secuencia de números después de ATDT es el numero telefónico al que queremos marcar --------------------------------------------------Evaluar Numeros y Caracteres Algunas veces necesitas evaluar una expresión o una cadena de texto y determinar l os valores numéricos o caracteres que tiene esta.Activeform.Activeform. For each Form in Application. Pero puede ser implementada según utilidades y usos.SETTINGS="9800.olecontrol1.T. Para probarlos puede ejecutar varios formularios. &&thisform. en este caso se mostraran el nombre de todos los controles del formulario.Controls(nNumero).Controlcount ? _Screen.Width = Form. MDown = . Utilizamos una variable donde almacenaremos los caracteres que sean dígitos (de 0 .ENDFOR IF ISDIGIT(cCharacter) cNumeros = cNumeros + cCharacter ? cNumeros ENDIF El primer paso es tener la cadena de caracteres a evaluar. Hacemos un ciclo hasta el numero de ca racteres de la cadena y vamos evaluando numero por numero.Top + nYCoord . pero pueden proveni r de cualquier origen de datos. -----------------------------Mover un formulario sin agarranlo por la barra de titulo Para realizar este ejemplo agreguémosle al formulario las propiedades ejex.T. 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. Luego determinamos el ancho de la cadena a través de la función LEN.ejey = nYCoord ----------------------------------------Busqueda en ListBox desde TextBox (Al estilo de la Ayudas) Los valores del ListBox provienen de una tabla en este caso.ejex ThisForm ...Value Thisform.ejex = nXCoord Thisform.List1.F. En el evento MouseMove del form agregamos lo siguiente With thisform If thisform.MDown = . Thisform. si el carácter es digito entonce s será agregado a la variable cNumeros.ListIndex = nIndex EXIT ENDIF . ejey.List1.Left = ThisForm .9).ListCount ) ) IF UPPER( Thisform. En el evento MouseDown del form agregamos lo siguiente Thisform. mdown.Left + nXCoord .ejey EndIf EndWith En el evento MouseDown del form agregamos lo siguiente ThisForm.List1.ListItem(nIndex) ) = UPPER( ALLTRIM( this.Top = ThisForm .MDown Then ThisForm . 1.Command1. Aplicaciones Bases de Datos Controles Direcciones Fechas y tiempo Ficheros es invocando una función API el parámetro al programa RUN la ventana del DOS.value)) * 5 Thisform. . . En el Evento InteractiveChange del TextBox programe lo siguiente: cNoCaracteres = len(alltrim(thisform. lo programe porque necesit aba que el ancho del botón se ajustara a medida que yo escribiera en un TextBox.List1. Sys(0))-1) Run PING &X > &F Y = FileToStr(F) Delete File &F U = At("[". . . luego obtiene el directorio de archivo temporales y genera un archivo único.K-U) Lo primero que realiza este código es definir algunas variables.text1.Command1. A continuación se obtiene información sobre la unidad de red y estas valores se le pasan como parámetr o al programa PING.Width = cNoCaracteres + 70 Thisform. At(" ".Caption = Alltrim(Thisform. X.Text1. Y) ? SubStr(Y. Y. pero comentare otra forma de hacerlo y es pasándole del DOS. .U. K F = Sys(2023) + "\" + SubStr(Sys(2015).ENDFOR Thisform.txt" X = SubStr(sys(0). Si alguien desea aportar y modificar el código le ruego me envíe una demostración para luego publicarla a su nombre.Command1. -----------------------------------.Refresh ----------------------------------------Ancho del Botón Ajustado al Texto Escrito en un TextBox Este código aun esta en prueba pero realmente funciona.Value) -------------------------------------------Determinar la Dirección IP del Equipo Una forma de conocer la dirección IP del equipo .1. sección de APIS . Y) + 1 K = At("]".8) + ". el único inconveniente es que se mostrara pero eso también tiene solución y será explicada en la Local F. Cree un formulario y agréguele un botón y un TextBox. U.Width = cNoCaracteres + 60 Thisform. Formularios Gráficos Impresora Informes Internet Ms Agents Pantalla Redes SQL Tablas Varios Vistas y Consultas Aplicaciones Abrir fichero con el programa asociado Agrerar línea a un . . Limitar en VFP Modificar clases base Número de versión Pasar parámetros a un ejecutable Programa DOS. . Conveniencia ODBC. Ejecutar desde VFP Tamaño del ejecutable. . Ejecutar Programar el objeto _screen Saber los usuarios que están usando la Aplicación Saber si finalizó un programa Salvapantallas. .EXE o proyecto Directorio de Windows. 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. Documentación ODBC. . . Crear conexión Direcciones ADO en VFP Chat en VFP . . Reducir Variable pública Word. . Obtener Evitar que un programa activado desde VFP se cargue más de una vez FileSystemObject Formularios abiertos Grupo de programas.. . . .exe Cierre automático si no hay actividad Compartir proyecto Conectar/Desconectar a unidad de red Detectar si se está ejecutando . Automatización Bases de Datos ADO en VFP Bases de Datos de Access Bases de Datos en aplicaciones multiusuario Cambiar la localización de la Base de Datos Cambiar la localización de la Base de Datos (1) Cambiar la localización de la Base de Datos (2) Conectarse con Access desde VFP Conexión MySQL Crear origen de datos ODBC 32 por programa Direccionar ruta BD Limpiar una Base de Datos MSDE. Curso de ASP Dialer para llamada telefónica E-Mail en VFP Empaquetar información para transmitir por modem FileSystemObject FoxPress FrameWorks Garbage Collection Instalador Inno Setup Librería FastLib Manuales Mensajes anteriores MsAgent MySql Normalizacion Portal de programación 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.ocx Grid. Añadir valores Comprobar si un control está registrado Contar los controles de un formulario Desinstalar OCX Enviar al fondo Gif animado. Tani. Saber botón presionado TreeView. Marcar toda la línea actual Grid. Mantener las propiedades Grid. Cambiar colores Grid. Imprimir RTF RTF. Columna desactivada Grid. Ordenar columnas MP3 en VFP Otro control en columna de Grid PageFrame y TabStrip RichText. Versión Ultimo enfoque Windows Script Host Fechas y tiempo Calcular el primer día del mes Calcular el último día del mes Calcular la diferencia de dos fechas en años. Abrir lista Combobox. Eliminar un control añadido Grid. Borrar nodos TreeView. Búsqueda incremental Grid. meses y días Calcular la edad . Impresión TreeView. Recorrer TreeView. Enviar parámetros .OCX similar a Paint Impresora Cambiar la Impresora por defecto Cómo 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 tamaño personalizado Puertos Redireccionar impresion Informes 2 tamaños para un report 3 informes en uno Anclar la barra del preview Centrar verticalmente un report Cómo abrir un Report con un Zoom determinado Cómo exportar los Report a HTML Cómo incluir la Barra de Herramientas del diseñador de Reports en tiempo de ejecución Cómo quitar el botón de imprimir de los Preview de los Report en los ejecutables Contador de hojas Crystal Report. Tipos de gráfico .) 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 .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 número de día del año Primer dia del mes de un dia de la semana (primer viernes de Agosto.. etc. líneas..INI Formularios Copiar el DataEnvironment a otro formulario Devolver más de un valor desde un formulario Formulario ovalado Formulario redondo Formulario transparente Handle de un form Imprimir un formulario Matriz a un formulario como parámetro Mover una ventana sin título Objetos de un formulario ThisForm como parámetro Gráficos Dibujar cuadro. Cambiar datos Cristal Report. Dimensión de una imagen MsGraph. NULL. Agregar registros a Libreta de direcciones Pantalla Cantidad de colores Capturar la pantalla Colores.Crystal Report.T. Informes Enviar un informe por e-mail Fuente predeterminada Imprimir con formato de Excel Imprimir texto DOS desde VFP Informe con número total de páginas (Hoja x de y) Informe en Word Informe en HTML Informes en miniatura Impresoras matriciales Interrumpir impresión Imprimir varias copias de un informe Maximizar venta de print preview Número de copias de un Report Número total de páginas Preview de Report con seleccionar impresora Quitar barra de herramientas Tamaño de Report Personalizado Títulos de los Report Truco para el preview de los reports Internet Conexión a archivo Descargar archivos Dirección URL. Llamar a una Enviar/Recibir mensajes con Outlook Express Outlook Express. Calcular Ocultar/Mostrar la barra de tareas de Windows Resolución en pantalla Redes Dominio. Conocer Hora del servidor SQL Buscar palabra en tabla Valores . Libreta de direcciones Outlook Express. Tablas Actualizar datos que no existen en otra tabla Append from desde una vista Busca un campo en una tabla y retorna . 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 posición Pasar datos de un cursor a una tabla Renombrar campo de una tabla Reparación de encabezado (Tabla) Tablas que pertenecen a una DBC Título del campo Transacción 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 página Web . Ejecución Poder hacer un SEEK o INDEXSEEK a cualquier vista Nivel de optimización de consultas Velocidad del select Vistas.C. Listar Ejecutar un sonido Encriptación de cadenas Enviar un email por Outlook Fax. Envio desde VFP Formatear un diskette Formatear un diskette (1) Función de consecutivos Función para quitar acentos Funciones matemáticas Marcador telefónico Número de serie del disco Números a letras Números a letras (1) Pasar un número de color a formato RGB Prototipos al vuelo Tamaño del disco Uso de la coma como separador decimal Validación CIF Vistas y Consultas Consultas. Como cambiar el criterio Vistas.C. Dígito de control Copiar al portapapeles Copiar.C. Como cambiar el formato de campos Vistas actualizables Vistas parametrizadas que contengan el contenido de un campo Vistas parametrizadas en una cuadrícula . cortar y pegar Conectar a Internet Drivers. -Luis María Guayán Tucumán . Atentamente. pero por lo demas funciona. <mailto:
[email protected]) con otro nombre y que cada uno de vostros abra un pro yecto distinto. Compartir proyecto Lo lógico y correcto seria usar la herramienta prevista para ello. Espero te sirva de ayuda.com> Conectar/Desconectar a unidad de red Con estas funciones.exe Cierre automático si no hay actividad Tal vez te sea util usar el control TIMER y la funcion Lastkey().L. S.PJT y . Agregar línea a un . Viene en la versión empresarial de Visual Studio y creo que también se vende como producto independien te.DOC No olvidarse start. 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. Evidentemente. lo que no podreis hac er es abrir los dos usuarios el mismo form o report o prg. puedes conectarse / desconectarse de una unidad de red. y como solución "CHAPUZA" (pero que yo la uso y funciona) consist e en hacer una copia de los archivos del projecto (.Aplicaciones Abrir fichero con el programa asociado Ejecutar el documento directamente con la sentencia RUN: run /n start MiCarta.Argentina *-------------------------------------------------------* FUNCTION GetConnection(lcDrive) *-------------------------------------------------------- . Asi no da el error de que el archivo ya esta abierto. Pere Pujol i Espuña ADS Anàlisi/Disseny de Soft. Hay que tener cuidado con eso.exe Generá un nuevo proyecto en Visual Fox Pro Vas a la ventana de código y agregás: Set Century On SET century to 19 ROLLOVER 85 Do programa. el SourceSafe c reo que se llama de micro$oft. De todas formas. STRING @lpRemoteName. . . @tcDrive) ENDIF IF lnRet # 0 RETURN "Error " + ALLT(STR(lnRet)) + .AT(CHR(0).@nLength) lcRet = LEFT(cRemoteName. STRING @lpzLocalName.0.tcResource. " 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.@tcDrive) ELSE lnRet = WNetAddConnection(@tcResource.* Retorna el nombre de la PC y recurso * compartido de una conexión de red * PARAMETROS: lcDrive * USO: ? GetConnection("K:") *-------------------------------------------------------FUNCTION GetConnection(lcDrive) DECLARE INTEGER WNetGetConnection IN WIN32API . llRet cRemoteName=SPACE(100) nLength = 100 llRet = WNetGetConnection(lcDrive. 0) IF lnRet # 0 RETURN "Error " + ALLT(STR(lnRet)) + . ."\\PC_REMOTA\RECURSO <file://\\PC_REMOTA\RECURSO>") *-------------------------------------------------------FUNCTION AddConnection(tcDrive. STRING @lpzPassword. " al desconectar el drive " + tcDrive ENDIF RETURN "" ENDFUNC . STRING @lpzLocalName IF PARAMETERS() < 3 lnRet = WNetAddConnection(@tcResource.cRemoteName)-1) RETURN lcRet ENDFUNC *-------------------------------------------------------* FUNCTION AddConnection(tcDrive. INTEGER @lpnLength LOCAL cRemoteName. nLength. . STRING lpLocalName. lcRet.tcPassword) *-------------------------------------------------------* Conecta un recurso compartido a la unidad tcDrive * USO: ? AddConnection("Z:". INTEGER nForce lnRet = WNetCancelConnection( @tcDrive. STRING @
[email protected]) LOCAL lnRet DECLARE INTEGER WNetAddConnection IN WIN32API.tcResource.@cRemoteName. STRING cNULL. se cargarás la calcuadora una y otra vez.9) * LA PONEMOS ENCIMA SetForegroundWindow(nHWD) && Ejecutable && Proyecto . Un ejemplo sencillo es el de la calculadora de Windows.*-------------------------------------------------------Detectar si se está ejecutando .EXE o proyecto Version(2) = 0 Version(2) = 2 Directorio de Windows. INTEGER nState nHWD = FindWindow(0. INTEGER nHandle DECLARE SetActiveWindow IN WIN32API . . STRING cWinName DECLARE SetForegroundWindow IN WIN32API . INTEGER nHandle DECLARE ShowWindow IN WIN32API . Pondríamos una línea come esta: RUN /N CALC.EXE Pero si esta línea la ejecutamos más de una vez. Evitar que un programa activado desde VFP se cargue más de una vez La misma función que hemos visto en el caso anterior puede ser usada para evitar q ue un programa externo se cargue mós de una vez. Imaginemos que en nuestra aplicación demos la posibilidad de utilizar la calculado ra.EXE ENDIF * Y ESTA ES LA FUNCION QUE LO HACE TODO: *----------------------------FUNCTION F_ActivaWin(cCaption) *----------------------------LOCAL nHWD DECLARE INTEGER FindWindow IN WIN32API . cCaption) IF nHWD > 0 * VENTANA YA ACTIVA * LA "LLAMAMOS": ShowWindow(nHWD. * Antes de activar la calculadora: IF NOT F_ActivaWin("Calculadora") * La calculadora no está cargada: RUN /N CALC. . Obtener ¿ GETENV('WINDIR'). INTEGER nHandle. htm> Formularios abiertos ****borrar todos los formularios de la memoria.t.WINDOWTYPE = 1 *!* lDevolver = . Exit Endif Next Return lDevolver Grupo de programas. Axel Olivares Hacer desaparecer las barras de herramientas If WVisible( Estándar ) Hide Window Estándar EndIf Y así con todas las demás. este metodo devuelve .com/library/devprods/vs6/vbasic/vbenlr98/vaobjfilesystemo bject.T. Local lDevolver DoEvents lDevolver = . ELSE * VENTANA NO ACTIVA RETURN . me envio esto. espero te sirva: En el paso 6 del asistente de instalación. si no quedo ningun form corriendo. en caso de error o que no se hayan cerrado todos los formularios abiertos.release() *. y .* LA ACTIVAMOS SetActiveWindow(nHWD) RETURN . ENDIF FileSystemObject <http://msdn. no olvides el %s).F.mis forms base tienen un metodo SALIR.F.T.F. Entonces deberá de salir una pantalla en la que deb es especificar una descripción de tu aplicación y en la casilla línea de comando colocas: %s\aplicacion. lDevolver = .Salir() && o .exe (Logicamente aquí pones el nombre real de tu programa. Crear Un gran colaborador de este grupo de noticias.FORMS *!* If oformsAbiertos. *!* Exit *!* Endif If !oformsAbiertos..f. buscas el ejecutable de tu aplicación y c lick en la casilla que pone "administrador del programa". .. For EACH oformsAbiertos IN APPLICATION.microsoft. Identificar las unidades Ariel: Quizás con esto puedas "ir tirando" hasta conseguir lo que buscas *-----------------------------------------------------FUNCTION ListDrives() LOCAL ln.FileSystemObject') For Each oDrive in oFso.DriveLetter EndFor declare laDiscos[6] laDiscos[1] = "Desconocido" laDiscos[2] = "Removible" laDiscos[3] = "Partición Local" laDiscos[4] = "Compartido LAN" laDiscos[5] = "CD-ROM" laDiscos[6] = "RAM Disk" For Each oDrive in oFso. USA -------------------------------------------Incluir rutinas de VB en VFP Compilala como un componente COM y listo. Distribuyes el dll junto con tu aplica . FL.Drives ? oDrive.Argentina ó Puedes usar el File System Object: oFSO = CREATEOBJECT('Scripting.MCP Miami.Ningún 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 María Guayán Tucumán .DriveLetter + ":\" + SPACE(4) + laDiscos(n+1) EndFor -Alex Feldstein . lnTipo FOR ln = 65 TO 92 lnTipo = DRIVETYPE(CHR(ln)) DO CASE CASE lnTipo = 1 *--.Drives n = oDrive.DriveType ? oDrive. visible = .oImg. _screen..addobject("oImg".) *Se hacen cosas despues de ejecutar Pasando .stretch = 1 _screen. Excel. Logo en pantalla principal Efectivamente como dice Alex.oImg. en el tercer parámetro del método RUN fuerza a VFP esperar hasta que el EXE llamado termine.oImg. LOCAL loWshShell * Se hace cosas antes de ejecutar loWshShell = CreateObject("WScript. Word. Y segun c uentan se deberia probar mas o menos al tercio de lo que te informa la primera vez.. Lanzar un programa y esperar a que termine Usando Windows Scripting Host. @ .Argentina Memoria. Si no quieres usar _screen.T. Limitar en VFP Debes chequear la funcion SYS(3050). SAY es conveniente no usarlo. "image") _screen. Pero la recomendacion es que seteas tu necesidad o vayas bajando de a un k para ir probando la performance. Asi la puedes llamar desde VFP.Shell") loWshShell.jpg" puedes controlar el tamaño y la posición con: _screen. etc.. Con esta funcion puedes setear tanto en foreground como en background. Ademas de lograr un mejor control de memoria. y en consecuencia el uso es 'indiscriminado'.jpg" _screen. Claudio Campos Modificar clases base En tools->options->field mapping y ahí podes especificar que classes debe usar VFP para cada tipo Hugo . 1.oImg. resulta que VFP usa la memoria virtual de w indows. . tendras un mejor aprovechamiento q ue redundara en mayor velocidad de ejecucion. por lo tanto esta usando mas ram de la que posee fisicamente.T.cion.Run(<path de exe>.picture = "d:\consulta\dv.oImg..t.width = 640 _screen.image = "d:\MiArchivo.height = 400 -Luis María Guayán Tucumán . SW_SHOW_NORMAL. Por ejemplo _screen.prg') * SC. nYCoord) wait window 'Mouse down at: '+alltrim(str(nXCoord))+'.Run("notepad. #define SW_SHOW_NORMAL 1 #define SW_SHOW_MINIMIZED 2 #define SW_SHOW_MAXIMIZED 3 oShell = createobject("WScript. nShift. pasando un parámetro . en una clase tuya agregá un puntero a _screen."C:\Exe\MiApp. uParam2.exe PARAMETRO1 1245 OTRO Recuerda que todos los parametros pasan al ejecutable como del tipo caracter.Argentina Programa DOS. USA -------------------------------------------Programar el objeto _screen No se pueden programar directamente. pa ra que corra en forma sincrónnica (o sea que espere). nXCoord.Argentina Pasar parámetros a un ejecutable En el prg principal debes tener en la primera línea: PARAMETERS uParam1. 'sc. Ejecutar Corre el programa en DOS desde Windows Scripting Host.T.mousedown(nButton.PRG define class ScreenController as custom oScreen = _screen function oScreen.Número de versión ln = AGETFILEVERSION(laArray. 'ScreenController'.MCP Miami.T. uParam3 Cuando ejecutes tu programa le debes pasar los parametros de la siguiente manera : C:\Aplicaciones\MiPrg.exe") DISP MEMO LIKE laArray ó FOR lnI = 1 to ln ? laArray(lnI) ENDFOR Luis María Guayán Tucumán .exe". pero un truco que se puede usar es. luego puedes reprogramar los métodos del mismo. FL.newobject('sc'. Luis María Guayán Tucumán .Shell") oShell.) -Alex Feldstein .. .resize wait window 'Cambiando el tamaño de la ventana principal' nowait endfunc function oScreen. es que al salir de la aplicación "de forma incorrecta. 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 están usando la Aplicación Te contaré como controlo yo este tema de los usuarios en aplicaciones en red. "loquesea". usuario a la vez que desbloquea el registro. quizás te pueda servir.not.Hora with "". Fecha. "loquesea". hora. usuario l os respectivos valores SET REPROCESS TO 1 IF . arranca la aplicación lo primero que hace es buscar en dicha tab la su sys(0) SELE "loquesea" LOCATE FOR sys(0) $ "loquesea". p or error.'+alltrim(str(nYCoord)) dodefault(nButton. calle) QUIT ENDIF si lo encuentra. los que borro si sa le como es debido.Usuario with m. BLOQUEA EL REGISTRO Y pone en los campos fecha. Usuario En esta tabla. hora. Hora. el proceso agrega un registro a dicha tabla y deja en el campo "Puesto" el valor de sys(0) que devuelve como ya sabrás (la máqui na de red cuando se utiliza VFP en un entorno de red. "loquesea".. lo mantengo hasta que salga de la aplicación como se debe salir y en tonces deja en blanco los campos fecha. usuario. al configurar el puesto de red para que pueda operar con la aplic ación. REPLACE "loquesea".) Cuando una máquina.Hora with time(). es señal de que ya tiene ab ierta la aplicación y seguramente la tiene minimizada por lo que puedes procedo a levantarsela y no seguir en esta nueva a .user SET REPROCESS TO "lo que uses habitualmente" Este bloqueo..Usuario with "" unlock La ventaj que esto tiene. nXCoord. IF eof() && no se encontró ***(mensaje de: terminal no autorizado y a la P. fecha y hora.Fecha WITH {" "}.. Si al entrar en la aplicación.Fecha WITH date(). el registro está bloqueado.puesto *** y si no lo encuentra está claro que no se le permite seguir . nShift. nYCoord) endfunc enddefine Pero no logré que funcione queryunload. apagon etc" se desbloquea el registro si bien quedan anotados los datos del puesto. "loquesea". Añado una tabla adicional con los siguientes campos: Puesto. lock() && ya esta bloqueado la aplicación esta arrancada en este puesto quit && salida ENDIF REPLACE "loquesea". 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. Change this to suit your preferences. acabarán por mostrarte que puestos tienen problemas. . SET REPROCESS TO 1 SELE "loquesea" GO TOP m.. no esta bloqueado el registro pero resulta que se e ncuentra los valores de fecha. INTEGER lpApplicationName.) ¡ No te puedes hacer idea.tal usuario. que ¿que es lo que quieren que hagas ?. .. WaitForSingleObject() * waits before it times out...contador=0 DO WHIL .pertura. posible pe rdida de datos .contador+IIF(lock().0. en tal caso procedo a lanzarle un mensaje de SEVERO Y PELIGROSO AVISO ( . Si al entrar en la aplicación. "es la XXXX vez que se apaga de forma ilegal" operación muy peligrosa. En cualquier caso. hora. esta conectado.avise al servicio tecnico. INTEGER lpProcessAttributes. in milli secconds.not. bien sea de operador o de máquina o quizás de windows.contador=m. #DEFINE WAIT_TIMEOUT 0x00000102 * This controls how long. INTEGER bInheritHandles. reinstalar nuevamente el windows en algunas máquinas suele ser el final d e muchos problemas. #DEFINE WAIT_INTERVAL 200 DECLARE INTEGER CreateProcess IN kernel32.1) unclock SKIP ENDD SET REPROCESS TO "lo que uses habitualmente" ? "Hay "+str(m. INTEGER lpThreadAttributes.DLL . entro en fecha y hora a la aplicación y no salio como debía. . de lo bien que queda uno cuando hay problemas y puedes mirar y decirles que ya se ha salido de la aplicación 23 veces de forma incorrecta. . .. Para saber si un terminal. merece la pena guardar estos incidentes ya que seguramente. o cuantos hay conectados solamente ha brá que repasar la tabla en cuestión y contar el numero de registro bloqueados.. no salido de forma correcta. es señal de que la vez anterior que entró. . te pueda servir de algo.contador)+" terminales conectados" Espero que todo lo anterior. eof() m. usuario. STRING lpCommandLine. IF RetCode = 0 =MESSAGEBOX("Error occurred. INTEGER hHandle. STRING @lpProcessInformation DECLARE INTEGER WaitForSingleObject IN kernel32. * or 4*4 bytes = 16 bytes. the VFP window never repaints until * the loop is exited. WAIT_INTERVAL) != WAIT_TIMEOUT EXIT ELSE DOEVENTS ENDIF ENDDO * Show a message box when we're done. 0. . * The remainder should be 0-filled start = long2str(68) + REPLICATE(CHR(0).DLL * STARTUPINFO is 68 bytes. . INTEGER hObject DECLARE INTEGER GetLastError IN kernel32. process_info = REPLICATE(CHR(0). which we'll fill with nulls. 64) * PROCESS_INFORMATION structure is 4 longs. RetCode = CreateProcess(0. INTEGER lpEnvironment. GetLastError()) RETURN ENDIF * Extract the process handle from the * PROCESS_INFORMATION structure. INTEGER dwMilliseconds DECLARE INTEGER CloseHandle IN kernel32. obtain a process handle.EXE" + CHR(0) * Call CreateProcess. Error code: ".T. 0. 4)) DO WHILE . 0. NORMAL_PRIORITY_CLASS. Important to pass the start and * process_info by reference. . * Use timeout of TIMEOUT_INTERVAL msec so the display * will be updated.INTEGER dwCreationFlags. IF WaitForSingleObject(hProcess. =MESSAGEBOX ("Process completed") * Close the process handle afterwards. accept * all other defaults. Treat the * application to run as the 'command line' argument. 1. . RetCode = CloseHandle(hProcess) . STRING @lpStartupInfo. Otherwise. INTEGER lpCurrentDirectory. File2Run. 16) * Start a copy of NOTEPAD (EXE name must be null-terminated) File2Run = "C:\WINNT\NOTEPAD. .DLL . @start. @process_info) * Unable to run. 1. 0.DLL . exit now. of which we need to * initially populate the 'cb' or Count of Bytes member * with the overall length of the structure. hProcess = str2long(SUBSTR(process_info. 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 María Guayán Tucumán - Argentina Tamaño del ejecutable. Reducir . Excluir los formularios . Excluir los reportes y las tablas. . No poner imágenes muy pesadas. Si estás 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' - 'Información del proyecto' - Quitar marca 'informar de depuración. . Limpiar bibliotecas de clases (vcx) Variable pública Se trata (habitualmente) de un objeto de clase base 'custom' con muchos métodos pe rsonales que vas a usar a lo largo de toda la aplicación y con propiedades que necesitas acceso rápido a ellas sin leer tablas. Típi co: codigo de usuario, pais, moneda, empresa, etc.... Metodos para calcular la letra del nif, los códigos de control de una cuenta, etc. Puedes aprovecharlo también 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 pública y se crea en el 'main' del proyecto public oApp oApp = createobject("miobjetoaplicacion", par1, par2, ...) Y en cualquier lugar de la aplicación puedes referirte a el oApp.datos(3) = m.nMidato m.nMidato2 = oApp.datos(5) etc... -Saludos, ----------------------------Carlos Yohn Zubiria A.G.P. Word. Automatización 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) Ó Fíjate en los documentos y ejemplos en Internet: Este artículo 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 encontraás un buen juego de ejemplos en: <http://fox.wikis.com/wc.dll?Wiki~UsingADO~WIN_COM_DNA> En tu ejemplo, te faltan los paréntesis en la función 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 través 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 . claro..opentables() . * en el programa principal o en la de conexion determinar el directorio actual * almacenarlo en variables globalos o del objeto aplicación. :-) 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 ación. estos formularios pueden apuntar al directorio donde se desarrollaron.dbc" Poner en el entorno de datos la propiedad AutoOpenTables = . Bases de Datos en aplicaciones multiusuario Tambien meto mi cuchara en esta sopa. Este mecanismo ya fué implementado en una aplicación masiva multiusuario y funciona de maravillas. 10) Se repiten los pasos 4.F."Cursor") * abrir las tablas thisform. podremos manejar la Base de Datos de Access desde Visual Foxpro. 8) Se selecciona la opción de "crear BD" para crear la base de datos vacia 9) Se sale del programa. solo para bases de datos VFP: cliente-servidor es otra cosa. El procedimiento es más o menos así: 1) Se ejecuta la utilidad GENDBC de VFP la cual genera un programa que "reconstr uye" la base de datos.gcDbPath+gcDbname.. 3) Generar los instaladores de la aplicación excluyendo la base de datos. Victor Cambiar la localización de la Base de Datos Los formularios almacenan el path de las tablas definidas en el Entorno de Datos . INI.dataenvironment. 4) Instalar la aplicación en una de las estaciones 5) Ejecutar la aplicación 6) La aplicación tratar de cargar la ruta a la base de datos desde un archivo de c onfiguración (DBF. el programa pregunta si se desea "conectar" a una ba se de datos existentes o desea crear una nueva. La opción de conectar lo que hace es mostrar el diálogo de selección de directorio par a que el usuario indique la ubicación de la base de datos.. solo que esta vez se selecciona la opción "Cone ctar con BD". gcAppPath = sys(2003) gcDBPath = alltrim(gcAppPath)+"\datos\" gcDBName = "mibasededatos.Mdb. la opción de crear la bas e de datos pide la ubicación de la misma y la genera utilizando el programa genera do por la utilidad GENDBC. MEM como prefieran) 7) Al no encontrar la ruta. Estos pat hs deben ser reseteados en tiempo de ejecución para asegurarnos que apuntan a las tablas correctas.SetAl l("Database". 2) Se incluye este programa en el proyecto de la aplicación.. 5 y 6. Por desgracia cuando se distribuye la aplicación. 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. versión 3. Si usted necesita referenciar una base de datos en un directorio diferente al que está especificado en la propie dad Database del Objeto Cursor. El ejemplo siguiente ofrece flexibilidad a su código. la propiedad Database (solo lectura en modo diseño) del cursor se establece con el path completo y el nombre del DBC. puede hacerlo usando el comando SET PATH. pero situad as en diferentes directorios. se crea un objeto cursor. MÁS INFORMACIÓN Cuando una tabla se añade al Entorno de datos por medio del Generador de Formulari os. Si la Base de datos especificada en la propiedad Database del cursor no se encuentra en el directori o también especificado por dicha propiedad. Saludos.DBC). que es d e lectura/Escritura.de/visualfox> (Portal Gratuito de VisualFoxPro en español) Cambiar la localización de la Base de Datos (1) ID Artículo: Fecha de Creación: Fecha de Revisión: E10117 22-nov-1996 19-APR-1997 La información en este artículo se refiere a: -Microsoft FoxPro. Sin embargo.*NOTA: esto funciona con tablas de una base de datos. Si la base de datos no se encuentra al abrir el Formulario. actualizando el path de la p .<base de datos>" El código de ejemplo de este artículo. cuando se añade una tabla al Entorno de datos. Si la tabla forma parte de un DBC. Por ejemplo. proporciona un método de modificar el PATH cont enido en la propiedad Database. Pablo Roca La Coruña . Otra alternativa es cambiar la propiedad Database en tiempo de ejecución. No se puede encontrar.España <http://pagina. En el Generador de Formularios. antes de que el programa llame al Formulario. este codigo debe ser modif icado si se usan tablas libres. El path que contiene la propiedad Database se establece como absoluto.0 RESUMEN En este artículo encontrará información de cómo cambiar en el Entorno de datos la locali zación de la Base de datos. indicando la nue va localización de la Base de datos. vistas. diferentes usuarios pueden abrir bases de datos con el mismo nombre. la propiedad Database del cursor se establece con el camino completo de directorios y el nombre de la Base de datos contenedor a (. puede que se necesite cambiar o modificar el path absoluto al DBC c uando se distribuya la aplicación. MÁS INFORMACIÓN El Entorno de datos contiene información sobre todas las tablas. Visual FoxPro seguirá buscando en todos los directorios indicados por SET PATH. aparecerá el siguiente error: "Error al crear instancia de objeto Cursor. y relacio nes que interactuan con un Formulario. oRef.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) .THISFORM. Data_Drive = "C:" -Data_Path.DATAENVIRONMENT. El comando WAIT WINDOW es solo ilustrativo. "Object")." +a_cursors(i.1)+".Data_Name)+1)) WAIT WINDOW NewDataPath * Evalúa el objeto cursor oRef = EVAL( "THISFORM. Introduzca el siguiente código en el evento BeforeOpenTables del DataEnvironment. Data_Path -Data_Drive.DATAENVIRONMENT. Contiene el nuevo PATH acabado en backslash. + A_Cursors(i. 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.PRG.dataenvironment. empezando * por la posición calculada en el paso anterior FOR I = nStartpos TO ALEN(A_cursors.class" * Si el elemento es un Cursor IF EVAL(cObjClass)="Cursor" cObjName="THISFORM." . si lo desea puede eliminarlo. Data_Path = "\DATOS\ALMACEN\ARTICULOS\" 2.ropiedad DATABASE de todos los objetos Cursor que hubiera en el Entorno de datos. Contiene la unidad y dos puntos.1)+". Solo se referencia un directorio en el ejemplo. así que necesitará modificar el código si quiere abrir Bases de datos de varios directorios. si llama al Formulario desde un. 2) * Busca el primer Objeto en la matriz y devuelve su posición nStartpos=ASUBSCRIPT(A_Cursors.1) * Recorre uno por uno los elementos de la matriz.1) * Ordena la matriz ascendentemente por la segunda columna =ASORT(A_Cursors. ASCAN(A_Cursors. RAT("\".2) = "Object" cObjClass = "THISFORM. Este código puede actualizar el path de difere ntes bases de datos referenciadas en el Entorno de datos. Por ejemplo. + ALLTRIM(SUBSTR(Data_Name. introduzca la siguiente declaración: PUBLIC Data_Drive.1) IF A_Cursors(i.DATAENVIRONMENT. Para usar este ejemplo: 1." +a_cursors(i.1) ) * Modifica la propiedad Database con el nuevo * path.Database = NewDataPath ENDIF ELSE EXIT ENDIF ENDFOR ENDIF Cambiar la localización de la Base de Datos (2) . Cree dos variables accesibles por el Formulario. BaseClass<>'Cursor' loop endif if not empty(vCursor.j.desde el mismo panel de control. a fín de que apunten al DBC actualmente seleccionado.tcDBC) * *-.2) with toDataEnvironment * for i=1 to j * vCursor=eval(". se cancela el método local lnNumParams lnNumParams=parameters() if lnNumParams=0 or type("toDataEnvironment")<>"O" return endif *-.Database) vCursor.mitrompo.Si no se indicaron parámetros o toDataEnvironment no es un objeto.Se actualiza la propiedad Database de todos los objetos Cursor del dataenvironment local i. La función que anexo al final del m ensaje actualiza la propiedad Database de todos los objetos Cursor definidos en un DataEnvironment. ******************************************** Victor Espina <http://www.vCursor local array laCursors[1] j=amembers(laCursors.toDataEnvironment."+laCursors[i]) if vCursor. con el cont .Database=tcDBC endif endfor endwith EndProc 7 Conectarse con Access desde VFP Tienes que crear un DSN de sistema . La llamada se hace desde el evento BeforeOpenTables del objeto DataEnvironment de la forma: SetCursorDBC(THIS.Quiero poner mi granito de arena en este tema.com/vespina> * SetCursorDBC * Establece la propiedad Database de todos los objetos Cursor que * contenga el dataenvironment indicado en la propiedad poDataEnvironment * Proc SetCursorDBC(toDataEnvironment.gcDBCPath) donde: gcDBCPath: nombre y ubicación del archivo DBC actual. a partir de la version creo que 3. .STMT=". Aunque MySql nacio para Linux es perfectamente utilizable en Windows."DISPLOGIN". i ncluyendo mejoras continuas.mysql.NombreCursoradevolverlosdatos) Espero que te sirva de algo Un saludo Oscar Fernandez Madrid-España Conexión MySQL Simplemente con una conexion ODBC que se puede conseguir en su pagina www. Con un servidor Lin ux vuela. Un saludo.. Solo una cosa mas. Nosotros tenemos dos servidores cada uno con las mismas bases de datos mysql.."SELECT * FROM . Ademas no hay limite en poner tantos servidores esclavos como se quiera.OPTION=25. de hecho nosotros la estamos utilizando con servidores NT. Nuestro miedo estaba en que cayera la velocidad de proc eso pero no lo ha hecho en absoluto. una vez instalado.mysql. una conexion con DNS y conectar con SQLCONNECT(< nombre del dns>) o hacerlo sin crear conexion con DNS.DRIVER={MySQL}.23.24). le das un nombre descriptivo y lo conectas a tu mdb.Ipdonde est a el servidor de mysql>. com <http://www. Basta crear.DSN='') a partir de aqui.23. ca da vez que modificamos un registro en el servidor maestro nos esta actualizando. automaticamente. el servidor esclavo .com> en el apartado download. de esta forma: sqlsetprop(0.SERVER=<Dir. Rafael Mateo Rivero Crear origen de datos ODBC 32 por programa .csql.rolador de Access. etc. en windows. y de cualquiera de las dos formas anteriores.".<nombredelcursor>). Y dentro de tu programa haces: nConexion=sqlconnect(NombredeconexionODBC) && Devuelve -1 si no hay conexion cSQL="select * from tabladeaccess" sqlexec(nConexion. muy rapido. myodbc. La velocidad de actualizacion de las versiones es muy alta.PORT=3306. Si necesitais mas ayuda quedo a vuestra disposicion.3) <variable> = sqlstringconnect("DB=<nombrebasedatosmysql>... tiene replicacion de bases de datos entre un maestro y n esclavos.PWD=. Vuelvo a insistir en que es un sistema muy estable y que nos esta dando unos res ultados fantasticos. Ademas.. UID=root.19 (ahora va por la 3. Ademas MySql es muy. teneis el numero de conexion en <variable> y "atacas" a mysql con ordenes del tipo: sqlexec(<variable>. Yo utilizo el botón de acceso directo de windows. Saludos. 0 Sql autentificacion "UseProcForPrepare=0" + CHR(0) ) IF lnResp = 0 MESSAGEBOX("No se pudo crear el ODBC". String @lpszDriver. "ERROR") llRt = . Angela.com/library/default. String @lpszAttributes # DEFINE ODBC_ADD_DSN 1 && Agrega un Data Source lnResp = SQLConfigDataSource( 0.com/fox/articles/article1.htm> fijate.F. Documentación MIcrosoft Data Engine (MSDE) es prácticamente lo mismo que SQL Server 6. && 1 significa NT autentificacion. Emiliano Direccionar ruta BD Hola Oscar.T. ODBC_ADD_DSN. "OK") llRt = .microsoft.Hola Edison. Un saludo. Dentro de la aplicación tengo un path al sys(5)+sys(2003) mas mi directo rio de datos. para quedar mas cla ro lo anterior. 48 .konstruct. "SQL Server".5 Entiendo qyue esta por salir una versión con el motor de SQL Server 7 Puedes usarlo con la limitaci. vale tanto si está todo en el mismo directorio como si están separados los ejecutab les de los datos. Con esto tengo los ejecuta bles en cada máquina y los datos compartidos en el servidor. te paso el codigo. Integer fRequest. Limpiar una Base de Datos USE MiDataBase. De esta forma no hay que cambiar nada. "Description=" + "bla bla bla bla" + CHR(0) + . "DSN=" + "Miodbc" + CHR(0) + . no se si se puede de otro modo. DECLARE Short SQLConfigDataSource IN ODBCCP32 Long hwndParent. . yo lo pude hacer mediante una Api. 48 . En el destino pongo la ruta donde está mi ejecutable y en "iniciar en" pongo el directorio compartido donde tengo los datos.htm . ENDIF PD: la información para hacer esto la saque de aca: <http://www.on de pocos usuarios y puedes migrar en forma transparente a SQL Server en el futuro.DBC EXCLUSIVE PACK DATABASE USE MSDE. espero te sirva. <http://msdn.asp?URL=/library/backgrnd/html/usi>ng msde. "Trusted_Connection=1" CHR(0) + . "Database=" + "Midb" + CHR(0) + . "Server=" + "servidor_mio" + CHR(0) + . ELSE * MESSAGEBOX("BIEEEEEEEEEN ". Conveniencia .MCP Miami. USA -------------------------------------------ODBC. FL.<http://msdn.com/library/default.microsoft.htm -Alex Feldstein .asp?URL=/library/backgrnd/html/msd>ef orvs. net <mailto:Xproca@clavo. Si tu quieres conectarte a BD VFP mediante ODB C. tu te referiras para realizar una consulta de la siguiente manera. si accedes a las tablas via ODBC para VFP. ten en cuenta qu e en ese momento empieza a viajar por el cable el indice de dicha tabla.Paso previo muy economico para pasar tus aplicaciones a cliente / servidor. yo estoy por implementar algo sobre ODBC para VFP. -Saludos. Respecto a la velocidad. Si no quieres pasarte a una base de datos de servidor. Pablo Roca (
[email protected] = thisform. si creaste una conexion llamada "datos". o una conexion RAS directa. es un valor numerico si es mayor a 0 la conexion fue existosa. solo te traeras los datos que necesites. como mySQL. Esto ya no es tan importante al haber varias bases de datos free.. Ahi debera indicar el nombre de la conexion.imagelist1. debes primero crear tu conexion en el administrador de ODBC. . =sqlexec(1. POr ejemplo. Si desde tu puesto abres una tabla. Asociar un ImageList a un control TreeView Inserta un imagelist en el formulario después de haber insertado el treeview.net>) (quitar la X) La Coruña . hay veces que moverse por las tablas en una conexión de este tipo so n un suplicio. para mi bastante importante.to/visualfox> ODBC.España ICQ 5035887 Sysop del Portal Gratuito de VisualFoxPro en Español <http://clik.. debe ser igual a éste menos 26. Las transacciones las puede llevar el Transaction Server En concreto le veo otra aplicación. Crear conexión Espero que lo siguiente te sirva. y entonces empezare a realizar las pruebas de velocidad. imaginate que com unicas con la central o una delegación . ajus ta sus imágenes y en el evento 'init' del treeview sitúa este código: this. vpn. lo desconozco. El valor devuelto te permitira manejar tus datos. en ningun caso te traeras el indice.object Para asignar una imagen a un nodo usa los parámetros 5 y 6 del . Por eje mplo si te devuelve el valor 1. esto resulta mucho mas comodo de trabajar quecon las tablas directamente. Interbase 6. pero s i está dentro de una página será igual al ancho del cuadro menos 10."select * from autor") Marcelo Ivan Controles Ancho de lista de un cuadro combinado Para que coincida con el ancho del cuadro. deberas conectarte DESDE VFP con el comando =sqlconnect("datos") como es una funcion te devolvera u n valor. Este mismo nombre debes senalar para conectarte en VFP. via internet. column4. imagen.controlsource='lv_diariote.recordsource='lv_diariote' Es valido si se mantienen los mismos nombres de campos y orden.add(relativa.controlsource='lv_diariote.treeview1.diadebe' thisform.Object.controlsource='lv_diariote. incluso sucede cuando realizamos diversas operaciones con dichos datos: Para solucionar esto se debe hacer de la siguiente manera: LOCAL lcRecordSource lcRecordSource = ALLTRIM(This.cs_grdresal1.cs_grdresal1.cs_grdresal1.column9.RecordSource = lcRecordSource Si queremos vincularlo a otro cursor o datos. Calendario Para que en el inicio el control tome la fecha del sistema pone en el Init del formulario: ThisForm. imagen_seleccionada) -Saludos.controlsource='lv_diariote.RecordSource = "" ** ejecutar el codigo que se desee para la tabla/vista o cursor ** SCAN's.column7. como cambiarle el record source y vincularlo a otro origen de datos (tabla/cursor/vista).column3.cs_grdresal1.cs_grdresal1.controlsource='lv_diariote.método 'add' de la colección 'nodes' thisform. .cs_grdresal1.diadivcod' Cambiar la tecla pulsada Cambiar C por D Evento KeyPress . clave.G.controlsource='lv_diariote.diahaber' thisform.Nodes..controlsource='lv_diariote.column1.oleCalendar.RecordSource) This. yo también por ase gurarme que todo va bien. relación. This.cs_grdresal1.. ----------------------------Carlos Yohn Zubiria A. REPLACE's .diaconcep' thisform.column8.dianasi' thisform..Today Luis María Guayán Tucumán .cs_grdresal1. siempre restauro los controlsources de las columnas: thisform.). pues simplemente hay que hacer: thisform..column6.diacuenta' thisform. hay veces en las que se estropea el grid (se pierden los anchos de las columnas. texto.Argentina Cambiar el RecordSource a un grid Cuando realizamos operaciones con los datos de un grid.P.diafapun' thisform. "RGB(255. Cambiar propiedades a controles del mismo tipo ThisForm.aTest(5) .com <mailto:
[email protected]("ForeColor". nShiftAltCtrl IF nKeyCode=5 Dodefault(9.excover. "Label") Combobox.P.addproperty('aTest(1)') with this dimension .nShiftAltCtrl) ENDIF Toni Atència i Puigdomènech Departamento informático
[email protected] nKeyCode.0. Combobox.aTest' .G.0)". on error nada() .com> www. Ó En el metodo KEYPRESS del control prueba a poner algo de este estilo: LPARAMETERS nKeyCode. y si la c reación tiene éxito está registrado.com> EXCOVER.aTest(1)='Argentina' .com <http://www. S.aTest(4)='Nicaragua' .excover.RowSourceType=5 endwith Comprobar si un control está registrado Está el viejo truco de intentar crearlo desactivando la rutina de error.aTest(2)='Canada' .aTest(3)='Mexico' . nShiftAltCtrl if inlist(nKeyCode.RowSource='this.aTest(5)='Inglaterra' asort(.aTest) . 67) nodefault keyboard "D" endif -Saludos. Abrir lista keyboard '{x41A0}' abre el combo sea del tipo que sea.addproperty this. ----------------------------Carlos Yohn Zubiria A. 99. Añadir valores Puedes usar this. BASECLASS = "Checkbox" CASE ..NombreEste Método( loControlRef ) ENDCASE ENDWITH ENDFOR Esta listo para ser completado y ampliado.NombreX( loPageReft) ENDWITH ENDFOR CASE . Es un método recursivo Se llama dentro de la forma ThisForm.BASECLASS = "Pageframe" FOR EACH loPageRef IN . Desinstalar OCX RegSvr32 /u RutaNombre Enviar al fondo Zorder(0) && al frente . Se puede contar.) on error . endif -Saludos.P.BASECLASS = "Page" THISFORM.. ----------------------------Carlos Yohn Zubiria A.BASECLASS = "Combobox" CASE ..NombreX( loControlRef ) CASE .BASECLASS = "Grid" CASE .PAGES WITH loPageRef THISFORM. if type("mmm") = "O" && éxito en la creación ..BASECLASS = "Textbox" * Hacer algo en en este Texbox CASE .BASECLASS = "Editbox" CASE .BASECLASS = "Commandbutton" CASE .NomBreX( ThisForm) * Método NombreX LPARAMETERS oThis LOCAL loControlRef LOCAL loControlCont * Controles de la forma FOR EACH loControlRef IN oThis.CONTROLS WITH loControlRef DO CASE CASE ....mmm = createobject(. Contar los controles de un formulario Este es el esqueleto de un método de una forma.BASECLASS = "Container" THISFORM. else .G.. guardar datos en una matriz etc. Nombre=lc while MiTabla.FileName = 'C:\Mis Imagenes\Banner_1. Utiliza solamente dos comandos: Thisform.ocx En el Grupo microsoft.Nombre <= lc nooptimize endif if lnRecno # recno() ThisForm. Tani.Nombre <= lc nooptimize endif else locate rest for MiTabla.END InteractiveChange --*---------------------------------------------------------------------* NOTA: SE DEBE TENER LAS SIGUIENTES CONSIDERACIONES: * -La tabla debe estar ordenada ASCENDENTEMENTE o existir un indice .vb consegui este Control que te permite mostrar un Gif Animado.gif' Thisform.Value) lnRecno = recno() if MiTabla. *---------------------------------------------------------------------* Para hacer una BUSQUEDA INCREMENTAL en un Formulario.Grid1.Nombre >= lc if not bof() skip -1 endif if MiTabla. debemos poner un * TextBox (Text1) y una Grilla (Grid1).Zorder(1) && al fondo Gif animado.SetFocus && el nombre del TextBox ThisForm.Olecontrol1.Olecontrol1.es.SetFocus && el nombre del Grid endif return *--.InteractiveChange --local lc. * En el Entorno de datos insertaremos la tabla (MiTabla) * En el método InteractiveChange del TexBox * escribir el siguiente código: *---------------------------------------------------------------------*--.ShowGif Grid.Text1.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. lnRecno Select MiTabla lc = allt(This.Nombre=lc while MiTabla.public. Búsqueda incremental Luis: Esto lo envie alguna vez y funciona. "column") m.P. debía primero que desconectarle a ellos la fuente. o manejar el color del registro seleccionado *---------------------------------------------------------------------Luis María Guayán Tucumán .grid1. Cambiar colores propiedad 'registro' en el formulario. presionas click en el marco superior de la ventana y luego presionas delete Sergio Rocha Tenorio
[email protected]() Método pongrid m.).pongrid() -Saludos. ----------------------------Carlos Yohn Zubiria A...condicion. "column") Evento afterrowcolchange del grid dodefault() thisform..com> Grid. es decir: .T.))' && elije los colores que quieras thisform.setall("dynamicforecolor".. Columna desactivada Enabled = .grid1.registro = recno("mialias") thisform. Eliminar un control añadido Señalas el control añadido con las propiedades.Argentina Grid. inicializada a 0 métodos 'puntero' y 'pongr id' en el formulario Método puntero thisform. Grid..condicion = 'iif(recno("mialias") = thisform.condicion. rgb(. rgb(.))' && elije los colores que quieras thisform.. Mantener las propiedades Antes de hacer un REQUERY() para que se refrescara la información de los grid. rgb(.condicion = 'iif(recno("mialias") = thisform.registro..setall("dynamicbackcolor".com <mailto:
[email protected]() Evento 'Init' del formulario o del grid thisform.* por Nombre y estar seleccionado (el método busca si hay un * SET ORDER establecido) * -Fijarte bien el nombre del TexBox y del Grid para invocar el * método SetFocus (en el ejemplo Grid1 y Text1) * -Fijarte el alias de la tabla del grid (en el ejemplo MiTabla) * -Conviene que los nombres estén en mayúsculas y añadir en la * propiedad Format del TextBox = ! para que sean ingresados en mayúsculas * -Conviene que la propiedad del Grid RecordMark = . rgb(.G. m.). m. para que se vea * el registro marcado.registro. Grid.grid1.. RecordSource = "" &&Par de comillas para indicar vacío REQUERY("MiVista") Thisform.Grid1. THIS) Donde el primer parametro es el TAG que debes tener (el segundo es una variante mia. lcField *-.nRegistroActualGrid.SETORDER} LPARAMETERS tcControlSource. ..Grid1.RecordSource = "MiVista" Thisform. 28278583 Grid..Parent. Y hay quien dice que el codebook es 'anticuado'. lnCount. y solo poner en los click de tus header lo siguie nte this.si el RecordSource del Grid es "MiVista" entonces tendría que hacer lo siguiente: Thisform. RGB(255. RGB(0.Refresh() ROBERT GIOVANI CHURION ROJAS Colombia-Casanare-Orocué ICQ Nro.SetAll("DynamicForeColor".Refresh() Grid. "Column") * En el evento AfterRowColChange pon el siguiente código thisform. Marcar toda la línea actual · Crea una propiedad en tu formulario con el nombre nRegistroActualGrid.SetAll("DynamicBackColor". this. Ordernar columnas Tomado de nuestro codebook y vigente desde el 95 ! Has un metodo en tu grid base.nRegistroActualGrid. * En el evento Init del Grid escribe el siguiente código this. toHeader LOCAL loSelect. e indicar visualment e la columna que esta 'activamente ordenada').nRegistroActualGrid =RECNO() this.SetORder("cPolicy".128).PArent.ForeColor)".255. e inicialíz ala a valor 0. Claudio Campos Rafaela. ..Grid1.. this.BackColor)".be sure to select the right alias() LOCAL loSelect . "Column") this. Santa Fe {CSETORDERGRID. "IIF(RECNO()=thisform...0.255). la idea era mandar el header como parametro para manipular su color y caption. "IIF(RECNO()=thisform. Saludos y que te sirva. aun no implementada. 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 . pero desde la ventana de propie dades.f. thisForm. para que lo borres.See if the field name is in the leftmost part of the index *-.Sets the order to the currently selected *-.loSelect = CREATEOBJECT("cSelect".GetAlias()) *-. después debes hacer click en el formulario.sistec.Pageframe1 && para facilidad de manejo mas adelante ..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.expression. y en el init del pageframe ponganlas como . ya que automáticamente se te modifica la propiedad CurrentControl de la columna correspondiente. y listo a modificar las propiedades del combo. lo que tienes que hacer es lo sig. FOR lnCount = 1 TO TAGCOUNT() IF UPPER(SYS(14. SUBSTR(tcControlSource. selecciona el textbox de la columna que quieres. asi que durante el diseño pueden dejarla como . Otro control en columna de Grid Por defecto VFP.com. SET ORDER TO the index.controlsource if possible *-.f.Refresh() ENDIF EXIT ENDIF ENDFOR MP3 en VFP En la Galeria de componentes de Herramientas esta el control _soundplayer1. pero OJO. Para ver mejor como funciona hay un sample de API para reproducir musica con VFP.Get the fieldname being used lcField = . ok. AT(". de la barr a de controles y haces click sobre la columna donde lo quieres. tcControlSource) + 1) *-. ( this. después de eso seleccionas el control ComboBox.!! <http://www.f.oBizObj.". para que no pierda e l foco el textbox. debe ser sobre la barra de titulo del formulario. te pone textbox en las columnas. después de eso presionas la tecla Suprimir. If so. pero durante el diseño no podran manejar las paginas directamente.Parent. lnCount)) = UPPER(lcField) SET ORDER TO lnCount IF TYPE("thisform") == "O" thisform.tabs = .t.) 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. ShowPrinter .Flags = CommonDialog1. entre los activex a i ncluir en la distribucion. abajo solo que no se les olvide que deben habilitar el TabStrip.ACTIVEPAGE = THIS.treeview1.RichTextBox1.CommonDialog1.INDEX && activar la pagina del pageframe ENDIF this.pgActiva = frame1.h>tm RTF.INDEX <> pgActiva && si la activa es distinta de la selecci onada frame1.sellength=len(control.textrtf) Control.Flags = cdlPDReturnDC + cdlPDNoPageNums If . cdlPDReturnDC cdlPDNoPageNums cdlPDAllPages cdlPDSelection =256 =8 =0 =1 WITH THISFORM .clear() .selstart=1 control. Imprimir Debes utiliza el metodo selprint del control.hDC ) ENDWITH TreeView.ACTIVEPAGE && regresa el valor de la pagina activa IF THIS. a la izquierda. a la derecha.CommonDialog1.setfocus() && dejar focous en el tab (para simular el efecto) combinando estos dos controles podran tener un pageframe con los tabs arriba.CommonDialog1.CommonDialog1.RichTextBox1.SELECTEDITEM. Aqui te pongo un ejemplo para impr imir todo el contenido control. Borrar nodos thisform.nodes.SelLength = 0 Then .CommonDialog1. en el SetupWizard RichText. Espero que te sirva Emilio Fernandez RTF Tienes todas las referencias en: <http://msdn.SELECTEDITEM.com/library/devprods/vs6/basic/rtfbox98/vbojrichedit.SelPrint( .Flags + cdlPDAllPages Else .selprint Para imprimir solo una parte maneja selstart y sellength Saludos. Espero te sirva. Impresión 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.microsoft.Flags = .CommonDialog1.Flags + cdlPDSelection EndIf . 1.lvwList.activa_menu(NODE) ELSE && Actualizo el listview THISFORM.Nodes.lvwList.. shift.... endif Endfor ó For each oNodo in thisform. y THISFORM. LPARAMETERS button.En el método nodeclick algo así LPARAMETERS NODE ick IF THISFORM.P. Saber botón presionado Yo personalmente hago lo siguiente para saber cual botón fue presionado.Defino una propiedad en el form que contendrá el número de botón apretado. Ultimo enfoque En el Init del formulario colocas: . ----------------------------Carlos Yohn Zubiria A.boton = 2 THISFORM.lvwList.... Ejemplo Boton 2. La versión 1 está en comctl32.ocx -Saludos.En el método MouseDown pongo algo así.Count if thisform..Key=.actualizar_listview(NODE) ENDIF && RightCl Mario Jacas Cuba.TreeView. endif EndFor HTH Victor Espina TreeView.Nodes(i). x.boton = button -> Guardo que botón se presionó 3. Recorrer For i=1 to thisform.ocx La versión 2 en mscomctl.Nodes if oNodo. Versión Queda claro.Key=. Costa Rica TreeView.G.. com/spain/msdn/articulos/archivo/090600/voices/adojump>. usas: oLastFocus=eval("thisform.com/data/ <http://www. shortcuts.com/scripting> -Alex Feldstein MCP . mas poderos que los viejos .MCP ---------------------------------------------------------- . <http://www.cLastFocus=strtran(sys(1272.cLastFocus) Windows Script Host Es MUCHO.ht m> E-Mail en VFP Hay un excelente juego de controles (todos escritos en VFP nativo.thisform.com/revista/Num0012/articulo.microsoft.eps-software."+thisform.loresolvi. cuando referirte al objeto que tenia antes el foco.microsoft. no ActiveX) l lamados Fox Extension Classes.BAT Te permite controlar el sistema de directorios y archivos. Uno de ellos hace exactamente lo que tu quieres.thisform.microsoft.php> Dialer para llamada telefónica www.com/portal/asp.fpress.fpress/revista/Num9803/Mar98.".htm> Curso de ASP Solo para Caracas Venezuela."") 3) Luego.htm <http://www.microsoft.as p Chat en VFP En el siguiente link podras bajar una aplicacion muy interesante de cómo poder cha tear por medio de fox.fpress/revista/Num9803/Mar98. registry y mucho mas Fijate en <http://msdn.AddProperty("cLastFocus".Name+". curso de ASP en Español <http://www."") 2) En el evento LostFocus de cada objeto en la forma colocas: thisform.this).com/fec> -Alex Feldstein .Visual FoxPro Direcciones ADO en VFP Busca en www. Ver: <http://www.com/data/> Ó en la siguiente direccion tenes un articulo muy interesante sobre ADO y VFP <http://www. conocimientos y estilo de programación.htm> Claudio Rivadera La Rioja-Argentina FileSystemObject Aparte del linbk que te han dado.org> escritos por Ed Rauh y George Tasker -Alex Feldstein . VMP es muy fácil de hacer ya que se conecta muy bién con INTL de Steven Black. Hay una cantidad.com/> y tam bién hay much a gente que lo usa y ayuda en UT.com/> y tyambién en la excelente serie de artículos y ejemplos sobre ello en VFUG (login gratis) <http://www. el que también uso. COMCodebook.MCP Visual FoxPro Miami. Es una de cisión muy personal.com/scripting/> <http://www. VMP es un poco mas complicado de adaptar (al m enos en esta versión) ya que está basado en forms. Puedes ver mucha información en el wiki de fox: <http://fox. Tienen su foro de soporte técnico en <http://discussion.MCP Visual FoxPro Miami. Este por supuesto hace todo lo que mencioné anteriormente. En ese caso puedes ver Visual Fox Express.com/revista/Num9803/ Mar98.wikis. entre otros. Codebook.fpress. La decisión depende mucho de tus necesida des. Alex Feldstein . FL.Empaquetar información para transmitir por modem fijate en la aplicacion del ejemplo de uso del control MSCOMM32.com/wc. puedes ver más sobre WSH y FSO en: <http://msdn. USA FrameWorks Es difícil recomendar un framework.htm <http://www. USA FoxPress FoxPress cambió su servidor. Todos tienes sus pros y sus contras. .windows-script.fpress. Para diseños distribuidos (N-Tier).com/revista/Num9803/Mar98. VMP también tiene fácil conexión (hooks) con SDT de Doug Hennig y wwXML de Rick Strahl en el caso que los quieras usar. y su DNS tardará algunos días en actualizarse.dll?Wiki~CategoryFrameworks> Para programas más "clásicos" de red uso Visual Maxframe Profesional 5 de Drew Speed ie.vfug. con diversas filosofías.visualmaxframe.microsoft. Con respecto a tu pregunta sobre cambio de idioma (se conoce esto como "internac ionalización" de programas). FL.OCX en www. Mere Mortals. manualesgratis.es> Manuales www. <http://members.MCP Miami.com <http://www.htm> Vicent Palasí Librería FastLib ¿Alguien ha probado esta colección de controles? Según dicen es freeware. pero d esde VFP.dll?Wiki~ManualGarbageCollection~VFP> -Alex Feldstein .55. es una de mis herramientas básicas. Jesús Sanz jsanz@revolution. que es muy bueno.com/wc.wikis. Está en inglés. o al ser freeware no se puede cobrar por u na aplicación que incorpore estos controles? La dirección donde encontrar los controles es: <http://personal5. los estoy probando y funcionan muy bien.htm> La dirección es del índice del libro.dhs. Gratuito y excelente. Las clases están explicadas en extenso en los capítulos 15 y 16. y en un principio parece diseñada para Visual Basic.de/gratis> SPECIAL EDITION USING VISUAL FOXPRO 6 El libro que te recomendaron.org/isinfo.243> -Luis María Guayán Tucumán .rinet.es <mailto:
[email protected]:8080/GlyadiLisu/index.tripod.es/mroibal/home.La nueva dirección IP del sitio: <http://195.Argentina Garbage Collection <http://fox. ¿Los puede incluir en mis aplicaciones.jordanr.htm> -Un saludo. FL. lo tienes en: <http://docs. Mensajes anteriores . USA -------------------------------------------Instalador Inno Setup Yo no sé qué haría sin el Inno Setup.iddeo.manualesgratis.com> Este tiene Muy Buenos Manuales en Ingles y Español.es.174. <http://www. Si lo sincronizas en tu navegador lo puedes le er entero fuera de línea en la pantalla. Busca en <http://www.net <http://www.pvirt.html> <http://www.deja.com <http://www.htm?929066716826#/workshop/imedia <ht tp://msdn.htm?929066716826>/agent/default.net> mysql www. el site de php es www.shtml> MsAgent http://msdn.wikis.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.net/>. <http://www.com ----------------------ICQ 34013175 Normalizacion <http://fox. -------------------------------------------------------------Mail to: Emil_39 ARROBA hotmail.php.asp&RLD =79 MySql Se pueden usar en Windows y Linux( y algun otro mas quizas).comptechnews.com/workshop/c-frame.com/wc.mysql.to/visualfox> El nuevo PortalFox: <http://portalfox.com/foros.com/catalog/accessdata2/chapter/ch04.asp?idgrup=31862&catid=7&subcatid=16> Vicent Palasí Ó Prueba en <http://www.com> Saludos y feliz año.com/workshop/c-frame.com> Portal de VFP El PortalFox: <http://clik. Emiliano.Yo lo que utilizo es Aforo.microsoft.dll?Wiki~DataNormalization> <http://www.oreilly. Saludos Rafael Figueroa Refox .mysql. yo tengo instalado para win95 y funciona de maravillas ( php y mysql ).html> Hugo Portal de programación Nuevo portal de programación de bases de datos en: <http://progbd.svetlian.php.nexen.microsoft.com/home_ps.com/~reaster/dbdesign.aforo. Net Laa resurreccion de VFP y las consejos para programadores VFP en el entorno .Lo que estabas buscando ! =Refox 8.zip Que les aproveche ! Saludos desde Puebla.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. Probablemente el foro mas grande de VFP en el mundo.filesearch.lespinter. Kevin Mitnick Maicrosoft LVP Ó En esta otra dirección pueden encontrar más.com/porcamicheria> -> Mi Carpeta -> Bingo . Es necesario que se suscriban y obtengan una cuenta en www.com> Link al Folder compartido: <http://www. <http://www. Solo que necesitan el Winrar para desco mprimir.asp?ArtNum=21> a partir de enero este site va a estar completamente en castellano e ingles.<http://mx.ru/cgi-bin/s?q=refox&m=20&f=1&l=en> copien y peguen. Universal Thread UT es el Universal Thread.Net <http://www.yahoo.0 Instalacion.0 Instalacion.myspace.com/GetOpEd. Mexico. <http://www.MCP ---------------------------------------VFP.com <http://w ww.4Mb .zip ó Espero que esta liga si les funcione.myspace. por ahora es todo en ingles. en otros casos se puede utiliar el winzip. Windows interface 1.myspace.briefcase.com/> -Alex Feldstein .universalthread. 1 ENDIF lnMes = MONTH(tdFin) . tdFin) LOCAL ldAux. 12 * lnAnio) *--.MONTH(tdIni) IF lnMes < 0 lnMes = lnMes + 12 ENDIF lnDia = DAY(tdFin) .No cumplio el año aun IF ldAux > tdFin lnAnio = lnAnio .DAY(TuFecha) + 1.<http://msdn. lnMes. lnDia.DAY(tdIni) IF lnDia < 0 .htm -Alex Feldstein .day(TuFecha) + 1 Calcular el último día del mes *-----------------------------------------------FUNCTION _EOM(dFecha) *-----------------------------------------------* Retorna el último día del mes (EndOfMonth) * USO: _EOM(DATE()) * RETORNA: Fecha *-----------------------------------------------LOCAL ld ld = GOMONTH(dFecha.com/library/devprods/vs6/visualc/vccore/_core_the_user>_i nterface_guidelines_for_microsoft_windows.day(ld) ENDFUNC ó UltimoDia = gomonth(TuFecha . meses y días * Usa la función DiasDelMes() *----------------------------------------------------FUNCTION Dif_AMD(tdIni.YEAR(tdIni) ldAux = GOMONTH(tdIni.Fecha inicial siempre menor IF tdIni>tdFin ldAux = tdIni tdIni = tdFin tdFin = ldAux ENDIF lnAnio = YEAR(tdFin) . lnAnio.1) RETURN ld . meses y días *----------------------------------------------------* FUNCTION Dif_AMD(tdIni.MCP -------------------------------------------Fechas y tiempo Calcular el primer día del mes PrimerDia = TuFecha .microsoft. lcRet *--. tdFin) *----------------------------------------------------* Calcula la diferencia entre dos fechas en: * años. 1 )-1 Calcular la diferencia de dos fechas en años. se deduce la Semana Santa. ALLTRIM(STR(lnMes))+ " MESES Y " + . por ende . ALLTRIM(STR(lnDia))+ " DIAS. *----------------------------------------------------FUNCTION Edad(tdNac. tdHoy) *----------------------------------------------------* Calcula la edad pasando como parámetros: * tdNac = Fecha de nacimiento * tdHoy = Fecha a la cual se calcula la edad.1 ENDIF RETURN lnAnio ENDFUNC Calcular la fecha de semana santa Juan Pablo te paso una función que no es mía.1 ENDIF ENDIF lcRet = ALLTRIM(STR(lnAnio))+ " AÑOS. tdHoy) LOCAL lnAnio IF EMPTY(tdHoy) tdHoy = DATE() ENDIF lnAnio = YEAR(tdHoy) . no cumplio el mes IF (DAY(tdFin) < DAY(tdIni)) IF lnMes = 0 lnMes = 11 ELSE lnMes = lnMes .1) RETURN DAY(ld . calcula el Domingo de Pascua. * Por defecto toma la fecha actual. *--------------------------------------------------------------* FUNCTION _Pascua(tnAnio) *--------------------------------------------------------------* USE: _Pascua(1999) * PARAMETRO: Año a calcular * RETORNO: Fecha del Domingo de Pascua *--------------------------------------------------------------- .YEAR(tdNac) IF GOMONTH(tdNac.lnDia = lnDia + DiasDelMes(tdIni) ENDIF *--. 12 * lnAnio) > tdHoy lnAnio = lnAnio ." RETURN lcRet ENDFUNC *----------------------------------------------------* FUNCTION DiasDelMes(dFecha) *-----------------------------------------------* Retorna los días de un mes.Si el dia es mayor.DAY(ld)) ENDFUNC Calcular la edad *----------------------------------------------------* FUNCTION Edad(tdNac. Usada por Dif_AMD *-----------------------------------------------FUNCTION DiasDelMes(dFecha) LOCAL ld ld = GOMONTH(dFecha. " + . 4)+"/03/21}") ldFecPascua = ldFecIni+lnDiasPascua RETURN ldFecPascua ENDFUNC A/P Nelson Rodriguez Salto . _10to256(MINUTE(ltDateTime). lnCorrLunar. _10to256(HOUR(ltDateTime).2) + SPAC(24) DECLARE SetLocalTime IN win32api . ENDIF LOCAL lcCadena lcCadena = _10to256(YEAR(ltDateTime). lnCorrSolar. lnEpactaJul. lnDiasPascua. .2) + . lnDomingo.2) + .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: .2) + . lnEpactaGreg.09.com.Uruguay nri@adinet. lnDiasLuna15.FUNCTION _Pascua(tnAnio) LOCAL lnCentena. STRING lcCadena RETURN SetLocalTime(lcCadena) . envio un parámetro no válido o error * Autor: LMG . si pudo cambiar fecha y hora * .2) + .14 *========================================================================== IF TYPE("ltDateTime") # "T" RETURN . . _10to256(SEC(ltDateTime).9999) MESSAGEBOX("Rango inválido [1000. ldFecPascua IF NOT BETWEEN(tnAnio.T.F.2) + . ldFecIni.uy <mailto:
[email protected]]") 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.2) + . lnAux. _10to256(DAY(ltDateTime).2) + .. _10to256(000.1998. _10to256(MONTH(ltDateTime). lnDiasLunaP. lnNroAureo. _10to256(DOW(ltDateTime).1000. Vic-Barcelona e-mail: admin@autodieselvic. lnAscii lcRetorno='' DO WHILE lnNumero >= 256 lnAscii=MOD(lnNumero.01.autodieselvic.09. lnCant) *========================================================================== * Toma número en base 10 y lo convierte en "lnCant" caracteres en base 256 * Usada por: WriteLocalTime() * Autor: LMG . S.dfecha) + " " + allt(str(year(m.A.1998. year(date) FUNCTION NumDia( pfecha ) Return pfecha-date(year(pfecha).dFecha))) + " " + cmonth(m. saludos y hasta pronto !!! -Josep Mª Picañol AUTO DIESEL VIC. lnCant.1)+1 .256) lcRetorno=lcRetorno + CHR(lnAscii) lnNumero=INT(lnNumero / 256) ENDDO lnAscii=lnNumero lcRetorno=lcRetorno + CHR(lnAscii) RETURN PADR(lcRetorno.Argentina Convertir una fecha a formato largo m.com> web: www.ENDFUNC *========================================================================== FUNCTION _10to256(lnNumero. Run /N Control Timedate.com> Obtener el número de día del año Resta la fecha en cuestión menos el primer día del año 01.com <http://www.1.dFecha = {01/01/2000} allt(str(day(m. CHR(0)) ENDFUNC *========================================================================== Luis María Guayán Tucumán .dfecha))) ó ¿ DMY(dFecha) Modificar fecha y hora Hola Javier.autodieselvic.14 *========================================================================== LOCAL lcRetorno.cpl Espero que te sirva.com <mailto:admin@autodieselvic. 1) ldresult = lddate * Fuerza a VFP 5. . pndow * * * * Parameter list description pnmonth numero del mes (1-12) pnyear numero del año (en formato cuatro dígitos) pndow dia de la semana a investigar (Domingo = 1. Por ejemplo en los Estados Unidos el primer lunes de septiembre es vacaciones.TRANSFORM(lnHoras.lnfirstday ENDIF ENDIF RETURN ldresult Ejemplo: * Saber el primer Lunes de septiembre del año actual. lndow lddate = DATE(pnyear.. * FUNCTION: FirstDay."@L 99").Primer dia del mes de un dia de la semana (primer viernes de Agosto. 2 = Lunes.. 2) Transformar un número 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. 1) IF lnfirstday # pndow IF lnfirstday < pndow ldresult = lddate + (pndow .) Hay algunas ocasiones en las que es útil saber el primer dia del mes en el que cae un dia de la semana.60) RETURN IiF(lnHoras<100.prg LPARAMETERS pnmonth. lnSegundos lnHoras = INT(nSegundos/3600) lnMinutos = INT(((nSegundos-(lnHoras*3600))/60)) lnSegundos = MOD(nSegundos.. lddate."@L 9999")) +":"+ . YEAR(DATE()). lnMinutos. ldSeptMon = FirstDay(9. etc.0 a usar el Domingo * como primer dia de la semana * Versiones anteriores deberán borrar el parámetro lnfirstday = DOW(lddate.lnfirstday) ELSE ldresult = lddate + (7 + pndow) . La siguiente función dado un mes y un año devuelve la fecha en la que cae un dia de la semana 1 = Domingo. Notas: el siguiente codigo usa funciones que pueden estar solo disponibles a VFP 6.0. Lunes = 2..TRANSFORM(lnHoras.0/6..) LOCAL ldresult."@L 99")+":"+ . TRANSFORM(lnMinutos. pnmonth. pnyear. "@L 99") ENDFUNC .TRANSFORM(lnSegundos. 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. Esto hara que VFP trate de bloquear el registro solo una vez..com <mailto:admin@autodieselvic... S. puedes utilizar la siguiente función...FileSystemObject") ...A. 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. oDrive.autodieselvic. 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. Como vez. Esto te garantiza que. utiliza la siguiente técnica: USE Contadores LOCATE FOR Contador=cContador IF NOT FOUND() .. no importa que tan rápidas sean las llamadas a la función. Vic-Barcelona e-mail: admin@autodieselvic. el registro nunca estará desbloqueado para dos usuarios simultáneamente. Podemos suponer que la unidad e: és la del cd-rom.com <http://www. EndIf -Josep Mª Picañol AUTO DIESEL VIC. que es nativa de fox y no necesita librerias ni declaraciones.com> web: www..Ficheros Códigos correlativos 1) Usa SET REPROCESS TO 1 en lugar de AUTOMATIC. HTH Victor Comprobar si hay disco en la Unidad Para saber si tienes el disco en qualquier unidad.autodieselvic. oFileSystemObject oFileSystemObject = CREATEOBJECT("Scripting..com> Ó FUNCTION DriveReady LPARAMETERS cDrive LOCAL lReturn. 2) En tu rutina de contadores. tcEntry) *---------------------------------------------------* Lee un valor de un archivo INI."Port") * RETORNO: Caracter *---------------------------------------------------LOCAL lcIniValue. STRING cSection...NULL.."Default". * PARAMETROS: * tcFileName = Nombre y ruta completa del archivo.tcEntry..INI * USO: ReadFileIni("C:\MiArchivo. .lnBufferSize. @lcIniValue."Default".uy <mailto:
[email protected].. STRING @cRetVal."Port". STRING cFileName lnBufferSize = 255 lcIniValue = spac(lnBufferSize) lnResult=GetPrivateProfileString(tcSection.uy> Montevideo-Uruguay Escribir y leer un valor de un fichero INI *---------------------------------------------------FUNCTION WriteFileIni(tcFileName. la sección o la entrada.tcSection. * Retorna . STRING cEntry. IN WIN32API .ini".ini".) ENDFUNC *---------------------------------------------------FUNCTION ReadFileIni(tcFileName.T .tcFileName)=1.INI * tcEntry = Entrada del archivo. STRING cFileName RETURN IIF(WritePrivateProfileString(tcSection..STRING cEntry.com. la sección o la entrada."*NULL*"..tcSection. STRING cSection. .com. IN WIN32API . INTEGER nSize.INI * tcSection = Sección del archivo.IsReady RETURN lReturn -Mario Acevedo maap@adinet. STRING cDefault. la crea.tcEntry.INI * tcEntry = Entrada del archivo.oDrive = oFileSystemObject. si tuvo éxito * PARAMETROS: * tcFileName = Nombre y ruta completa del archivo."2") * RETORNO: Logico *---------------------------------------------------DECLARE INTEGER WritePrivateProfileString .. * Si no existe el archivo. lnResult.tcFileName) .STRING cEntry. * Si no existe el archivo.tcValue) *---------------------------------------------------* Escribe un valor de un archivo INI.tcEntry.INI * tcSection = Sección del archivo. lnBufferSize DECLARE INTEGER GetPrivateProfileString .GetDrive(cDrive) lReturn = oDrive.tcValue.INI * tcValue = Valor de la entrada * USO: WriteFileIni("C:\MiArchivo.T. retorna . lnResult) IF lcIniValue="*NULL*" lcIniValue=. MENOS con los archivos de RM-COBO L (que por supuesto son con los que necesitaba laburar yo). (El problema principal que existe con los archivos de cobol es que este lenguaj e usa como el RPG campos numericos empaquetados. etc. Ficheros Cobol Mira. pAlias) DO WHILE !EMPTY(lTagEncontrado) IF UPPER(ALLTRIM(lTagEncontrado)) == pNombreTag lEsTag = . pAlias) LOCAL lEsTag. ex isten una version demo que yo use y la obtuve de la revista numero 61 de Solo Programadores (una reviste de origen español). ENDIF lEsTag = . pAlias) ENDDO RETURN lEsTag ENDFUNC Saludos Eduardo Amat. 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). Si tus archivos no estan en RM-COBOL podes usar esta aplicacion.lcIniValue=SUBSTR(lcIniValue.1. ENDIF RETURN lcIniValue ENDFUNC Existencia de índice Aqui tienes una funcion basada en otra igual del Trastade: FUNCTION EsTag (pNombreTag.T. pNombreTag = UPPER(ALLTRIM(pNombreTag)) lTagNum = 1 lTagEncontrado = TAG(lTagNum. lTagEncontrado IF PARAMETERS() < 2 pAlias = ALIAS() ENDIF IF EMPTY(pAlias) RETURN .F. . entonces cuando lo queres visualizar ves un co . para ahorrar espacio en el disco.NULL.F. Tambien trabaja con archivos Cobol como MS-Cobol. EXIT ENDIF lTagNum = lTagNum + 1 lTagEncontrado = TAG(lTagNum. yo me tuve el mismo problema y estuve investigando un poco. 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. lcalias .Nombre de la vista * tcexpr . no s e les puede crear un indice.digo de ASCII tipo archivo ZIP en vez de numeros."allart+STR(mov. es ahi donde necesitas algo que lo "abra" y lo grabe en un formato legible por otros programas). tctag) LOCAL lcOldBufering. Para resolver esto se ha reealizado la sisuiente rutina: ************************************************************ * * Funcion: INDEXVISTA * * Indexa cualquier tipo de vista * * Parametros: * * tcvista .expresion completa para indexar * tctag . Feliz Navidad. llret."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.nombre del indice (tag) * * Ejemplos: * * ret=indexview("lv_alelin". Bueno. Hernan. y por tanto no se puede hacer SEEK o INDEXSEEK en ell as. 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).3)". espero esto te sirva. tcexpr. DBF".lcOldBufering) ENDIF IF !EMPTY(lcalias) SELECT (lcalias) ELSE SELECT 0 ENDIF ELSE llret = .IF PCOUNT()=3 lcalias = ALIAS() SELECT (tcvista) lcOldBufering=CURSORGETPROP("Buffering") llret=CURSORSETPROP("Buffering".3)".Argentina Saber si existe un directorio Agrega AUX en tu cadena de busqueda de directorio. Obtener los ficheros de un directorio Aparte de adir() lc = SYS(2000."allart+STR(mov. 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 . ENDIF RETURN llret ENDFUNC Ejemplo de uso: ret=indexvista("lv_alelin".DBF") DO WHILE NOT EMPTY(lc) USE (lc) EXCLUSIVE REINDEX lc = SYS(2000. "*. "*."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.F.3) IF llret INDEX ON &tcexpr TAG (tctag) SET ORDER TO llret=CURSORSETPROP("Buffering". 1) ENDDO Luis María Guayán Tucumán . Para saber si es vista o tabla puedes utilizar la función 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 sección o la entrada, la crea. * Retorna .T. si tuvo éxito * PARAMETROS: * tcFileName = Nombre y ruta completa del archivo.INI * tcSection = Sección 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 sección o la entrada, retorna .NULL. * PARAMETROS: * tcFileName = Nombre y ruta completa del archivo.INI * tcSection = Sección 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 María Guayán Tucumán - 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 diseñador de formularios, una clase Session, o sencillamente abriendo las tablas mediante el sistema tradicional. Una vez tuve un problema y es que quería crear una serie de formularios con DE exa ctamente iguales. Si los guardaba como clase perdia el DE y al instanciarlos no lo tenía ya. La solución la encontré en el siguiente código. 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) idéntico al de cOldForm. FoxPress - Enero de 2001 © 2001 FoxPress. All rights reserved Devolver más de un valor desde un formulario DO FORM Forma TO Devuelve1, devuelve2 Saludos. Jesús Aceves.
[email protected] <mailto:
[email protected]> Formulario ovalado En realidad es muy fácil, 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 "". u sted dirá: "¿Para qué necesito un formulario .Caption toForm. terminamos diciendo: "por lo visto.Fll") Additive Endif Local lnHWND lnHWND = _WhToHwnd( _WFindTitl(toForm.mRGN. casi siempre.lnHWND Formulario transparente Por Sergio E.WIDTH."I") && Función 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"."I") && función para crear la re gion elíptica fcnColocaRegion = regfn("SetWindowRgn".fcnVentanaActiva = regfn("GetActiveWindow". Hoy veremos la forma de hacer formularios transparentes. Aguirre Muchas veces queremos dar un aspecto "raro" a determinados formularios de una ap licación específica y.0.Caption = m."I") && Función para colocar la región 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.lcCaption Return m."III".hWndActiva."IIII".HEIGHT) &&Generamos la región *Pueden modificar los parámetros para colocar la región donde uds quieran y hacerla más o menos ancha IF mRGN <> 0 THEN && Si se creó la región mSalida = callfn(fcnColocaRegion.Caption = Sys(3) If not "FOXTOOLS" $ Upper( Set("Library") ) Set Library to (Home()+"\FoxTools.Caption) ) toForm.0.1) &&Colocamos la región en la ve ntana de la * que obtuvimos en handle IF mSalida <> 0 then WAIT WIND "FUNCIÓN EXITOSA" ENDIF ENDIF ENDIF Function GetHwndForm LParameter toForm Local lcCaption lcCaption = toForm. esto no se puede hacer" y nos resignamos a d ejar tal cual como estaba antes el aspecto de dicho formulario.THISFORM.THISFORM. Caption = Sys(3) lnHWND = _WhToHwnd(_WFindTitl(.Width + 1) + (lnBorderWidth * 2) lnFormHeight = . lnFormWidth. . la respuesta a esa pregunta es: "No sé.Height + lnTitleHeight + lnBorderWidth ** Creamos la región interna y externa del formulario lnOuterRgn = CreateRectRgn(0. lnInnerRgn. . lnOuterRgn.Caption)) . integer Y1.transparente?" . lnHWND With Thisform lcOldCaption = . . lnControlRgn. integer nMode Declare Integer CreateRectRgn in "gdi32" integer X1. . Local lcOldCaption. . lnControlLeft. que debemos agregar a los métodos del formulario. integer hRgn1.SetTransparent() Método GetHwndForm ** Este método devuelve el windows handle o identificador ** (Hwnd) del formulario. lnControlRight. . lnFormHeight) . . . integer h Rgn2. pero puede necesitarlo p ara una situación en particular".Caption . lnBorderWidth. integer X2. lnControl. Declare Integer CombineRgn in "gdi32" integer hDestRgn. lnFormHeight. . . lnCombinedRgn.Caption = lcOldCaption EndWith Return lnHWND Método SetTransparent LOCAL lnControlBottom. lnRgnDiff. . 0. This. lnRgnOr. lnRgnDiff = 4 lnRgnOr = 2 llTrue = -1 With Thisform ** Fijamos el tamaño del borde y la barra de título del formulario lnBorderWidth = 3 lnTitleHeight = 23 ** Obtenemos la altura y el ancho del formulario lnFormWidth = (. int eger Y2 Declare Integer SetWindowRgn in "user32" integer hwnd. integer hRgn. llTrue ** Asignamos valores a las variables que utilizaremos con las funciones del API de windows. Ejemplo de un formulario transparente Para poder ejecutar el ejemplo debemos crear un formulario y agregar dos nuevos métodos: GetHwndForm y SetTransparent. lnFormWidth. El código. lnControlTop.fll" ADDITIVE ** Declaramos las funciones del API de windows que vamos a utilizar. lnTitleHeight. . integer nRe draw ** Llamamos al método que hace transparente el formulario. . . es el siguiente: Método Init Set Library To Home() + "Foxtools. . STRING cWinName n_HWD = FindWindow(0. .Width + lnControlLeft lnControlBottom = Control.Height + lnControlTop lnControlRgn = CreateRectRgn(lnControlLeft. 0. lnFormHeight . lnRgnOr) EndFor ** Establecemos la región de la ventana SetWindowRgn(.Controls lnControlLeft = Control. lnOuterRgn.lnInnerRgn = CreateRectRgn(lnBorderWidth. Sergio E. For Each Control in .. lnCombinedRgn.Top + lnTitleHeight lnControlRight = Control. 0. lnFormWidth .GetHwndForm()..Left + lnBorderWidth lnControlTop = Control. llTrue) EndWith Método Resize ** Llamamos al método que hace transparente al formulario cada vez que éste cambia d e tamaño.lnBorderWidth. lnControlRgn.SetTransparent() Espero que el truco les pueda ser de utilidad.ar Handle de un form *************************************************************************** *************************************************************************** * * Función : 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 . Aguirre realiza trabajos para InFox Creatividad & Tecnología. 0) CombineRgn(lnCombinedRgn. c_Caption) IF n_HWD > 0 RETURN n_HWD ENDIF ENDFUNC *************************************************************************** . lnControlRight.com. hasta la próxima. .lnBorderWidth) ** Extraemos la región interna de la región externa lnCombinedRgn = CreateRectRgn(0. lnInnerRgn. se puede e ntrar en contacto con él en paychon@impsat1. lnCombinedRgn. lnCont rolBottom) CombineRgn(lnCombinedRgn. lnControlTop. THIS. lnRgnDiff) ** Creamos las regiones de los controles del formulario y combinamos a éstas con l a región anterior. lnTitleHeight. STRING cNULL. PrintPreview('prtform') ELSE REPORT FORM prtform.T.lDesarrollo oApp. *********************************************************************** *!* ==================================== *!* Child and Parent Form Print Function -.cTituloFormPrint = oObjeto. 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. Has de tener cargado Foxtools. _SCREEN **************************************************************** Procedure PrintForm ****************** lParameters oObjeto LOCAL cAlias.FLL.Caption IF TYPE('oApp') == 'O' IF oApp.1 TO 4.by Mauricio Atanache *!* ==================================== * Use this procedure as PrintForm( Thisform ) or PrintForm( _Screen ) ******************* * Author : Mauricio Atanache G.frx NOCONSOLE TO PRINTER PROMPT ENDIF ELSE REPORT FORM prtform. * Date : December 10/97 * Parameters : oObjeto is an object FORM.SCREEN) SELECT Foto_Pantalla m. for example THISFORM. ELSE lUsado=. y que a mí me fun ciona correctamente. lUsado PUBLIC cTituloFormPrint * Save current alias IF USED(ALIAS()) cAlias=ALIAS() lUsado=.4 MODIFY GENERAL Foto_Pantalla.Imprimir un formulario Te envío una función que me encontré en internet de Mauricio Atanache.frx PREVIEW NOCONSOLE .F. ENDIF * Put image in clipboard If !TomaFoto( oObjeto ) Return Endif *SET STEP ON * Create a cursor for store the image.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. * ACTIVEFORM. Integer y. 0.Width. hBitMap. oForm. Integer nHeight. Integer xsrc.ACTIVEFORM. hDC. you can use * it to send form images to other aplications as Word etc. _SCREEN ************************************************************************** Function TomaFoto ****************** lParameters oForm Local nHwnd. 48. hBitMap ) BitBlt( hDC_Mem. Integer ysrc. for example THISFORM. Integer nHeight Declare Integer SetClipboardData in Win32Api Integer nFormat. hBitMap ) CloseClip() Else MessageBox( 'Error opening the clipboard'. 0. oForm. oForm. oForm. Integer dwRop Declare Integer SelectObject in Win32Api Integer hDC. * Also you can modify this function to print or copy any object on * screen. Integer hScrDC.ENDIF ELSE WAIT WINDOW "No se puede imprimir el formulario activo.Caption) nHwnd = _WhToHWnd(lnwhandle) hDC = GetDC( nHwnd ) hDC_Mem = CreateCompatibleDC( hDC ) hBitMap = CreateCompatibleBitMap( hDC. Declare integer FindWindow in Win32Api String cClassName. hPrevBmp * Must use the Foxtools library. Integer hObject Declare Integer DeleteDC in Win32Api Integer hDC Declare Integer ReleaseDC in Win32Api Integer nwnd.Height. Integer hdc Declare Integer DeleteObject in Win32Api Integer hDC lnwhandle = _WFindTitl(oForm. 0. 13369376 ) If OpenClip( nHwnd ) EmptyClip() SetClipboardData( 2. Integer nWidth.Width. somewhere. 'Message' ) Endif Else MessageBox( 'Error creating bitmap'. * Date : December 10/97 * This function puts the image of the form in the clipboard. Integer hObject Declare Integer CreateCompatibleBitmap in Win32Api Integer hDC. hDC_Mem. 0. Integer nWidth.Height ) If hBitMap#0 hPrevBmp = SelectObject( hDC_Mem. tnHwnd. 48. hDC. String cWindName Declare integer GetDC in Win32Api integer nhwnd Declare integer CreateCompatibleDC in Win32Api integer nhcd Declare Integer BitBlt in Win32Api Integer hDestDC. * Parameters : oForm is an object FORM. 'Menssage' ) Endif DeleteDC( hDC_Mem ) . Integer x." ENDIF * Cerramos el cursor USE IN Foto_Pantalla * Restauramos el alias activo al entrar IF lUsado SELECT(cAlias) ENDIF Return *************************************************************** * Author : Mauricio Atanache G.
[email protected]> Departamento de Informática Diputación de Albacete <http://www.ReleaseDC( nHwnd.es> ======================== .t. Simarro López f.20 of 401. hDC ) Return . Bogotá .dipualba.com <mailto:dsmauricio@Hotmail. ========================= Francisco J.com> *!* Address : Crr 19 No.3460673 *********************************************************************** Saludos.es <mailto:f. 75 . ******************************************* *!* e-mail :
[email protected] *!* Telephone : 3460746 .simarro@dipualba. Matriz a un formulario como parámetro Luis María Guayán escribió en mensaje ... La única forma de pasar una matriz como parámetro, 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, aña diendo una nueva propiedad, y cuando te pregunta el nombre le pones: aMatriz(1) -Luis María Guayán Tucumán - Argentina ó DO FORM MiForm WITH @MiMatriz Mover una ventana sin título 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 botón 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 Agustín, 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 están contenidos en containers o pageframes, puedes usar la rutina AOBJETCS() que anex o (la incluyo para todos por que es muy pequeña). 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 función 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 están contenidos a su vez, solo añades .F.: nCount=aObjects(@aObjs,thisform,.F.) Espero que te sirva Victor ThisForm como parámetro 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 parámetro 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 María Guayán Tucumán - Argentina Gráficos Dibujar cuadro, líneas, 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 María Guayán Tucumán - Argentina Dimensión 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 gráfico 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 subgráfico circular 68 Circular con subgráfico de barras 71 Columnas 3D -4100 Columnas 3D agrupadas 54 Columnas 3D apiladas 55 Columnas 3D 100% apiladas 56 Líneas 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 cónica agrupada 102 Barra cónica apilada 103 Barra cónica 100% apilada 104 Columna 3D cónica 105 Columna cónica agrupada 99 Columna cónica apilada 100 Columna cónica 100% apilada 101 Barra cilíndrica agrupada 95 Barra cilíndrica apilada 96 Barra cilíndrica 100% apilada 97 Columna 3D cilíndrica 98 Columna cilíndrica agrupada 92 Columna cilíndrica apilada 93 Columna cilíndrica 100% apilada 94 Líneas 4 Líneas con marcadores 65 Líneas apilada con marcadores 66 Línea 100% apilada con marcadores 67 Líneas apiladas 63 Líneas 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 metálica vista superior) 86 Superficie 3D (estructura metálica) 84 Dispersión -4169 Dispersión con líneas 74 Dispersión con líneas y sin marcadores de datos 75 Dispersión con líneas optimizadas 72 Dispersión con líneas 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. es cuestion de probar.com> ImageXpress pro en <http://www..bennet-tec.pegasustools..! .com/> pero no se si funcionen con Visual FoxPro.OCX similar a Paint MetaDraw en <http://www. .En El Report. en el campo del primer registro se debe de poner: Tag: vacío Tag2: Vacío Expr: ORIENTATION=0 + CHR(13)+CHAR(10)+PAPERSIZE= + ALLTRIM(STR(PRTINFO(2)))+CHR(13)+CHR(10)+ DEFAULTSOURCE=8 Consideraciones: . .Asignar ancho y largo adecuado Observaciones: Se podría 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.La función PRTINFO(2) devuelve el papel seleccionado en la impresora. . por una variable públ ica para evitar que fuera externo . 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. Se podría reemplazar PRTINFO(2). Configuración del Driver de Impresora .La impresora debe ser capaz de soportar papel personalizado. El Report . Para esto puedes utilizar GetPrinter pero la verdad es que no acaba de funcionar como a uno le gustaría. tanto VFP como el resto de las aplicaciones Windows utilizarán esa impresora como la impresora por defecto EMail: edrauh@earthlink. Si en vez de ésa escribes el nombre de la impresora que quieres usar como impreso ra por defecto. En realidad la clave está en usar la función APRINTERS().Configurar el driver de impresora en papel como personalizado (en Impresora ve r Propiedades/Papel).Antes de realizar la impresión seleccionar la impresora y modificar el registro Expr en modo RunTime. 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.net Cómo configurar Reports cuya longitud del impreso sea configurable por el usuario en Win 9x/NT para impresoras matriciales José Manuel Soria Cómo configurar Reports cuya longitud del impreso sea configurable por el usuario en Win 9x/NT para impresoras matriciales El Driver .El Report debe ser externo. En la clave de impresoras del Registry existe una clave llamada Default que cont iene el valor de la impresora por defecto. y la clave del Registry pa ra el usuario acutal.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.Tener instalado en la impresora el driver adecuado. . 0. (256 ^ (lni . etc.. 0) # 0) IF llresult lnsize = 0 = GetPrinterInfo(lnhandle. si está bloqueada.. 2. Esto propiamente no se puede hacer con VFP pero sí con el API de Windows.drv. 73. @lcstruct. lni. lcstatus. INTEGER hPrinter.drv AS GetPrinterInfo.. @lnhandle.drv.. INTEGER @pcbNeeded lcprinter = 'LPT1:' lnhandle = 0 llresult = (OpenPrinter(@lcprinter. si tiene tonner.. INTEGER hPrinter DECLARE SHORT GetPrinter IN Winspool. 0. STRING @pDefault DECLARE SHORT ClosePrinter IN Winspool. Mira est o: DECLARE SHORT OpenPrinter IN .. 2. lnsize) llresult = (GetPrinterInfo(lnhandle. STRING @pPrinterName.. @lnsize) # 0) IF llresult lcstatus = SUBSTR(lcstruct. INTEGER cbBuf.. 1)) * .Controlar un poco la impresora Puede ser que en alguna ocasión te interese tener un control un poco más determinado de la impresora pudiendo saber si tiene papel o no.. @lnsize) lcstruct = REPLICATE(CHR(0). INTEGER Level. lnsize. 4) lnstatus = 0 FOR lni = 1 TO 4 lnstatus = lnstatus + ASC(SUBSTR(.1)) NEXT ? lnstatus ENDIF = ClosePrinter(lnhandle) ENDIF * Imprime los códigos devueltos por Win95/98 #define #define #define #define #define #define #define #define #define #define #define #define #define #define PRINTER_STATUS_PAUSED 0x00000001 PRINTER_STATUS_ERROR 0x00000002 PRINTER_STATUS_PENDING_DELETION 0x00000004 PRINTER_STATUS_PAPER_JAM 0x00000008 PRINTER_STATUS_PAPER_OUT 0x00000010 PRINTER_STATUS_MANUAL_FEED 0x00000020 PRINTER_STATUS_PAPER_PROBLEM 0x00000040 PRINTER_STATUS_OFFLINE 0x00000080 PRINTER_STATUS_IO_ACTIVE 0x00000100 PRINTER_STATUS_BUSY 0x00000200 PRINTER_STATUS_PRINTING 0x00000400 PRINTER_STATUS_OUTPUT_BIN_FULL 0x00000800 PRINTER_STATUS_NOT_AVAILABLE 0x00001000 PRINTER_STATUS_WAITING 0x00002000 . STRING @pPrinter. Winspool. INTEGER @phPrinter. SetDefaultPrinter(Nombre de la impresora o del device) Este código funciona con la versión 2. De forma interactiva se puede usar mediante SYS(1037) y SET PRINTER TO NAME GETPRINTER() Pero quizás la forma mejor de hacerla por código sea usando el Windows Sripting Host con un código parecido a: oWshNet = CREATEOBJ('Wscript. tag2 y expr. con otros drivers etc. "Ventana Activa") function printscreen LPARAMETERS tnHWnd. Cuidado porque esto se cuelga y da errores en NT.Network') oWshNet. Hemos descubierto que al menos con impresorad stylus color 600. Para cuelgue de stylus 600.0 del WSH pero no con la versión 1. lo mejor probar con todos.0 FoxPress . Angela. además camb iar el modo de lpt1 a (EPP+SPP) por ejemplo.Enero de 2000 © 1999 FoxPress. Impresora por Defecto Por la Redacción de FoxPress <http://www. Nada mas y si espero que a alguien le sirva.fpress. se soluciona con el driver que viene con w98. Un saludo a todos. con sp3. sin sp3. 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. puesto que con los drivers que están en las paginas de epson. All rights reserved Imprimir formularios printscreen(_whtohwnd(_wontop()). da igual la versión del driver (la última es de 1998) se cuelga. 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.com/> Otro tema recurrente es la forma de cambiar la impresora por defecto que usa la aplicación. probando con w95. w98.#define #define #define #define #define #define #define #define #define #define #define Cuelgues PRINTER_STATUS_PROCESSING 0x00004000 PRINTER_STATUS_INITIALIZING 0x00008000 PRINTER_STATUS_WARMING_UP 0x00010000 PRINTER_STATUS_TONER_LOW 0x00020000 PRINTER_STATUS_NO_TONER 0x00040000 PRINTER_STATUS_PAGE_PUNT 0x00080000 PRINTER_STATUS_USER_INTERVENTION 0x00100000 PRINTER_STATUS_OUT_OF_MEMORY 0x00200000 PRINTER_STATUS_DOOR_OPEN 0x00400000 PRINTER_STATUS_SERVER_UNKNOWN 0x00800000 PRINTER_STATUS_POWER_SAVE 0x01000000 Despues de muchas horas de investigación. tcJobName . Abre tu reporte como una tabla. así: Use mireporte. .G. 0. 0. INTEGER fPrintArea. Tag. INTEGER wyScale. INTEGER wxScale. .") ENDIF ENDIF -Saludos. . 0 + 48. . Saludos! Del Gavilán! Puertos . 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. estos campos continen información del tamaño de hoja. "La llamada a 'PrintWindow' de API ha devuelto: " + STR(lnRetVal).frx inmediatamente ejecutas Blank Fileds Expr. 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. Use Para cerrar la Tabla. "A.P. . De esta forma. PW_STRETCHTOPAGE. a la hora de imprimir el reporte tomará el tamaño de hoja especificad o en la impresora. .LOCAL lcJobName && Print job name LOCAL lnRetVal && Return value from API functions DECLARE INTEGER PrintWindow IN DibApi32 . ----------------------------Carlos Yohn Zubiria Papel de tamaño personalizado Para el tamaño personalizado del papel. INTEGER fPrintOpt. . @lcJobName) IF lnRetVal != 0 IF lnRetVal != 6 && 6 = User canceled printing = MESSAGEBOX("No se puede imprimir la ventana" + chr(13) + chr(10) + . Tag2 la instrucción anterior elimna los datos de los campos memo especificados del prim er registro. INTEGER HWnd. PW_WINDOW. TO LPT1 o LPT2. es decir report form . to lpt1 o lpt2. Francisco M. Redireccionar impresion ..El Set printer actua a través del SO (Windows). para saltarse windows directamente al puerto utiliza .... .. en el espacio intermedio creas tu r eporte. =aprinters(x) en esta matriz tienes todas las impresoras instaladas en tu pc. ahora preparas el envio. Tengo una primera parte con el detalle del chequ e. en pocas palabras debes conocer el nombre de la otra impresora. que como sabes es una tabla fo x. set printer on set device to print set printer to name (itemporal) @ prow(). haces el cambio de la impresora para imprimir el otro reporte. . Esto lo hice con ARREGLOS (arrays) en vez de campos de la Base de Datos. 3 informes en uno Primero subes el ENCABEZADO DE PAGINA al Tope del Reporte.0 say "Primera linea" @ prow()+1. ide fault=set("PRINTER".1) .2) 2.0 say "" . a otra variable asignas el nombre de la otra impresora asi itemporal=x(1. buscas con aprinters el nombre de la otra impresora para tener el nombre de e sta. set printer to name (idefault) @ prow().1) o itemporal=x(2. entonces 3..G. ----------------------------Carlos Yohn Zubiria A. luego en la mitad está el cheque y al final otra copia del detalle.P.. Roger Informes 2 tamaños para un report Ricardo. 5.. -Saludos. . Si el informe no está incluido en el proyecto (pues entonces sería de solo lectura) puedes antes de emitirlo cambiar los valores del campo 'expr' del primer registro del archivo frx. Espero te sirva.0 say "Segunda linea" . Yo lo hice para emitir Cheques. Por ejemplo para poner tamaño personalizado a 600 x 500 decimas de milimetro tendría s que incluir las siguientes líneas (sustituyendo las existentes): PAPERSIZE=256 PAPERLENGTH=600 PAPERWIDTH=500 Espero que te sirva. 4. ej. 1. Luego Bajas el DETALLE al final del reporte.Para solucionar esto puedes hacer lo siguiente. a una variable cualquiera guardas la impresora que tienes por defecto ej. ..11 endif Centrar verticalmente un report Para centrar las filas agrupadas calcula las filas en blanco (nNumLineasInsertar ) que deberías insertar al principio de la cabecera. y la c olocas inmediatamente encima de donde quieras que se desplace el contenido del report. Un saludo Paco Satué Cómo abrir un Report con un Zoom determinado Por la Redacción 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. calcular nNumLineasInsertar tcRetornos = REPLICATE( CHR(13).10 mouse dblclick at 11. Octubre 1998 Qué te parece. Pruébalo . Preview Nowait if wexist("Print Preview") move window 'Print Preview' to 10. Lo que se m e ocurrió es lo siguiente: report form myreport preview nowait move window "Print Preview" to 20.. De esta forma el grupo de líneas subirá o bajará de altura de acuerdo al valor de cRet ornos. Report Form . por ejemplo CalculaLineasInsertar(@cRetornos) La función será de la siguiente forma: Function CalculaLineasInsertar(tcRetornos) ..40 mouse click at 22. nNumLineasInsertar ) return Pintas cRetornos en una caja de texto que ocupe todo el ancho del report. Activas la opción <ajustar al contenido del texto>. 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..Anclar la barra del preview Por la Redacción de FoxPress © Copyrights 1998 by FoxPress... All rights reserved FoxPress..... Todos los controles del grupo los pones flotantes. Que yo sepa no hay una forma fácil de hacer esto. Solo necesitas saber el número total de líneas que caben en el report.70 keyboard '{DNARROW}' && 75% keyboard '{DNARROW}' && 50% keyboard '{ENTER}' ¿Si conoces una forma mejor? .. Para ello utilizas una función. lcOutput lnCanal=FCREATE('test. A continuación se explica como dejar disponible para el susuario esa Barra de Herramientas Hay dos métodos: el primero pasa por el archivo de recursos FoxUser.. El segundo ut iliza el menú y el menú del sistema. Método UNO La información de la Barra de Herramientas se guarda en el archivo de recursos Fox user. NOTA: El submenú de Barra de Herramientas no está disponible hasta que se abre un re port. Si no se actúa así. 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. puedes tener lo mismo usando algún pequeño truco como el que te comento a cotinuación. Algo como lo siguiente puede servir. Sin saber HTML. All rights reserved FoxPress. Cuando usas este método para asegurar que las barras de herramientas están disponibles desde dentro de la aplicación . la barra de herramientas del diseñador de Reports no siempre se muest ra y es relativamente fácil que el usuario la pierda.Cómo exportar los Report a HTML Vladimir Shevchenko © Copyrights 1998 by FoxPress. el estado de la barra de h erramientas también quedará guardada. Cómo incluir la Barra de Herramientas del diseñador de Reports en tiempo de ejecución 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. Lo único que tienes que hacer es crear un fichero ASCII usando las funciones de ba jo nivel de Visual FoxPro.html') lcOutput=' Esto es un test ' FPUTS(lnCanal. LOCAL lnCanal.. No obstante. Si no está cuando se modifica el report y se cierra la barra de herramientas el es .. El archivo de recursos Foxuser se debería distribuir con la aplicación. El archivo d e recursos se debería introducir dentro de tu aplicación o debería ser marcado como Readn-Only.lcOutput) FCLOSE(lnCanal) Sonrie por favor. debes tener en cuenta estas condiciones: Deberías haber modificado o crado un report en el entorno de desarrollo con una ba rra de herramientas abierta. cuando se mo difique el report y se cierre la barra de herramientas y el report guardado. 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. Esta posibilidad la puedes incluir poniendo el MODI REPORT con el report corresp ondiente. A continuación deberías guardar el report con lo que se guardará el entorno y por tan to la barra de herramientas. necesitas hacer click en el botón de Create localizado a la derecha del Submenu.FPT" files in your project. El siguiente ejemplo muestra como hacer esto: 1. En la opción del menú Ver. 19) INCLUDE the "ViewOnly. Para el prompt. En la ventana de órdenes escribe: CREATE MENU TESTMENU 2. Debido a que la opción Ver te lleva a un submenú. "Toolbars". Método Dos Una segunda forma y quizás más fácil para obtener el mismo resultado pasa por el uso d el menú de sistema de Visual FoxPro.DBF" 5) SET resource ON 6) Select "View". usa l as siguientes órdenes: 21) m. Cómo quitar el botón 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. el texto standard es "Toolbars" 5. si el usuario cierra las barras de herramientas. and click Customize 8) Click-and-drag el botón 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). Establece el resultado a Bar #. click las opciones del Menú. Marcando el archivo de recursos como de solo lectura.DBF" and "ViewOnly.DBF" table. hazlo a hora 11) SET resource OFF 12) SET resource TO main_resource_file_name 13) SET resource ON 14) USE "ViewOnly. 7) Escoge "Print Preview". Cuando compiles el menú deberías tener la funcionalidad de la Barra de Herramientas en tu aplicación. 20) Cuando quieras hacer un preview de un report SIN el icono de imprimir. y llama al menú _mview. En el prompt. Click el botón de Opciones.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 .OldResourceOnOff = SET("RESOURCE") 22) m.tado de la barra de herramientas también queda guardado. All rights reserved. 4.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.OldResourceName=SET("RESOURCE". Como resultado al quedar la barra de herramientas cerrada no hay forma de reabrirla desde dentro de tu aplicación. 1) 23) SET resource OFF 24) SET resource TO "ViewOnly.DBF" 4) SET resource to "ViewOnly. El prompt a la derecha deberá ser _mvi_toolb. © 1999 FoxPress. 3. escribe la palabra "Ver" El resultado debería ser de establecer u n Submenu. 6. el archivo de recursos no será actualizado con el nuevo estado de cer rado . Esto no es algo fácil 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 ión de VFP. * Por ejemplo "ALLTRIM(STR( _pageno)) de oApp. All rights reserved.20 * Se activa la ventana de manera invisible Activate Window x NoShow * Se prepara una variable pública para recibir el número de hojas oApp. en lugar de los valores establecidos en el archivo de recursos "ViewOnly". en este caso "informes" Activate Window Informes * Se ejecuta el reporte a la impresora. Cristal Report. * Se define la ventana Define Window x From 1. En ese caso sin la órden RELEASE. pero no quiere decir que la formula "FORMULA".nPaginas" Crystal Report.DataFiles(0) = cPathDB donde cPathDB es una varible donde colocas la direccion de la base de datos. (si no es a si disculpa). Enviar parámetros Hola claro que se pueden enviar parametros.formulas(0)="FORMULA='" + DATO + " ' " aqui cabe señalar que las formulas dentro de un reporte se manejan o se hacen refe rencias como elementos de un arreglo. FoxPro usaría la configuración del original too lBar. donde el icono de la impresora sí que estaba disponi ble. para realizar esto debes entonces realizar lo siguiente: CrystalReport1. 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).que FoxPro usaraé la configuración del ToolBar en el nuevo archivo de recursos. Contador de hojas Se corre el reporte dos veces. en c aso de que el preview de un report haya sido realizado bajo un archivo de recurs os diferente (o con ninguno). sea el elemento 0 del arreglo si no que le indicas al . © 1999 FoxPress. tu por default o por que te dieron ganas le asignaste el valor de: "Miercoles".1 To 20. La primera vez la salida del reporte va a una ven tana no visible. cuyo nombre está en la variable cReporte Report Form (cReporte) * Se guarda el número de hojas del reporte oApp.nPaginas = _PAGENO * Se elimina la ventana de paso Release Window x * Se activa la ventana actual.nPaginas para la expresión que deseas.nPaginas = 0 * Se ejecura el reporte. 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. Cambiar datos Creo que lo que quieres es conectar tu reporte a otra base de datos. como quieras * Dentro de tu reporte usas la variable oApp. crystal cuantas formulas estas usando me entiendes?? lo de menos es el indice qu e le des.t.HasZoomControl =. .t.t.HasGroupTree = . .t. .. "myTable") return Function _CRReport Lparameters tcCursorName.t."c:\myCR_RPT_Files\". .HasProgressControls =.0) Endwith lnHwndActiveX = GetForegroundWindow() && Save window handle Do while IsWindow(lnHwndActiveX) # 0 && Wait while ActiveX Alive Enddo Clear dlls Erase (tcPath+lcTemp+". tcTableName lcAlias = alias() Select (tcCursorName) lcTemp = sys(2015) Copy to (tcPath+lcTemp) type fox2x oCrystal=CreateObject("Crystal.HasExportButton = .HasPrintSetupButton =..t.WS_MAXIMIZE..Asegúrate de que ves alguna barra de herramientas (por ejemplo la de controles .OpenReport(tcRPTName) With oRpt With .t. tcPath.. .Database.preview ("Report Preview "+"by VFP".CRPE. . .dbf" Endwith With .HasCloseButton = . Informes Select * from myTable where Something into cursor myCursor _CRReport("myCursor". tcRPTName.Tables(tcTableName) .Application") #Define WS_MAXIMIZE 29949952 Declare integer GetForegroundWindow in WIN32API Declare short IsWindow in WIN32API integer oRpt = oCrystal.RPT".CanDrillDown = .t.Location = tcPath+lcTemp+".HasSearchButton =. .HasRefreshButton =.PrintWindowOptions .t.HasPrintButton = .t.HasNavigationControls = .t.. Endwith . . Crystal Report.*") If !empty(lcAlias)and used(lcAlias) Select (lcAlias) Endif Eliminar el botón cancelar al imprimir Para quitar el icono de impresora: En modo diseño: 1. "myTest. .f. ..Modifica cualquier informe 2.HasCancelButton = . . REPLACE fontface with "Tahoma".Sal del diseño de informe (no es necesario guardar cambios) 9.de/visualfox> (Portal Gratuito de VisualFoxPro en español) Impresoras matriciales Mira el archivos DOSPRINT. Saludos. no es n ada intuitiva pero funciona..P.Pincha con el botón derecho en la barra de herramientas 'Vista preliminar' 6.Cambia el valor del campo 'readonly' de ese registro a ..fpt) junto con las aplicaciones... yo he visto en otras noticias anteriores y he encontrado una página que cont iene un software que te permite enviar tus reportes por mail. es absolutamente gratis y facil de usar.G. La página es www. ----------------------------Carlos Yohn Zubiria A. o sea recursiva. Te crea una Impresora.Distribuye tu archivo de recursos (foxuser.. Con esto se podria hacer una rutina que investigara en el directorio y lo hicier a para todos los informes.De la lista que aparece selecciona 'Vista preliminar (Aparece la barra vista preliminar) 5. USE miinforme.frx (creo que te lo podias imaginar :) 2. 4.Busca un registro cuyo 'name' es 'Vista preliminar' (locate for name = "vist a preliminar") 3.hotsend...ZIP en la sección Archivos de mi página.Pincha el botón 'imprimir' (icono impresora) de la barra de herramientas y arrás tralo fuera de ella (desaparecerá de la barra) 8.Abre la tabla de recursos (use foxuser again shared) 2. fontstyle WITH 1 FOR objtyp e = 1 Con esto ponemos como predeterminado la fuente Tahoma a 12 puntos y negrilla.de informes) 3. Para evitar que lo vuelvan a poner: 1.Pincha con el botón derecho en cualquier barra de herramientas..com <http://www. Pablo Roca La Coruña . yo solo conozco una manera y se hace despues de crear el informe.t... -Saludos. fontsize WITH 12.hotsend.Elige la opción 'personalizar' (Aparece la ventana 'Personalizar barra de herr amientas.dbf y foxuser. Fuente predeterminada Bueno. si en fontstyle ponemos 0 tendremos letra normal.. me explico: 1.España <http://pagina.') 7. 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. Enviar un informe por e-mail Mira.com> en el la lo puedes bajar. Es una clase que te facilita la vida a la hora ... Application oExcelApp.lcLastCell..PageSetup.EntireColumn...1) && i.Range("A" + alltrim(str(nTOPBLANKROWS+1)) + ":" + lcLastCell).Select oExcel..SpecialCells(xlLastCell).mitrompo.. endif * hacer a Excel visible durante desarrollo *oExcel.t.lnStartPos oExcel.t.lcLastCell.t.SheetsInNewWorkBook = 1 oWorkbook = oExcel.e.Application") if vartype(oExcel) != "O" * mostar mensaje de error aqui return .visible = .Open(cFileName) * enombrar la página (shhet) a lo que quiera oActiveSheet = oExcel.Selection.F.lnStartPos.lnStrLen)).ActiveCell.Workbooks.AutoFormat(xlRangeAutoformatClassic2.de generar reportes para impresoras matriciales. (lcLastCell.t.) * marcar area a imprimir oActiveSheet.PrintArea = "$A$1:" + lcLastCell * definir pie de página With loActiveSheet... incluyendo ruta *copy to (cFileName) fields (cFields) TYPE xls copy to (cFileName) TYPE xls * abrir excel y formatear datos oExcel = CreateObject("Excel..PageSetup . Victor Espina <http://www.. 1 when lcLastCell = "$AF$105" lnMarker2 = at("$".2) && i.ActiveSheet oActiveSheet. 4 when lcLastCell = "$AF$105" lnStartPos = lnMarker1 + 1 lnStrLen = lnMarker2 .e. * abrir el workbook oExcel.com/vespina> Imprimir con formato de Excel #define #define #define #define xlLastCell 11 xlMaximized -4137 xlRangeAutoformatClassic2 2 xlPortrait 1 use MyTable && or SELECT * INTO MyCursor cFileName = "MyXLSFile" && o lo que sea...Address() * ajustar ancho de columnas lnMarker1 = at("$".t .t.AutoFit * usar autoformat (aqui usamos 2 como ejemplo) oExcel.Name = "MyData" oExcelApp = oExcel.T.WindowState = xlMaximized * buscar dirección de la última celda lcLastCell = oExcel.Columns("A:" + substr . F.PrintGridlines = .CenterFooter = "&D" .LeftHeader = "" *. .prn to lpt1 set printer to set device to screen Informe con número total de páginas (Hoja x de y) Para imprimir un informe con un Pie de página que tenga el formato "Página # de #".MCP ---------------------------------------------------------Imprimir texto DOS desde VFP set printer to lpt1 set device to print copy file NomArchivo.T.dbf && tabla.*.F. . donde se indica el nº de página actual y el total de páginas del informe. && Para ejecutar la función 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 =. Para obtener el número total de páginas.CenterHeader = "" *. se debe usar una función definida por el usuario.F. es necesario ejecutar el informe dos veces.CenterHorizontally = . pgcnt = _PAGENO && Obtiene el número total de páginas RETURN '' ************FIN DE PROGRAMA*********************** .LeftFooter = "&BMy Footer goes here&B" . tal como se explica a continuación.Orientation = xlPortrait endwith * guardar Excel en formato nuevo (COPY TO XLS usa formato viejo) oWorkbook.F.PrintHeadings = .visible = .Save() * mostrar Excel al usuario oExcel.dbf es la tabla utilizada por el Informe pgcnt = 0 && Almacenará el número de páginas total check =.T. Para lanzar el informe se puede utilizar el siguiente código : **********PRINCIPIO DE PROGRAMA***************** CLEAR CLOSE DATABASES USE tabla. .RightHeader = "" .CenterVertically = . Espero te sea de ayuda -Alex Feldstein . .RightFooter = "Page &P" *.T. Emiliano.T..T.DOC_FileName="Wordprueba. En el Informe final.ReportForm("Clan_Email") IF nSucces = 0 = messagebox('siiiiiiiiiii'. Informes en miniatura Supongo que te imprime en miniatura cuando utilizas la cláusula PROMPT en el REPOR T FORM . si 'check' es. 48 ) else = messagebox('no funciona. se debe introducir: Página _PAGENO de PGCNT donde 'Página' y 'de' se pueden introducir mediante un objeto Etiqueta y _PAGENO y PGCNT serian las expresiones de dos objetos campo. 48 ) endif Saludos.com ----------------------ICQ 34013175 Informe en HTML ** Abri el table (esta o caulquira) USE d:\vfp50\samples\data\employee..La variable 'check' se utiliza para impedir que la función PGCNT() se ejecute más de una vez. -------------------------------------------------------------Mail to: Emil_39 ARROBA hotmail.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"..'') En el Pie de página del informe. 'pgcnt' tendrá el valor correcto.SaveFolder="C:\Temp\" oFrx2Word. La función IIF() comprueba si la variable 'check' es. la primera vez que se ejec uta el informe.. Se debe modificar el informe para introducir en la Banda de Resumen un campo con la siguiente expresión: IIF(check=."EXAMPLE. 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.T. Esta función simplemente almacena la variable _PAGENO en otra variable ll amada 'pgcnt'.FRX" ********************** Sebastián Menéndez.PGCNT().'. ejecutará la función PGCNT()... Yo evité el problema lanzando un SYS(1037) (creo que es ese) antes del REPORT FORM .doc" nSuccess=oFrx2Word... lnStartCopiesLine. =ReportCopias("c:\listados\mireport". lcBottom.FRX") lcFRX = lcFRX + ". Report form reporte while sigue() func sigue ** aqui chequear inkey() o algun flag activado con un ** on key . en lugar de añadir PROMPT. lcStartAtCopiesLine) lnLenCopiesLine = LEN(SUBSTR(lcStartAtCopiesLine.... 1. 4)) = ". lnStartCopiesLine) lnEndCopiesLine = ATC(vfCRLF...1) lcBottom = SUBSTR(EXPR. Imprimir varias copias de un informe Printjob _pcopies = total_copias report form informe noconsole to printer endprintjob Hay dos maneras posibles. Miquel Àngel Guerrero Interrumpir impresión O poner el UDF en el while del report form. 1. (LEN(lcTop) + lnLenCopiesLine)) lcNewExpr = lcTop + "COPIES=" + ALLT(STR(lnCopias)) + lcBottom ENDIF . lnEndCopiesLine . lcStartAtCopiesLine.ncopias) REPORT FORM . lnStartCopiesLine .1) FUNCTION ReportCopias LPARAMETER lcFRX. lcTop. EXPR) lcStartAtCopiesLine = SUBSTR(EXPR.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". lnLenCopiesLine.. lcAlias #DEFINE vfCRLF CHR(13) + CHR(10) IF !(UPPER(RIGHT(lcFRX. etc. Hay muchas formas.. ENDFOR 2) =ReportCopias("c:\listados\mireport". lnCopias LOCAL lcNewExpr. La primera es mas sencilla pero tiene el problema de q ue es bastante mas lenta 1) FOR i=1 To ncopias REPORT FORM . lnEndCopiesLine)) lcTop = SUBSTR(EXPR. EXPR) IF lnPos > 0 REPLACE &lcAlias. expu lsar una página en la impresora antes o después de un trabajo de impresión.. ENDPRINTJOB inicializa la impresora y algunas variables del sistema que afectan al resultado impreso.Abre el report USE (lcNomInf) AGAIN ALIAS (lcAlias) set step on GO TOP IF lnCopias > 1 *. FoxPress .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 María Guayán Tucumán . All rights reserved .frx' lcAlias = 'inform3' lncopias = 3 lcCopias = ALLTRIM( PADR(lnCopias.Enero de 2000 © 1999 FoxPress. &lcAlias. Con lo que bastaría 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.2) ) SELECT 0 *.fpress.. En la Ayuda dice que: PRINTJOB . Una vez salido del bucle deberíamos reestablecer el _PCOPIES = 1 . STUFF(&lcAlias. Puede enviar códigos de control a la impresora.Argentina Número de copias de un Report Por la Redacción de FoxPress <http://www. lnPos+7.EXPR WITH .. ENDPRINTJOB.Cambia el número de copias lnPos = AT('COPIES'. Tenemos varias opciones: El sistema clásico leía el código de dentro de la tabla del report y cambiaba el valor de la variable copias por las que te interesaba: el código que hace eso es: close all set defau to g:\ lcnomInf = 'inform3.. lcCopias) ENDIF ENDIF Otro sistema más sencillo es usar la órden PRINTJOB...com/> Otro problema común es el número de copias de un report. 1..EXPR.. inicializar el número de columna de la imp resora y controlar el número de copias impresas. 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:
[email protected]. con esto se mejora mucho la velocidad. Uno de los problemas más 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).Número total de páginas ************************************************************ * * Clase: report_contarpaginas * * Devuelve el número de paginas de un report * * Parametros: * * Nombre del report * * Ejemplos: * * lntotpaginas = report_contapaginas("minforme") * * Retorno * * El numero de paginas del informe.fpress.es> y a R afael Angel Ponce Yllanes <mailto:rafaelp@dms. el código para poder compaginar l as dos cosas es: REPORT FORM inform1 NOCONSOLE TO PRINTER PROMPT PREVIEW FoxPress . * * Nota * * * Creación : 08/09/1999 PRR * Ultima Modificación: 14/04/2000 RAPY Rafael Angel Ponce Yllanes <mailto:rafaelp@ dms.pe> * ************************************************************ PARAMETERS lc_report LOCAL nPaginas nPaginas = 0 DEFINE WINDOW x FROM 1. All rights reserved .pe> por la aclaración del NOCONSOLE.Enero de 2000 © 1999 FoxPress. Preview de Report con seleccionar impresora Por la Redacción de FoxPress <http://www.cam.com/> El Diseñador 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. pues bien. debes añadir 'nowait' a tu linea 'report' y en la siguiente linea de comando la instrucción 'hide/release windows'. 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 título a esa ventana: DEFINE WINDOW lw_report FROM 0. 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 podrías escribir: Define Class PreviewWindow As Form Name = "frmPreview" Caption = 'Report' WindowState = 2 Proc Init Parameters ThisTitulo If PCount()>0 This. Muchas veces lo mejor será cambiar el contenido del campo EXPR del primer registro del report para cambiar las dimensiones del report. Mira la función PRTINFO() para obtener las claves de las dimensiones e xactas.com/> Uno de los problemas más frecuentes con los report es la necesidad de adapta el ta maño al que te indica un cliente que quiere reaprovechar papel. All rights reserved Títulos de los Report Por la Redacción de FoxPress Cuando previsualizas un Report con la órden: REPORT FORM miForm PREVIEW El caption del report aparece en la ventana de previsualización. Por cierto. Murcia ****************************** Tamaño de Report Personalizado Por la Redacción de FoxPress <http://www.0 TO SROWS(). ¿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. FoxPress .Quitar barra de herramientas Fede. "My Custom Caption") REPORT FORM myrepform NOCONSOLE PREVIEW WINDOW frmPreview Truco para el preview de los reports .fpress.Febrero de 2000 © 1993-2000 FoxPress.Caption = ThisTitulo Endif This.Show EndProc EndDefine Y para invocarlo podrás escribir: Local oPrev oPrev = CreateObject("PreviewWindow". PIXELS WINDOW wPreview REPORT FORM (NombreInforme). dando algunas que otras vueltas. a ver si haces algo que valga para todo el grupo de fox que tanto te ha enseñado a ti" Y mira por donde.oPreview.oPreview. y me he dicho: "Venga Jesús.Height-22.Height-10.. pero algo de control dá. No es que sea la panacea universal.1. me ha salido la siguiente rut ina.oPreview.6.Width-8. MOUSE DBLCLICK AT oPreview. MOUSE CLICK AT oPreview.Height-10. PIXELS WINDOW wPreview ON KEY LABEL HOME.oPreview. PIXELS WINDOW wPreview ON KEY LABEL LEFTARROW.Spain ----------------------------------------------------------------------Siempre me han inquietado las vistas preliminares de los informes en VFP. Un saludo a todos: Jesús Sanz Aplicante . 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).oPreview. Últimamente he visto en el grupo que se han hecho varias consultas.. MOUSE DBLCLICK AT 18.Width-8. MOUSE CLICK AT oPreview. MOUSE CLICK AT oPreview. PIXELS WINDOW wPreview ON KEY LABEL RIGHTARROW.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. TITLE 'Vista preliminar' CLOSE SYSTEM NAME oPreview ZOOM WINDOW wPreview MAX ON KEY LABEL UPARROW. A ver si entre todo la mejoramos un poco: SET RESOURCE OFF PUSH KEY DEFINE WINDOW wPreview FROM 0.".0 TO 1. PIXELS WINDOW wPreview ON KEY LABEL END.Width-8.. PIXELS WINDOW wPreview ON KEY LABEL DNARROW.Height-35. lo vuelvo a enviar de nuevo con otro asunto.Width-22. acerca del tem a. MOUSE CLICK AT 5.Width-8. TO PRINTER PROMPT PREVIEW WINDOW wPreview POP KEY SET RESOURCE ON . ya sea desde el expl orador o desde vfp..zip poExplorer.EXE <http://www.SessionID = lnSessionID .com/miarchivo.Internet Conexión a archivo poExplorer = CreateObject("InternetExplorer.vicentetrapani.Argentina Ó Local lcCOMANDO lcCOMANDO = "START.Visible=.com/download/constant.signon && turns on OE if it is not already open. Release.T.T.Argentina Descargar archivos en realidad es muy facil descargar un archivo desde la web.miservidro. Dirección URL.Compose() .Navigate("ftp://www.message1) = "O" with Thisform.loExplorer Luis María Guayán Tucumán . Send mail with preset Text and an attachment: lnSessionID = thisform.Application") *-.Visible=.message1 . ver html para detalles.microsoft. por ej.exe> bueno.session1.zip") poExplorer. link -> <a href=www..Application") loExplorer.el sitio donde esta el archivo .Navigate("http://www.vicentetrapani.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. solo debes pedir al cliente que ejecute el archivo envez de abrirlo o que lo ejecute manualmente luego del download.SessionID If lnSessionID > 0 If vartype(thisform.Session1. Llamar a una loExplorer = CreateObject("InternetExplorer. 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. Release poExplorer -Luis María Guayán Tucumán .com") loExplorer. es <mailto:
[email protected] = "
[email protected] = .SignOff() Endif && lnSessionID > 0 Return READ MAIL: Thisform.save() .CreateItem(2) oContacto.change the message underneath Thisform.Message1.Message1.msgcount && How many pieces id we received? *-.Message1.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 *-. Agregar registros a Libreta de direcciones oOutlook = CreateObject("Outlook.department = "ventas" oContacto.Message1..AttachmentPathName = Thisform. && Type of Mail Thisform..fetchunreadonly = .attachmentname cd \ && lcCurdir for instance if lower(right(lcfile.MsgSubject = "New version of your program" .attachmentname lcfile = thisform.run through all the pieces looking for an attachment. If file(your file name here) Thisform.new For ms = 1 to ms1 *Wait wind Thisform.session1.msgindex = m Endif Next Outlook Express.Session1.Application") oContacto = oOutlook.sessionid && Session # Thisform.Send() Wait window nowait "Message sent.AttachmentName = Endif Endif Thisform. .lastname = "de los palotes" etc.AttachmentIndex = 0 ..f.msgorigaddress *Wait wind thisform.firstname = "Pepito" oContacto.RecipAddress = endwith If thisform..companyname = "Empresa 3" oContacto.businesstelephonenumber = "999876543" oContacto.." Endif && vartype(thisform.fetch && Get it m = 0 ms1 = thisform.message1.sessionid = thisform.message1.Message1.message1.Message1.Message1. oContacto.MsgNoteText = " Message Text here " .MsgIndex = -1.message1) = "O" Thisform. XXXX.message1.t.Message1.es>" oContacto. -Saludos.G.FileAs endwith endfor Salu2 Ariel Gimenez . Libreta de direcciones o = createob('outlook. ----------------------------Carlos Yohn Zubiria A.getnamespace('mapi') ocarpetacontactos = ospace.P.items for each persona in contactos with persona wait window .application') ospace = o. Outlook Express.getdefaultfolder(10) contactos = ocarpetacontactos. universalthread.1 VFP usa la función RGB(255.. ** La cantidad de colores es 2 ** nBitsPixel (ej.255.) **-------------------------------------------------------------------------FUNCTION GetBitsPixel LOCAL nBitsPixel.com <http://www. 16 = 65 536.215 es (256^3) . nAzul) y la fórmula es: . Integer ReleaseDC in User32 Integer.: 8 bits = 256 colores. Integer hWnd = GetDesktopWindow () hSrcDC = GetDC (hWnd) nBitsPixel = GetDeviceCaps (hSrcDC. nVerde.255) donde: nColor = RGB(nRojo.. Salu2 Ariel Gimenez Colores. . hWnd DECLARE DECLARE DECLARE DECLARE Integer Integer Integer Integer GetDesktopWindow in User32 GetDC in User32 Integer GetDeviceCaps in Gdi32 Integer.777.com> y en la seccio n archivos hay ejemplos de como hacer esto con funciones de la API. Calcular 16.LanguageId= "&HC0A" Para Ingles: Merlin.LanguageID = 1033 Saludes Sergio Rocha Tenorio Pantalla Cantidad de colores ** GetBitsPixel () -> nBitsPorPixel ** Devuelve la cantidad de bits por pixel.Ms Agents Idioma Para Español: Merlin. 12) ReleaseDC (hWnd. hSrcDC) RETURN nBitsPixel Capturar la pantalla Entra en www.universalthread.LanguageID = 3082 Merlin. hSrcDC. 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. '') *!* Mostrar la barra de tareas IF lnHwnd <> 0 SetWindowPos(lnHwnd. 0. INTEGER hwndInsertAfter. . INTEGER x. 0. INTEGER wFlags *!* Valores lnHwnd = FindWindowA('Shell_traywnd'. INTEGER x. TOGGLE_UNHIDEWINDOW) ENDIF ENDFUNC Resolución en pantalla Esta es la más rápida que he encontrado. '') *!* Ocultar la barra de tareas IF lnHwnd <> 0 SetWindowPos(lnHwnd. INTEGER cx. 0.nAzul * (256^2) + nVerde * 256 + nRojo Ocultar/Mostrar la barra de tareas de Windows Aquí va el código Saludos Alexandre ahedreville@krafteurope. 0. INTEGER y. 0. INTEGER hwndInsertAfter. 0. INTEGER cy.com <mailto:ahedreville@krafteurope. STRING lpWindowName DECLARE INTEGER SetWindowPos IN Win32API INTEGER hwnd. INTEGER wFlags *!* Valores lnHwnd = FindWindowA('Shell_traywnd'. INTEGER y. 0. INTEGER cx. 0. 0.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. INTEGER cy. 0. STRING lpWindowName DECLARE INTEGER SetWindowPos IN Win32API INTEGER hwnd. 600 ?GeTSystemMetrics(16) && Devuelve la resolución horizontal. Conocer .DECLARE Integer GetSystemMetrics IN Win32API Integer nIndex ?GeTSystemMetrics(1) && Devuelve la resolución vertical. 800 Josep Redes Dominio. lnMin. INTEGER ln DECLARE SetSystemTime IN WIN32API . cambia la hora de la PC * por la fecha-hora de la PC remota "tcSrv" * PARAMETROS: * tcSrv: Nombre de la PC remota * tlSet: . ln.Si se cambió la fecha-hora correctamente * -1 . Guayán. . . . @lnPtr) IF ln = 0 lcToD = REPLICATE(CHR(0). lnSeg DECLARE INTEGER NetRemoteTOD IN NETAPI32 .UserDomain ? oWsh. STRING lcStrDW DECLARE GetTimeZoneInformation IN KERNEL32 .UserName ? oWsh. lnPtr. STRING @lpTZI tcSrv = STRCONV(STRCONV(tcSrv. lnAno.F. INTEGER @lnPtr DECLARE RtlMoveMemory IN WIN32API . lnDDS. tlSet) *-------------------------------------------------------------* Retorna la fecha-hora de la PC remota "tcSrv" * Si "tlSet" es .1). lnMes.ComputerName Ramon Giubi Hora del servidor Estas rutinas las envio Luis M.No se pudo cambiar la fecha-hora * -2 .Fijate si asi te sirve: oWsh = CreateObject("WScript. STRING @lcToD. lnPtr.con esta función puedes tomar ó sincronizar la fecha-hora de un servidor: *-------------------------------------------------------------* FUNCTION NetDateTime(tcSrv.5) + CHR(0) lnPtr = 0 ln = NetRemoteTOD(@tcSrv.. INTEGER lnPtr.) * AUTOR: LMG *-------------------------------------------------------------FUNCTION NetDateTime(tcSrv. 37. lpTZI. 4)) . lnDia.Si cambia la hora de la PC * RETORNO: * DateTime: La fecha-hora de la PC remota * Numérico: 0 . lcToD. . 45. tlSet) LOCAL lRet. .T.No se encontró la PC remota * USO: ? NetDateTime("\\MiServidor". lnZT. 48) lnAno = DW2N(SUBSTR(lcToD. lcStrDW. 4)) lnMes = DW2N(SUBSTR(lcToD. . lnHor. 48) ln = RtlMoveMemory(@lcToD.T. 41. STRING @lcSvr.. .Network") ? oWsh. 4)) lnDDS = DW2N(SUBSTR(lcToD. . lnMes..... ASC(SUBSTR(tcDW... 1))*(256^2) + . DW2N(SUBSTR(lcToD.. 0.... 1))*(256^3) + ... ASC(SUBSTR(tcDW. 1. .. -1) ELSE lpTZI = SPACE(255) ln = GetTimeZoneInformation(@lpTZI) lnZT = DW2N(SUBSTR(lpTZI............lnDia lnHor lnMin lnSeg = = = = DW2N(SUBSTR(lcToD.. -Luis María Guayán Tucumán . lnSeg) + lnZT * 60 ENDIF ELSE lRet = -2 ENDIF RETURN lRet ENDFUNC * .com/support/kb/articles/Q249/7/16.. 1)) ENDFUNC * . 2.. ASC(SUBSTR(tcDW.. 13..... DW2N(SUBSTR(lcToD. N2DW(lnDDS) + N2DW(lnDia) + .* FUNCTION N2DW(tnN) * Usada por NetDateTime() * .. 17. N2DW(lnHor) + N2DW(lnMin) + . en el artículo Q249716 <http://support... 4)) 4)) 4)) 4)) IF tlSet lcStrDW = N2DW(lnAno) + N2DW(lnMes) + ...Argentina SQL ........... lnDia...... DW2N(SUBSTR(lcToD...... En dicho artículo hay un ejemplo para VFP6.. 4. leyendo la Base de Conocimientos de Microsoft. 1))*(256) + ... N2DW(lnSeg) + N2DW(0) lRet = IIF(SetSystemTime(lcStrDW)... 33.FUNCTION N2DW(tnN) RETURN CHR(MOD(tnN. lnMin. lnHor... (siempre hay un pero)... 3. 256)) + CHR(INT(tnN/256)) ENDFUNC - - *-------------------------------------------------------------Pero....* FUNCTION DW2N(tcDW) * Usada por NetDateTime() * . 09.ASP> dice que la función API NetRemoteTOD solo funciona con Windows NT y Windows 2000..microsoft..lnZT ELSE lnZT = (-1) * lnZT ENDIF lRet = DATETIME(lnAno...... 2)) IF lnZT > 720 lnZT = (2^16) ... 1.......FUNCTION DW2N(tcDW) RETURN ASC(SUBSTR(tcDW.. net> Valores .NULL....0).NULL.. Si tu quieres todos los registros de la tabla Elementos.. para que no te salga e l valor .NVL(detalles. .Buscar palabra en tabla lcBusca = "%" + Cadena + "%" Select * from tabla where campo LIKE lcBusca -Atentamente.. --------------------------------------Pere Pujol i Espuña <mailto:
[email protected]. en las consultas debes especificar los campos como: . .Cambiar por C(250) 2..txt (crear cuando necesario) y utilizar control Rich Text Crear tablas con campos variables cCmd="CREATE TABLE 'tempo. si tuvo éxito *-------------------------------------------------------* FUNCTION FindField(lcCampo. lcAlias) *-------------------------------------------------------* Busca un nombre de campo en una tabla y retorna . si tuvo exito.Substituir por fichero ." + cCampo + " N (12.". UPPER(lcCampo)) ENDIF ELSE ln = 0 MESSAGEBOX("El alias no existe.2) NOT NULL" endfor &cCmd Crear tablas de referencias cruzadas ID Artículo: .TIPO C(10) NOT NULL" for i=1 to nCount cCampo=aCampos[i] cCmd=cCmd + ".T. lcAlias) IF ln > 0 ln = ASCAN(MiArray.T.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 . * USO: ? FindField("MiCampo".16) ENDIF RETURN ln # 0 ENDFUNC Campos memo Dada su problemática: 1.dbf' name tempo (obra c(10) NOT NULL. "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.NOMB_OBR C(40) NO T NULL. querremos obtener una tabla de referencias cruzadas.QPR) a partir de una tabl a (. Para visualizar este tipo de información es muy útil usar el formato Hoja de Cálculo.DBF) que contiene los datos. el empleado E1. rápidamente se ve cuánto ha vendido en el Mes1. 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. podemos coger el código SQL generado. versión 3. Regularmente. Una vez que este asistente nos ha creado la consulta (.0 / 5.DBF') que va a contener los datos para la Consulta de Referencias Cruzadas. Por ejemplo.0 / 5. supongamos que tenemos una tabla de empleados en la que almacenamos la ventas que al mes realiza cada empleado. Por ejemplo: 1.0 5.0 para la visualización de datos de una tabla en forma de Hoja de Cálculo. Este tipo de Tablas de Referencias Cruzadas son muy usadas en Microsoft Access. Hay un Asistente (se ejecuta accediendo al menú de Visual FoxPro : Herramientas / Asistentes / Consulta /Asistente para tablas de Referencias Cruzadas / en la versión inglesa sería el menú: Tools / Wizards / Query / Cross-Tab Wizard) para crearlas. Creamos una Tabla (por ejemplo. Por ejemplo: EMPLEADO Mes1 Mes2 Total --------------------------------E1 11 12 23 E2 5 7 12 En esta consulta. MÁS INFORMACIÓN En Visual FoxPro 3. con la siguiente estructura: campo 1: Empleadocarácter(2) campo 2: Mesnumérico(2) campo 3: Ventasnumérico(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 .Fecha de Creación: Fecha de Revisión: E10119 22-nov-1996 19-APR-1997 La información en este artículo se refiere a: -Microsoft FoxPro. en el Mes2 y en el Total de ambos meses.0 se pueden crear Tablas de Referencias Cruzadas (que v isualizan los datos en formato hoja de cálculo) como las de Excel mediante programación. por ejemplo. y cuando ha vendido en el total de los meses. nombre: 'REFSCRUZ. donde podremos ver en forma de filas por columnas esta información. en la que de un rápido vistazo podamos ver cuánto ha vendido cada empleado por mes.0 RESUMEN Este artículo le infroma sobre la creación y visualización de Tablas/Consultas de Refe rencias Cruzadas en Visual FoxPro 3. 0) con la tabla 'REFSCRUZ.16. SUM(REFSCRUZ..t. en respuesta a un evento de un objeto concreto (por ejemplo en el evento click de un botón de comando con el título (caption) "Visualizar Tabla de Referencias Cruzadas"). El resultado de ejecutar la consulta o ese código en un.Empleado..t..Empleado.PRG) con el código anterior y ejecutarlo en nuestra aplicación. El Código que genera el Asistente de Referencias Cruzadas basado en la tabla 'REFSCRUZ. REFSCRUZ.DBF' al usar como campo Fila (Empleado)..0 / 5. REFSCRUZ.". con DO xxx. INTO CURSOR SYS(2015) DO (_GENXTAB) WITH 'Asiscons'. te recomiendo modificar el procedimiento para detectar cuando la tabla esta vaci a. REFSCRUZ.DBF' dada como ejemplo en este artículo: 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. se visualice de forma automática la tabla de referencias cruzadas..PRG (programa de VFP 3.VALUE if !eof() and LcRecno!=Recno() Messagebox("La clave ya existe..DBF' REFSCRUZ.Mes. de tal forma que cuando el usuario haga click en dicho botón del formulario.t.E2 1 2 E2 2 4 E2 2 2 E2 2 1 2.. como campo Columna (Mes) y como Valor (Ventas..Mes."Validación de campo") return 0 ENDIF go Lcrecno Con este procedimiento espero que soluciones el problema Nota: Tener en cuenta que esta validación es optima y sin ningun error cuando la t abla tiene como mínimo 1 registro ya digitado.t.Empleado.0 BROWSE NOMODIFY Podemos crear un programa (xxx. ORDER BY REFSCRUZ.Mes... operación: Suma) es el siguiente: SELECT REFSCRUZ.. GROUP BY REFSCRUZ. FROM 'REFSCRUZ.PRG.Ventas)... Insertar registro en una posición GO RECO 5 INSERT BLANK BEFORE . universalthread. ya que es muy lento y además necesitas abrir la tabla en forma exclusiva.) . Tablas que pertenecen a una DBC Puedes cargar los nombres de las tablas en un vector: OPEN DATABASE P:\MiDataBase ln = ADBOBJECT(MiVector. 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 Reparación de encabezado (Tabla) En UniversalThread (www.universalthread. clientes.pero a menos que esto lo estes haciendo sobre un cursor temporal de L/E.F.F.com <http://www.T."Caption") -Victor Espina <http://www. "TABLE") FOR EACH lc IN MIVector ? lc ENDFOR -Luis María Guayán Tucumán ..forzar la grabacion aunque hubiera cambios de otro usuario * tlanularsifalla .. articulos". tienes una utilidad (CMRepair) que te lo hace.mitrompo.Argentina Título del campo cTitulo=DBGETPROP("Tabla.Columna".descartar los cambios en el buffer si falla la transac cion * * Ejemplos: * * llret = GoCsApp.com>) en la seccion de archivos.io_transaccion("lv_ventas.io_transaccion("lv_ventas.. articulos") * llret = GoCsApp.com/vespina> Transacción ************************************************************ * * Función: IO_TRANSACCION * * Realiza una transacción con las tablas pasadas entre comas * * Parametros: * * tctablas .. clientes.T.) es igual que la anterior * llret = GoCsApp. articulos".io_transaccion("lv_ventas.tablas que participan en la transaccion (entre comas) * tlforzar .. me uno al consejo general de no intentar este tipo de manejos sobre tablas medianas o g randes."FIELD".. clientes. si tlanularsifalla es .htm> * * Importante reseñar 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.T.48. 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. llRollBack.patabla [lni]) llRollBack = . tlanularsifalla LOCAL lnnumtablas.. Indicando si se pudo o no realizar la transacción * * Nota * * La tablas deben estar abiertas * * Usa la funcion st_partes <.T./faq/formularios/00049.T. debe haber al menos una tabla".tctablas)<>0 ST_PARTES(tctablas.esto lo haria Jim Booth * * Retorno * * ."ATEN CION") llret = .T."patabla") ENDIF lnnumtablas = ALEN(patabla) IF PCOUNT()=0 OR lnnumtablas = 0 MESSAGEBOX("Error de parametros.T. lni PRIVATE patabla DIMENSION patabla[1] patabla[1] = "" *valores por defecto LOCAL llforzar llforzar = . llret. * o no se pone este parametro * * Creación : 17/04/2000 PRR * Ultima Modificacion: 30/04/2000 PRR * ************************************************************ FUNCTION IO_TRANSACCION PARAMETERS tctablas. T. / .F. IF PCOUNT()<>0 AND AT(".F.llforzar. . tlforzar. llRollBack = .".F. LOCAL llanularsifalla llanularsifalla = . llret = . patabla[lni]) ENDFOR ENDIF lnret = .ENDFOR EXIT ENDIF zacion IF llRollBack ROLLBACK IF llanularsifalla FOR lni = 1 TO lnnumtablas =TABLEREVERT(.F.T. && error en la grabacion/actuali ELSE END TRANSACTION ENDIF ENDIF RELEASE patabla RETURN llret .. Shell" ) SET DIRECTORY TO (oWshShell. oWshShell.lnk") oLnk.Description = "Currently running script.The following properties are only available for normal short cuts.lnk>" oLnk.Get extension.SpecialFolders("Desktop")) * * DCC . oShortCut.Fullname *!* . cExt = UPPER( pciAllTrim( JUSTEXT( cShortCutName ) ) ) lNormalShortCut = ( cExt == "LNK" ) * * DCC . Determine if this is a URL shortcut or a normal (lnk) shortcut. cExt * cOldDir = SET("Directory") * * DCC .Use your WSH object to create your shortcut.TargetPath = cDesktopDir + "\\notepad.CreateShortcut( cShortCutName ) * DCC .CreateShortcut(cDesktopDir + "\\Shortcut <file://\\Shortcut> to Note pad." *!* loShortCut. 0" *!* loShortCut. USA -------------------------------------------Ó Aqui tienes una solucion enviada por Fernando Suarez al grupo: ********************************************* function CreaAccesoDirecto(cShortCutName. *!* IF llNormalShortCut * *!* * DCC .lnk <file://\\notepad.Below are other properties and examples of setting them.Hotkey = "ALT+CTRL+F" *!* loShortCut.IconLocation = "notepad.Create your windows scripting host (WSH) shell to enable a move to the desk top directory oWshShell = CreateObject( "WScript. FL.Save() -Alex Feldstein .Set your properties and save the shortcut oShortCut. lNormalShortCut. *!* loShortCut.MCP Miami.SpecialFolders("Desktop") oLnk = oWsh.TargetPath = cTargetPath * *!* * DCC .Varios Acceso directo en el escritorio Puedes usar Windows Script Host: oWsh = CreateObject("WScript.exe.cTargetPath) ********************************************* * LOCAL cOldDir.WorkingDirectory = "c:\" *!* *!* * DCC .Shell") cDesktopDir = oWsh.Display full path of the executable *!* ?loShortCut.WindowStyle = 7 && minimized *!* loShortCut. oShortCut = oWshShell. which is why we moved to the directory *!* * DCC .AddObject('C_LISTAACTUAL1'.guate.Must save the short cut. yo un cursor que a cada rato lo modifico select distinct queja.Visible = . The short cut saves in the current directory. && Make Line control visible thisform.guate.España ICQ 5035887 Sysop del Portal Gratuito de VisualFoxPro en Español <http://clik. sin mayor inves tigacion pero me funciono y ahora trabajo solo asi con los grid.to/visualfox> Actualizar el cursor de un grid Tuve un problema similar y lo solucione de la forma mas salvaje.*!* ENDIF * *!* * DCC . Por ejemplo.C_LISTAACTUAL1.orden .net <mailto:Xproca@clavo. Integer dwReserved Algunoa de los valores para uFlags pueden ser: 0 = Reinicia windows.C_LISTAACTUAL1.net>) (quitar la X) La Coruña .dll" Integer uFlags.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.net> Apagar el PC Declare Integer ExitWindowsEx in "user32. * oShortCut.Top = 27 && Specify Line control row thisform. .RemoveObject('c_listaactual1') thisform. rzarza@un. Convierte el grid en un objeto.Save * * DCC .Now move back to your starting directory SET DIRECTORY TO (cOldDir) * -Saludos.prior to creating the shortcut.'C_LISTAACTUAL') && Add a Line control to th e form thisform. id_queja from principal into cursor Lista order by principal. 1 = Apaga el sistema. cuyo recorsource sea el cursos que actualizas y cada vez que modificas el cursors saca y vuelve a poner el objeto del grid. Pablo Roca (
[email protected]_LISTAACTUAL1.net <mailto:rzarza@un. principal.T.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. DLL STRING lpPathName. y guardar la informacion que contiene como se guardaría en memoria. y perdón por el retraso.suma.es <mailto:rcano@borsan. 4) + . CC: Dígitos de control.T. Release. Desarrollo Informática Borsan. STRING @lpSecur ityAttributes La estructura de SECURITY_ATTRIBUTES.k.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 .poExplorer C.L. REPLICATE(CHR(0).altavista. 4) -rcano@borsan. Datos TYPE La declaración quedaría asi: DECLARE LONG CreateDirectory IN kernel32. REPLICATE(CHR(0). si mandamos la vacía para que coga los val ores por defecto de seguridad sería lo siguiente : lpSecurityAttributres = CHR(12) + REPLICATE(CHR(0). c/Antonio López. 3) + .0) Api. la tienes que pasar a string. XXXXXXXXXX: Cuenta pa rticular]): Pues ahí va: ***************************************************** Enviamos la Cuenta a validar como parámetro ***************************************************** lparameters Cuenta DECLARE pesos(10) LOCAL i. Dígito de control Hace unos días.Visible=.es> Rafael Cano Palomino Dpto.Navigate("http://www.Application") poExplorer. EEEE: Código de la Entidad.j. un compañero me pidió que le enviara como hacer el cálculo de los dígitos de control de la Cuenta Corriente Bancária (para los bancos españoles -> BBBB-EEEE-C C-XXXXXXXXXX [BBBB:Código del Banco. En el caso que has mandado. 249 .C.3º J Madrid (España) Arrancar el Internet Explorer e ir a una página Web poExplorer = CreateObject("InternetExplorer. S. Ej: ExitWindowsEx(1. Y el valor para dwReserved siempre debe ser 0.2 = Reinicia el sistema.com") poExplorer.C. 11) j=iif(j=0.1))*pesos(k)) j=j-1 k=k+1 ENDFOR j=MOD(suma.10.pesos(10)=1 IF !empty(Cuenta) IF len(alltrim(Cuenta))<23 k=0 FOR i=1 to 4 k=k+val(substr(Cuenta. ENDIF Copiar al portapapeles cValorMemo=tutabla.j) j=iif(j=1."¡ Atenc ión !"!")) return .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.campo _cliptext = cValormemo .64."¡ Atención !") return .1))=(11-j) IF val(substr(Cuenta.11.1)) ENDFOR IF k<>0 =MESSAGEBOX("Cuenta erronea.f.64. Faltan dígitos".11.f.f.11) k=MOD(suma1. No corresponde el primer dígito de control". ENDIF ELSE =MESSAGEBOX("Cuenta erronea.f.i.1)) suma=suma+(val(substr(Cuenta. ENDIF ENDIF RETURN .64. ELSE RETURN .10."¡ Aten ción !") return .j. ENDIF ELSE j=9 k=1 suma=0 suma1=0 FOR i=1 to 9 IF isdigit(substr(Cuenta.i.1))<>(11-k) =MESSAGEBOX("Cuenta erronea.j.k) IF val(substr(Cuenta.j) k=iif(k=0.k) k=iif(k=1. No corresponde el segundo dígito de control".t.12.11. t1.Continuado * RETORNA: .T.Navigate("<http://www. Drivers.midireccion.Drives ? oDrive. Si el sonido fue ejecutado *-----------------------------------------------lnPlayType = IIF(TYPE("lnPlayType")="N".T.Visible=.value='' && Cut luego del copy _cliptext=t1. pero podés usar _cliptext para copy/cut/paste.selstart.WAV" ?? CHR(7) SET BELL TO ó *-----------------------------------------------*FUNCTION PlayWav(lcWaveFile.lnPlayType. Listar Para listar drives: oFSO = CREATEOBJECT("Scripting.WAV * USO: _PlayWave(<Arch_WAV> [.Apaga el sonido que se está ejecutando * 8 .MCP Ejecutar un sonido Yo pongo los ficheros de sonido en una carpeta.1) .Application") loExplorer. t1 y t2 por ejemplo podes hacer: _cliptext=t1.seltext && Copy del texto seleccionado t1. '') && Cut luego del copy t2. con formato WAV y en el código de un objeto pongo lo siguiente: SET BELL TO "NO.value && Copy de todo t1.<Tipo_Ejecucion>]) * Arch_WAV = Ruta completa del archivo .DriveLetter ENDFOR -Alex Feldstein .sellength. etc.FileSystemObject") FOR EACH oDrive IN oFSO. por ejemplo si t enes dos textboxes (string).Copiar.lnPlayType) *-----------------------------------------------* Ejecuta un archivo . no ejecuta el default * 4 .value=stuff(t1. Hugo Conectar a Internet loExplorer = CreateObject("InternetExplorer. cortar y pegar No se si te sirva.WAV * Tipo_Ejecucion = 1 .value.Si el archivo no existe.value=_cliptext && Paste Deberias verificar algunas condiciones. t1.com>") loExplorer.Ejecución en background (default) * 0 . como por ejemplo sellength>0.La aplicación espera la ejecución * 2 . . clave clave = ')&H%$V1#@^+=?/><. j.j.1)). .1)). letra clave = ')&H%$V1#@^+=?/><.1))) .F.C." ..ASC(SUBSTR(clave.. .:MN*-' TextoEnc = SPACE(0) C=1 FOR j = 1 TO LEN(texto) letra = MOD(ASC(SUBSTR(texto.:MN*-' Texto = SPACE(0) C=1 FOR j = 1 TO LEN(TextoEnc) letra = MOD((256+ASC(SUBSTR(TextoEnc. INTEGER nType RETURN IIF(PlaySound(lcWaveFile.dll . STRING cWave.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. TextoEnc.) ENDFUNC *-----------------------------------------------Encriptación de cadenas FUNCTION FnEncripta(Texto) * -----------------------------------------------* Encripta un texto * USO: FnEncripta("Texto a encriptar") * RETORNA: Texto encriptado * -----------------------------------------------LOCAL Clave. .j.1)) + ASC(SUBSTR(clave.DECLARE INTEGER PlaySound . INTEGER nModule. c. 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 = "
[email protected]. IN WINMM.com" strSubject = "Asunto" strBody = "Este es el mensaje.lnPlayType) = 1. j. .0. Send theNameSpace. INTEGE R hWnd = GetHwndForm(THISFORM) iDrive = 0 IF hWnd <> 0 THEN Resultado = SHFormatDrive(hWnd. para 3. para 5.delrina.SetCompany("Alguna Compañía") oWinFax.DLL" INTEGER. INTEGER.SetSubject("Test Fax") oWinFax. SHFD_FORMAT_QUICK) ENDIF *========================================================== * Esta función recibe una referencia hacia el formulario y devuelve el HWND * (window handle) de esta ventana o formulario.theApp = CreateObject("Outlook. iDrive.MCP Visual FoxPro Formatear un diskette SHFD_CAPACITY_DEFAULT = 0 &&' capacidad del drive por default SHFD_CAPACITY_360 = 3 &&' 360KB. Envio desde VFP Winfax funciona muy bien.Subject = strSubject theMailItem.SDKSend") oWinFax.GetNameSpace("MAPI") theNameSpace.SetAreaCode("555") oWinFax.5" : -( SHFD_FORMAT_QUICK = 0 &&' formato rápido SHFD_FORMAT_FULL = 1 &&' formato completo SHFD_FORMAT_SYSONLY = 2 &&' copia solamente los archivos del sistema (Solo Win95 ) DECLARE INTEGER SHFormatDrive IN "SHELL32.AddAttachmentFile("") && aqui va archivo si quieres oWinFax.SHFD_CAPACITY_DEFAULT. strPassword) theMailItem = theApp.SetPrintFromApp(1) oWinFax.25" :-) SHFD_CAPACITY_720 = 5 &&' 720KB.Recipients.Send(1) SET PRINTER TO NAME winfax REPORT FORM MyReport TO PRINT NOCONSOLE SET PRINTER TO RELEASE oWinFax HTH -Alex Feldstein .Application") theNameSpace = theApp. (<http://www.com/)> Lo puedes manejar facilmente a través de COM: oWinFax = CreateObject("WinFax.AddRecipient() && requerido oWinFax.SetNumber("1234567") oWinFax.Body = strBody theMailItem. . INTEGER.Logoff Fax.Logon(strProfile .CreateItem(0) theMailItem.Add( strRecipient ) theMailItem. *========================================================== Function GetHwndForm LParameter toForm Local lcCaption lcCaption = toForm.Caption toForm.Argentina Función de consecutivos FUNCTION NUEV(tcAlias) public lnID LOCAL lcAlias.lcCaption Return m.nextid . "cont".fpress.Caption = m. lnOldArea lnOldArea = SELECT() IF PARAMETERS() < 1 lcAlias = UPPER(ALIAS()) ELSE lcAlias = UPPER(tcAlias) ENDIF lcOldReprocess = SET('REPROCESS') *-.com/revista/Num0011/dtruco.dll. "table") IF RLOCK() lnID = cont.htm> run/n rundll32.SHFormatDrive -Luis María Guayán Tucumán .Caption) ) toForm.Lock until user presses Esc SET REPROCESS TO AUTOMATIC IF !USED("cont") USE nominas!cont IN 0 ENDIF SELECT cont IF SEEK(lcAlias.Caption = Sys(3) If not "FOXTOOLS" $ Upper( Set("Library") ) Set Library to (Home()+"\FoxTools. . lcOldReprocess.exe shell32. .lnHWND Formatear un diskette (1) Mira este truco que apareció en FoxPress de Noviembre de 2000 <http://www.Fll") Additive Endif Local lnHWND lnHWND = _WhToHwnd( _WFindTitl(toForm. despues en el procedimiento donde quieras que se realice el marcado incluyes: MSCOMM.STDev(23. se pueden aprovec har las funciones de Excel (que son muchas) desde VFP.REPLACE cont. (Obvio que debes tener instalado Excel en la PC). donde tengas ta mbien una caja de texto para ingresar el numero. que en este caso no sea lo óptimo.FileSystemObject") lcSerialNumber = lofso.WorksheetFunction. -Luis María Guayán Tucumán . Para el caso de la Desviación Estándar: loExcel = CREATEOBJECT("Excel. el modem marcar el numero indicado Saludos.Application") ln = loExcel.COMMPORT=1 (Supongo el modem conectado al com1) MSCOMM.T. pero en otras funciones de Exc el sí.OUTPUT = "ATDT "+Numero+chr(13) Y listo. "Desviación Estándar") RELEASE loExcel Es una opción mas.33. "aeiouAEIOU") Funciones matemáticas Aunque ya VFP trae la función STD() para registros de una tabla.30) MESSAGEBOX(TRANSFORM(ln).Argentina Marcador telefónico Puedes hacerlo con mscomm (El ocx) lo insertas en un formulario.nextid WITH cont. espero que te sirva Emilio Fernandez Número de serie del disco loFSO = CREATEOBJECT("Scripting.26.PORTOPEN=. MSCOMM.N.nextid + 1 UNLOCK ENDIF ENDIF SELECT (lnOldArea) SET REPROCESS TO lcOldReprocess idinf=lnID RETURN lnID ENDFUNC Función para quitar acentos lc = "Luis María Guayán. Tucumán" ? CHRTRAN(lc. "áéíóúÁÉÍÓÚ".8.drives("c:").0.22.32.SETTINGS="9800.serialnumber o también: .1" MSCOMM. "File Sys Name Size: " + . LEFT(ALLT(lpVolName). . INTEGER nFSSize lnRet=GetVolInfo(@lpRoot. ALLT(STR(lpVolNumber))+CHR(13)+ .LEN(ALLT(lpVolName))-1)+CHR(13)+ . 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 . ALLT(lpRoot)+CHR(13)+ . ALLT(STR(lpMaxComp))+CHR(13)+ . STRING @lpRoot. nFSSize) IF lnRet > 0 lcString = "Drive name: " + . lpMaxComp. lpVolNumber. . .*----------------------------------------------FUNCTION GetVol(lpRoot) *----------------------------------------------* Nuestra información del volumen * USO: GetVol("C:\") * PARAMETRO: lpRoot = LetraDrive + ":\" *----------------------------------------------LOCAL lnRet. . "File Sys type: " + . INTEGER @lpFlags. IN Win32API AS GetVolInfo . LEFT(ALLT(lpFSName). .LEN(ALLT(lpFSName))-1)+CHR(13)+ . . . ALLT(STR(lpFlags))+CHR(13)+ . "Max #/chars in vol name: " + . @lpFlags. lpVolName. "File Sys Flags: " + . INTEGER nVolSize. "Información del volumen") . "Max #/chars in dir/file names: " + . STRING @lpVolName. "Vol Serial #: " + . . INTEGER @lpVolNumber. nVolSize. @lpVolNumber. @lpFSName. "Vol name: " + . lcString. ALLT(STR(nFSSize)) ELSE lcString = "No se pudo ver información" ENDIF =MESSAGEBOX(lcString. lpFlags. . nVolSize. . . INTEGER @lpMaxComp. @lpMaxComp. lpFSName. STRING @lpFSName. . ALLT(STR(nVolSize))+CHR(13)+ . @lpVolName. . 10).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).2.10).INT(((LEN(ALLTRIM(STR(INT (MI_NUMERO))))+2)/3))*3) C_DECIMAL=RIGHT("00"+ALLTRIM(STR((MI_NUMERO-INT(MI_NUMERO))*100)).CENTENA(10) RC=IIF(VAL(C_ENTERO)=0.RETURN "" ENDFUNC Leonardo Velazquez Números a letras Hola Visualfoxproeros. DECENA(1.C_ENTERO. Ahí les mando una rutina sencilla para pasar números a letras : NOTA : ABRAN LA VENTANA AL MÁXIMO."") FOR i2=1 TO IIF(VAL(C_DECIMAL)>0.3) PUBLIC DIMENSION CENTENA(1."CERO". UNIDAD(1. HAY LÍNEAS QUE TERMINAN EN PUNTO Y COMA **************************************************************************** * PROCEDURE NTOL **************************************************************************** * PARAMETERS MI_NUMERO PUBLIC C_ENTERO.1) VALOR_N=IIF(i2=1.DECENA(10). C_DECIMAL C_ENTERO=RIGHT(("00"+ALLTRIM(STR(INT(MI_NUMERO)))).C_DECIMAL) . 10.1))=0. IIF((LEN(VALOR_N)=6 . mando la rutina que lo resulve. aplicable a CLIPPER.3) RC=RC+IIF(VAL(FN)=100.2." MILLONES")." MILLÓN")."")+. i1=1).AND. 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" .2.1))=0.PRG LA SIGUIENTE RUTINA. NUMEROV) Y APLICAS EN EL .2))>10 ." CENTAVOS M/L") ENDFOR RETURN RC Números a letras (1) DEVOLVER UN NUMERO EN LETRAS Dada la cantidad de consultas que he recibido por el tema de referencia. (LEN(VALOR_N)=12 .IIF(LEN(VALOR_N)=12.3. i1=1) .AND.AND. VAL(FN)<>0) . i1=1).AND.. i1=4 .AND." PESOS"+IIF(VAL(C_DECIMAL)>0.1))))+.AND.2))).AND.7.AND. IIF(VAL(SUBSTR(FN.1))=0.10.i1. VAL(RIGHT(FN.FOR i1=1 TO LEN(VALOR_N) STEP 3 FN=SUBSTR(VALOR_N.2))<16.AND.3))<>0).OR.."") ENDFOR RC=RC+IIF(i2=1.1)))))+." CIEN".. VAL(SUBSTR(FN.VAL(SUBSTR(FN.VAL(LEFT(FN.10.3))=1. i1=7 ." CON". VAL(SUBSTR(VALOR_N.VAL(SUBSTR(FN." MILLONES". (LEN(VALOR_N)=12 . PRIMERO CARGAS EL NUMERO EN UNA VARIABLE (Ej.DECENA(IIF(VAL(SUBSTR(FN. CENTENA(IIF(VAL(LEFT(FN. (LEN(VALOR_N)=12 .3. IIF((LEN(VALOR_N)=9 .OR.." MIL".1))<>0." Y".1)))))+. IIF(VAL(LEFT(VALOR_N. UNIDAD(VAL(RIGHT(FN.OR. FoxPro y VisualFoxPro para que la publiques en la WEB. UNIDAD(IIF(VAL(SUBSTR(FN."")+.2 .1))<>0 .AND. (LEN(VALOR_N)=9 ." M/L").. i1=4).OR. IIF(VAL(RIGHT(FN.3. 9) NUMP = " " DO WHILE CONTADOR < 4 SUBCADENA = SUBSTR(CADENA. (INT(T/10.2) UNIDAD = SUBSTR(SUBCADENA.INICIO.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.AND.3) CENTENA = SUBSTR(SUBCADENA.AND.1)+"00" DECENA = SUBSTR(SUBCADENA.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) .OR.1. T <20) NUMP = NUMP + N&DECENA CASE T > 9 .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 .3. (T > 9 . CONTADOR = 1 NUMP = NUMP + " MILLONES " ENDIF IF NUMP = " UNO MILLONES " NUMP = " UN MILLON " .AND.0) = T/10.1.0) DECENA = SUBSTR(DECENA.0) # T/10.2. ttd. ASI DE SENCILLO Juan Carlos Doorman González doorman@abaconet. "Francos".(nGreen * 256) nRed=nColor .ar <mailto:doorman@abaconet. 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.VALUE)) CENTAV = ROUND((CENTAV*100).Argentina PROCEDURE Color2RGB(nColor) * local nRed.VALUE .net <mailto:
[email protected].") tnColor=INT(tnColor/256) ENDFOR lcRGB=lcRGB+")" RETURN lcRGB ENDFUNC *----------------------------------------------------------Luis María Guayán Tucumán .."999")+IIF(ln=3.. nB) * AUTOR: LMG *---------------------------------------------------------FUNCTION Col2RGB(tnColor) LOCAL lcRGB.VABO. etc.0) CENTAV = INT(CENTAV) CENTAV = STR(CENTAV.nGreen.2) CENTAV = STRTRAN(CENTAV.mad.mad.(nBlue * 65536) nGreen=int(nColor / 256) nColor=nColor .nBlue nBlue=int(nColor / 65536) nColor=nColor . "..ENDIF IF ENTEROV > 999 .INT(THISFORM.com.AND. ln lcRGB="RGB(" FOR ln=1 TO 3 lcRGB=lcRGB+TRAN(tnColor%256. Y NADA MAS. Pasar un número de color a formato RGB *---------------------------------------------------------* FUNCTION Col2RGB(tnColor) *---------------------------------------------------------* Pasa un número de color a formato RGB * USO: Col2RGB(<Nro_Color>) * RETORNA: Caracter RGB(nR. DE ACUERDO AL TIPO DE MONEDA QUE UTILICES REEMPLAZAR "Pesos" POR **** "Dólares".VABO.es>> escribió en el mensaje de noticias 8j9q5h$mkd$1@talia... "".AND." ".es <mailto:
[email protected]."0") NUMP = "Pesos" + NUMP + " con " + CENTAV + "/100" EN LA VARIABLE NUMP TE QUEDA EN LETRAS CON LOS CENTAVOS. nG.net>.ar> Novato <jfmarbau@teleline. CONTADOR = 2 . Comunidades de Vecinos P. sino incluso formas y clases!. Ministerios) Y nosotros no sabemos mas. " messagebox('Febrero') + CRLF + . H.Sociedades limitadas E. -Victor Espina <http://www. Por eso es que digo que VB no es ni remotamente lo más indicado para hacer ese tip o de aplicación para prototipos.Sociedades Anonimas B."+allt(str(nBlue)) * ENDPROC HTH Victor Prototipos al vuelo Ej: #define CRLF chr(13)+chr(10) cCode="IF month(date())=2" + CRLF + . del disco predeterminado . 7.mitrompo. nosotros no lo tenemos muy clar o pero sabemos que: A."+allt(str(nGreen))+". Validación CIF Con respecto al significado de la primera letra.PRG") compile test do test Esto se puede hacer en tiempo de ejecución si tienes VFP6 + SP3 o superior. ObtenerDCCif(PADL(cNumero.Asociaciones. Juntas Vecinales) Q-Asociaciones Religiosas S. "ENDIF" + CRLF strtofile(cCode. Si no entendeis algo de la funcion no dudeis en preguntar cDigitoContrtol= SUBSTR("JABCDEFGHI".Sociedades Cooperativas G.return allt(str(nRed))+". En la aplicación que estoy desarrollando no solo se generan PRG's dinámicamente. 1) FUNCTION ObtenerDCCif() PARAMETERS cCIF . en bytes. Clubes deportivos.Entidades Locales (Ej.Comunidades de Bienes F. Ayuntamientos."TEST. "0")) + 1.com/vespina> Tamaño del disco La función SYS(2020) te devuelve el tamaño total.Organismos oficiales (Ej. nConta. para sumarle el número. 1)) * 2)) FOR nConta2 = 1 TO LEN(cValor) nTotal = nTotal + VAL(SUBSTR(cValor. o impar para sumarle la suma de los dígitos del número que ha sido multiplicado por 2. 2) = 0 *. cValor *Iniciamos las variables.LOCAl nConta. Madrid-España Uso de la coma como separador decimal . nConta2. 0) ENDFUNC Saludos Oscar Fernández GESPRO S.. 1))). 1)) *.... nConta. nTotal = nTotal + VAL(SUBSTR(cCIF.A. nConta2. ELSE cValor = ALLTRIM(STR(VAL(SUBSTR(cCIF. 1)). RETURN ROUND(VAL(RIGHT(STR(10 . nTotal = 0 *Recorremos el número del CIF.. FOR nConta = 1 TO 7 *Comprobamos si estamos en una posición par .VAL(RIGHT(STR(nTotal). 1)) ENDFOR ENDIF ENDFOR *Devolvemos el número de control. nTotal.. IF MOD(nConta. -Saludos.Sin ningun problema interceptas la tecla punto en el keypress y la cambias por l a coma. 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).nombre del indice (tag) * * Ejemplos: * .net>) La Coruña . nShiftAltCtrl DODEFAULT(nKeyCode." ENDIF Saludos. Pablo Roca (
[email protected] <mailto:proca@clavo. y por tanto no se puede hacer SEEK o INDEXSEEK en ell as.to/visualfox> Vistas y Consultas Consultas. Ejecución lcCadena = "SELECT * FROM MiTabla " &lcCadena Nivel de optimización de consultas Usando sys(3054. Para resolver esto se ha reealizado la sisuiente rutina: ************************************************************ * * Funcion: INDEXVISTA * * Indexa cualquier tipo de vista * * Parametros: * * tcvista . no s e les puede crear un indice. nShiftAltCtrl) IF nKeyCode = 46 NODEFAULT KEYBOARD ". ----------------------------Carlos Yohn Zubiria A.P.España ICQ 5035887 Sysop del Portal Gratuito de VisualFoxPro en Español <http://clik. mira: Keypress del texbox: LPARAMETERS nKeyCode. [0] [1] [11]) podrás ver el nivel de optimización de tus consultas.expresion completa para indexar * tctag .Nombre de la vista * tcexpr . "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. ya que asi no ti ene que traducir el asterisco por la estructura de la tabla. Es mas rapido : SELECT campo1. campo3. la prueba se ha hecho con una tabla con un millon de registros con In . 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". tcexpr. en la lista los incluyo todos.3)".F."allart") Con esto podremos realizar cualquier SEEK (mejor SEEK() ) o INDEXSEEK sobre la v ista Velocidad del select Pues si. si no que le dices exactamente lo que quieres.* ret=indexview("lv_alelin". En la prueba inclui todos los campos. FROM tabla1 Que : SELECT * FROM tabla1 Es cierto.3)". ENDIF RETURN llret ENDFUNC Ejemplo de uso: ret=indexvista("lv_alelin". La diferencia de los tiempos ronda sobre el minuto... tctag) LOCAL lcOldBufering."allart+STR(mov. pero lo encuentro lógico.lcOldBufering) ENDIF IF !EMPTY(lcalias) SELECT (lcalias) ELSE SELECT 0 ENDIF ELSE llret = . llret. campo2."allart+STR(mov.. A Vistas.99 ") -John Koziol MCSD.P. . Como cambiar el formato de campos Usted puede utilizar DBSETPROP para asegurarse de que los datos pulsan o el form ato es cómo usted lo desea: DBSetProp('vista. "field".999. "updatable".'DataTypé. funciona.dice Unico. 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 ión y listo.) -Saludos. " 999.campo'. Saludos Marcos Jerouchalmi Montevideo. Espero que te sirva.'Field'. Como cambiar el criterio El otro día se me planteó la necesidad cargar una vista con una condición que puede se r variable. Uruguay Vistas. El único problema con este método es que la vista se debe definir por código es decir con: create sql view Vista as select * from Table where &cCondicion porque con el generador no se puede poner esa condición. Pero después me di cuenta q ue en realidad lo único que cambia en la sentencia es la parte del where.micampo". " N(9.'Field'. La vista es siempre la misma.campo'.'Format'. No es necesario estar redefiniendo vistas y tocar el DBC. Microsoft MVP FoxPro Vistas actualizables marcar un campo clave: dbsetprop("mivista.micampo".com> Circulo de Lectores S. Alejo Almela Gonzalez
[email protected]. y si la intentas abrir da un error de sintaxis. Primero pensé en generar una vista en tiempo de ejecución.t. .) marco los campos a actualizar dbsetprop("mivista.com <mailto:
[email protected]. .2) ") y/o DBSetProp('vista. ----------------------------Carlos Yohn Zubiria A. "field". "keyfield". CUST_ID en Nombre de campo y ?thecust en Ejemplo. Agregue un Cuadro combinado al Formulario y establezca las siguientes propiedades : RowSource = Customer. 4. Guarde el formulario y ejecútelo. de maner a que.Refresh 11. MÁS INFORMACIÓN Una situación que puede darse es que los datos mostrados por una Cuadrícula necesite n cambiar en base a una acción del usuario. 9.Cust_id RowSourceType = 6 . Cuando se seleccione un nuevo cliente en el Cuadro combinado. 5. . Añada una Cuadrícula al formulario y establezca las siguientes propiedades: RecordSource = parmgrid RecordSourceType = 1-Alias 12. Cree una nueva vista usando la tabla Orders e incluyendo todos los campos. Orders y la vista Parmgrid al Entorno de datos del Formulario.Campos Value = 1 10. 3. En la ficha Selección. 1. Agregue Customer. 2.DisplayValue =REQUERY("parmgrid") THISFORM. 6. dependiendo del cliente seleccionado en el Cuadro combinado. Cierre el Entorno de datos. versión 3. Cree un proyecto nuevo y agregue la base de datos TestData del directorio VFP\SAMPLES\DATA. En este caso se puede utilizar una Vista parametrizada para proporcionar los reg istros que debe mostrar la Cuadrícula. Cree un nuevo Formulario en el proyecto. la Cuadrícula muestre solo los registros correspondientes a ese cliente. introduzca ORDERS. y usando la función REQUERY() se actualiza la Vista y refresca la Cuadrícula. se establece el pa rámetro al nuevo valor del Cuadro. 7. como por ejemplo la selección de un cliente nuevo en un Cuadro combinado. Abra la ventana Propiedades del Entorno de datos e incluya en el evento BeforeOpenTables del Dataenvironment el siguiente código: PUBLIC thecust thecust = "ALFKI" 8.Vistas parametrizadas en una cuadrícula ID Artículo: Fecha de Creación: Fecha de Revisión: E10115 22-nov-1996 19-APR-1997 La información en este artículo se refiere a: -Microsoft FoxPro. Cierre la vista con el nombre PARMGRID. Añada el siguiente código al evento InteractiveChange del Cuadro combinado: thecust = THIS.0 RESUMEN Este artículo informa de cómo actualizar una Cuadrícula usando una vista parametrizada . Personal Personal .Nombre LIKE '%'+?lcNom+'%' .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. REMOTE CONNECT MiConeccion . ?lcNom = "MARIA" REQUERY("MiVista") en donde MiVista se crea con: CREATE SQL VIEW MiVista . SELECT * FROM dbo. WHERE Personal.