Recopilatorio: Trucos, consejos, consultas Vfp
16/04/2020
Estoy con este tema si lo visita y lo ve incompleto
Estos trucos, que a mi me han servido de ayuda en muchas ocasiones, se han recopilado de diversas páginas y no son de mi proìedad intelectual. Espero que al lector le sirvan de ayuda.
Indice
- Aplicaciones
- Abrir fichero con el programa asociado
- Agrerar línea a un .exe
- Cierre automático si no hay actividad
- Compartir proyecto
- Conectar/Desconectar a unidad de red
- Detectar si se está ejecutando .EXE o proyecto
- Directorio de Windows. Obtener
- Evitar que un programa activado desde VFP se cargue más de una vez
- Formularios abiertos
- Grupo de programas. Crear
- Hacer desaparecer las barras de herramientas
- Identificar las unidades
- Incluir rutinas de VB en VFP
- Lanzar un programa y esperar a que termine
- Logo en pantalla principal
- Memoria. Limitar en VFP
- Modificar clases base
- Número de versión
- Pasar parámetros a un ejecutable
- Programa DOS. Ejecutar
- Programar el objeto _screen
- Saber los usuarios que están usando la Aplicación
- Saber si finalizó un programa
- Salvapantallas. Ejecutar desde VFP
- Tamaño del ejecutable. Reducir
- Variable pública
- Word. 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. Documentación
- ODBC. Conveniencia
- ODBC. Crear conexión
- Controles
- Ancho de lista de un cuadro combinado
- Asociar un ImageList a un control TreeView
- Calendario
- Cambiar el RecordSource a un grid
- Cambiar la tecla pulsada
- Cambiar propiedades a controles del mismo tipo
- Combobox. Abrir lista
- Combobox. Añadir valores
- Comprobar si un control está registrado
- Contar los controles de un formulario
- Desinstalar OCX
- Enviar al fondo
- Gif animado. Tani.ocx
- Grid. Búsqueda incremental
- Grid. Cambiar colores
- Grid. Columna desactivada
- Grid. Mantener las propiedades
- Grid. Marcar toda la línea actual
- Grid. Eliminar un control añadido
- Grid. Ordenar columnas
- MP3 en VFP
- Otro control en columna de Grid
- PageFrame y TabStrip
- RichText. Imprimir
- RTF
- RTF. Impresión
- TreeView. Borrar nodos
- TreeView. Recorrer
- TreeView. Saber botón presionado
- TreeView. Versión
- Ultimo enfoque
- Windows Script Host
- Direcciones
- ADO en VFP
- Chat en VFP
- 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
- 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, meses y días
- Calcular la edad
- Calcular la fecha de semana santa
- Cambiar la fecha y la hora del PC
- Convertir una fecha a formato largo
- Modificar fecha y hora
- Obtener el número de día del año
- Primer dia del mes de un dia de la semana (primer viernes de Agosto...)
- Transformar una cantidad de segundos a HH:MM:SS
- Ficheros
- Comprobar si hay disco en la Unidad
- Escribir y leer un valor de un fichero INI
- Existencia de índice
- Ficheros Cobol
- Hacer un cursor modificable
- Hacer un SEEK o INDEXSEEK a cualquier vista
- Obtener los ficheros de un directorio
- Saber si existe un directorio
- Saber si un alias pertenece a una vista
- Saber si se ha modificado un registro
- Tratar ficheros .INI
- Formularios
- Copiar el DataEnvironment a otro formulario
- Devolver 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, líneas, etc.
- Dimensión de una imagen
- MsGraph. Tipos de gráfico
- .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. Cambiar datos
- Cristal Report. Enviar parámetros
- Crystal Report. 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. Libreta de direcciones
- Outlook Express. Agregar registros a Libreta de direcciones
- Ms Agents
- Idioma
- Pantalla
- Cantidad de colores
- Capturar la pantalla
- Colores. 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 .NULL.
- Tablas
- Actualizar datos que no existen en otra tabla
- Append from desde una vista
- Busca un campo en una tabla y retorna .T. si tuvo éxito
- Campos memo
- Crear tablas con campos variables
- Crear tablas de referencias cruzadas
- Comprobar si ya existe un valor
- Insertar registro en una 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
- C.C.C. Dígito de control
- Copiar al portapapeles
- Copiar, cortar y pegar
- Conectar a Internet
- Drivers. 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. Ejecución
- Poder hacer un SEEK o INDEXSEEK a cualquier vista
- Nivel de optimización de consultas
- Velocidad del select
- Vistas. Como cambiar el criterio
Aplicaciones
Abrir fichero con el programa asociado
Ejecutar el documento directamente con la sentencia RUN:
run /n start MiCarta.DOC
No olvidarse start.
Agregar línea a un .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.exe
Cierre automático si no hay actividad
Tal vez te sea util usar el control TIMER y la funcion Lastkey(), si LastKey() contiene el mismo valor que tienes guardado en una variable entonces significa que no se presiono ninguna tecla en el lapso de tiempo que definiste en el control TIMER.
Compartir proyecto
Lo lógico y correcto seria usar la herramienta prevista para ello, el SourceSafe creo que se llama de micro$oft. Viene en la versión empresarial de Visual Studio y creo que también se vende como producto independiente.
De todas formas, y como solución "CHAPUZA" (pero que yo la uso y funciona) consiste en hacer una copia de los archivos del projecto (.PJT y .PJX) con otro nombre y que cada uno de vostros abra un proyecto distinto. Asi no da el error de que el archivo ya esta abierto. Evidentemente, lo que no podreis hacer es abrir los dos usuarios el mismo form o report o prg. Hay que tener cuidado con eso, pero por lo demas funciona.
Espero te sirva de ayuda.
Atentamente,
Pere Pujol i Espuña
ADS Anàlisi/Disseny de Soft, S.L.
mailto:ppujol@adssl.com
Conectar/Desconectar a unidad de red
Con estas funciones, puedes conectarse / desconectarse de una unidad de red.
--
Luis María Guayán
Tucumán - Argentina*-------------------------------------------------------- * FUNCTION GetConnection(lcDrive) *-------------------------------------------------------- * 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 ; STRING lpLocalName, ; STRING @lpRemoteName, ; INTEGER @lpnLength LOCAL cRemoteName, nLength, lcRet, llRet cRemoteName=SPACE(100) nLength = 100 llRet = WNetGetConnection(lcDrive,@cRemoteName,@nLength) lcRet = LEFT(cRemoteName,AT(CHR(0),cRemoteName)-1) RETURN lcRet ENDFUNC *-------------------------------------------------------- * FUNCTION AddConnection(tcDrive,tcResource,tcPassword) *-------------------------------------------------------- * Conecta un recurso compartido a la unidad tcDrive * USO: ? AddConnection("Z:","\\PC_REMOTA\RECURSO") *-------------------------------------------------------- FUNCTION AddConnection(tcDrive,tcResource,tcPassword) LOCAL lnRet DECLARE INTEGER WNetAddConnection IN WIN32API; STRING @lpzRemoteName, ; STRING @lpzPassword,; STRING @lpzLocalName IF PARAMETERS() < 3 lnRet = WNetAddConnection(@tcResource,0,@tcDrive) ELSE lnRet = WNetAddConnection(@tcResource,@tcPassword, @tcDrive) ENDIF IF lnRet # 0 RETURN "Error " + ALLT(STR(lnRet)) + ; " al conectar el drive " + tcDrive ENDIF RETURN "" ENDFUNC *-------------------------------------------------------- * FUNCTION CancelConnection(tcDrive) *-------------------------------------------------------- * Desconecta una unidad de red * USO: ? CancelConnection("Z:") *-------------------------------------------------------- FUNCTION CancelConnection(tcDrive) LOCAL lnRet DECLARE INTEGER WNetCancelConnection IN WIN32API; STRING @lpzLocalName, ; INTEGER nForce lnRet = WNetCancelConnection( @tcDrive, 0) IF lnRet # 0 RETURN "Error " + ALLT(STR(lnRet)) + ; " al desconectar el drive " + tcDrive ENDIF RETURN "" ENDFUNC *--------------------------------------------------------
Detectar si se está ejecutando .EXE o proyecto
Version(2) = 0 && Ejecutable Version(2) = 2 && Proyecto
Directorio de Windows. Obtener
¿GETENV('WINDIR').
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 que un programa externo se cargue más de una vez.
Un ejemplo sencillo es el de la calculadora de Windows.
Imaginemos que en nuestra aplicación demos la posibilidad de utilizar la calculadora. Pondríamos una línea come esta:
RUN /N CALC.EXEPero si esta línea la ejecutamos más de una vez, se cargarás la calcuadora una y otra vez.
* Antes de activar la calculadora: IF NOT F_ActivaWin("Calculadora") * La calculadora no está cargada: RUN /N CALC.EXE ENDIF * Y ESTA ES LA FUNCION QUE LO HACE TODO: *----------------------------- FUNCTION F_ActivaWin(cCaption) *----------------------------- LOCAL nHWD DECLARE INTEGER FindWindow IN WIN32API ; STRING cNULL, ; STRING cWinName DECLARE SetForegroundWindow IN WIN32API ; INTEGER nHandle DECLARE SetActiveWindow IN WIN32API ; INTEGER nHandle DECLARE ShowWindow IN WIN32API ; INTEGER nHandle, ; INTEGER nState nHWD = FindWindow(0, cCaption) IF nHWD > 0 * VENTANA YA ACTIVA * LA "LLAMAMOS": ShowWindow(nHWD,9) * LA PONEMOS ENCIMA SetForegroundWindow(nHWD) * LA ACTIVAMOS SetActiveWindow(nHWD) RETURN .T. ELSE * VENTANA NO ACTIVA RETURN .F. ENDIF
Formularios abiertos
*- borrar todos los formularios de la memoria. *- si no quedo ningun form corriendo, este metodo devuelve .t. *- y .f. en caso de error o que no se hayan cerrado todos los formularios *- abiertos. Local lDevolver DoEvents lDevolver = .T. For EACH oformsAbiertos IN APPLICATION.FORMS *!* If oformsAbiertos.WINDOWTYPE = 1 *!* lDevolver = .F. *!* Exit *!* Endif If !oformsAbiertos.Salir() && o .release() *- mis forms base tienen un metodo SALIR... lDevolver = .F. Exit Endif Next Return lDevolver
Grupo de programas. Crear
Un gran colaborador de este grupo de noticias, me envio esto, espero te sirva:
En el paso 6 del asistente de instalación, buscas el ejecutable de tu aplicación y click en la casilla que pone "administrador
del programa". Entonces deberá de salir una pantalla en la que debes especificar una descripción de tu aplicación y en la
casilla línea de comando colocas:%s\aplicacion.exe (Logicamente aquí pones el nombre real de tu programa, no olvides el %s).
Axel Olivares
Hacer desaparecer las barras de herramientas
If WVisible(‘Estándar’) Hide Window ‘Estándar’ EndIfY así con todas las demás.
Identificar las unidades
Ariel: Quizás con esto puedas "ir tirando" hasta conseguir lo que buscas
*------------------------------------------------------ FUNCTION ListDrives() LOCAL ln, lnTipo FOR ln = 65 TO 92 lnTipo = DRIVETYPE(CHR(ln)) DO CASE CASE lnTipo = 1 *--- 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 - Argentinaó
Puedes usar el File System Object:
oFSO = CREATEOBJECT('Scripting.FileSystemObject ') For Each oDrive in oFso.Drives ? oDrive.DriveLetter EndFor declare laDiscos[6] laDiscos[1] = "Desconocido" laDiscos[2] = "Removible" laDiscos[3] = "Partición Local" laDiscos[4] = "Compartido LAN" laDiscos[5] = "CD-ROM" laDiscos[6] = "RAM Disk" For Each oDrive in oFso.Drives n = oDrive.DriveType ? oDrive.DriveLetter + ":\" + SPACE(4) + laDiscos(n+1) EndFor--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------
Incluir rutinas de VB en VFP
Compilala como un componente COM y listo. Distribuyes el dll junto con tu aplicacion.
Asi la puedes llamar desde VFP, Excel, Word, etc.
Lanzar un programa y esperar a que termine
Usando Windows Scripting Host.
LOCAL loWshShell * Se hace cosas antes de ejecutar loWshShell = CreateObject("WScript.Shell") loWshShell.Run(<path de exe>, 1, .T.) *Se hacen cosas despues de ejecutar Pasando .t. en el tercer parámetro del método RUN fuerza a VFP esperar hasta que el EXE llamado termine. Logo en pantalla principal Efectivamente como dice Alex, @ ... SAY es conveniente no usarlo. Si no quieres usar _screen.image = "d:\MiArchivo.jpg" puedes controlar el tamaño y la posición con: _screen.addobject("oImg", "image") _screen.oImg.picture = "d:\consulta\dv.jpg" _screen.oImg.visible = .T. _screen.oImg.stretch = 1 _screen.oImg.width = 640 _screen.oImg.height = 400 --Luis María Guayán
Tucumán - Argentina
Memoria. Limitar en VFP
Debes chequear la funcion SYS(3050), resulta que VFP usa la memoria virtual de windows, por lo tanto esta usando mas ram de la que posee fisicamente, y en consecuencia el uso es ' indiscriminado '.
Con esta funcion puedes setear tanto en foreground como en background. Y segun cuentan se deberia probar mas o menos al tercio de lo que te informa la primera vez...
Pero la recomendacion es que seteas tu necesidad o vayas bajando de a un k para ir probando la performance.
Ademas de lograr un mejor control de memoria, tendras un mejor aprovechamiento que redundara en mayor velocidad de ejecucion.
Claudio Campos
Modificar clases base
En tools->options->field mapping y ahí podes especificar que classes debe usar VFP para cada tipo
Hugo
Número de versión
ln = AGETFILEVERSION(laArray,"C:\Exe\MiApp.exe") DISP MEMO LIKE laArray ó FOR lnI = 1 to ln ? laArray(lnI) ENDFORLuis María Guayán
Tucumán - Argentina
Pasar parámetros a un ejecutable
En el prg principal debes tener en la primera línea:
PARAMETERS uParam1, uParam2, uParam3
Cuando ejecutes tu programa le debes pasar los parametros de la siguiente manera:
C:\Aplicaciones\MiPrg.exe PARAMETRO1 1245 OTRO
Recuerda que todos los parametros pasan al ejecutable como del tipo caracter.
Luis María Guayán
Tucumán - Argentina
Programa DOS. Ejecutar
Corre el programa en DOS desde Windows Scripting Host, pasando un parámetro .T. para que corra en forma sincrónnica
(o sea que espere).#define SW_SHOW_NORMAL 1
#define SW_SHOW_MINIMIZED 2
#define SW_SHOW_MAXIMIZED 3
oShell = createobject("WScript.Shell")
oShell.Run("notepad.exe",SW_SHOW_NORMAL,.T.)--
Alex Feldstein - MCP
Miami, FL, USA
--------------------------------------------
Programar el objeto _screen
No se pueden programar directamente, pero un truco que se puede usar es, en una clase tuya agregá un puntero a _screen, luego puedes reprogramar los métodos del mismo.
Por ejemplo:
_screen.newobject('sc', 'ScreenController', 's c.prg') * SC.PRG define class ScreenController as custom oScreen = _screen function oScreen.resize wait window 'Cambiando el tamaño de la ventana principal' nowait endfunc function oScreen.mousedown(nButton, nShift, nXCoord, nYCoord) wait window 'Mouse down at: '+alltrim(str(nXCrodo))+' , '+alltrim(str(nYCoord) ) dodefault(nButton, nShift, nXCoord, nYCoord) endfunc enddefine
Pero no logré que funcione queryunload, pero igual no creo que sea necesario ya que puedes usar para el mismo on shutdown ¿o no? (no estoy muy seguro)
Hugo
Saber los usuarios que están usando la Aplicación
Te contaré como controlo yo este tema de los usuarios en aplicaciones en red, quizás te pueda servir.
Añado una tabla adicional con los siguientes campos: Puesto, Fecha, Hora, Usuario. En esta tabla, al configurar el puesto de red para que pueda operar con la aplicación, 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áquina de red cuando se utiliza VFP en un entorno de red.)
Cuando una máquina, arranca la aplicación lo primero que hace es buscar en dicha tabla su sys(0)
SELE "loquesea" LOCATE FOR sys(0) $ "loquesea".puesto *** y si no lo encuentra está claro que no se le permite seguir .... IF eof() && no se encontró ***(mensaje de: terminal no autorizado y a la P. calle) QUIT ENDIFsi lo encuentra, BLOQUEA EL REGISTRO Y pone en los campos fecha, hora, usuario los respectivos valores
SET REPROCESS TO 1 IF .not. lock() && ya esta bloqueado la aplicación esta arrancada en este puesto quit && salida ENDIF REPLACE "loquesea".Fecha WITH date(), "loquesea".Hora with time(), "loquesea".Usuario with m.user SET REPROCESS TO "lo que uses habitualmente"Este bloqueo, lo mantengo hasta que salga de la aplicación como se debe salir y entonces deja en blanco los campos fecha, hora, usuario a la vez que desbloquea el registro.
REPLACE "loquesea".Fecha WITH {" "}, "loquesea".Hora with "", "loquesea".Usuario with "" unlockLa ventaja que esto tiene, es que al salir de la aplicación "de forma incorrecta, por error, apagon etc" se desbloquea el registro si bien quedan anotados los datos del puesto, usuario, fecha y hora; los que borro si sale como es debido.
Si al entrar en la aplicación, el registro está bloqueado, es señal de que ya tiene abierta la aplicación y seguramente la tiene minimizada por lo que puedes procedo a levantarsela y no seguir en esta nueva apertura.
Si al entrar en la aplicación, no esta bloqueado el registro pero resulta que se encuentra los valores de fecha, hora, usuario; es señal de que la vez anterior que entró, no salido de forma correcta; en tal caso procedo a lanzarle un mensaje de
SEVERO Y PELIGROSO AVISO ( ...tal usuario, entro en fecha y hora a la aplicación y no salio como debía, "es la XXXX vez que se apaga de forma ilegal" operación muy peligrosa, posible perdida de datos ...avise al servicio tecnico...)
¡ No te puedes hacer idea, de lo bien que queda uno cuando hay problemas y puedes mirar y decirles que ya se ha salido de la aplicación 23 veces de forma incorrecta, que ¿que es lo que quieren que hagas?, merece la pena guardar estos incidentes ya que seguramente, acabarán por mostrarte que puestos tienen problemas, bien sea de operador o de máquina o quizás de windows, reinstalar nuevamente el windows en algunas máquinas suele ser el final de muchos problemas.
Para saber si un terminal, esta conectado, o cuantos hay conectados solamente habrá que repasar la tabla en cuestión y contar el numero de registro bloqueados.
SET REPROCESS TO 1 SELE "loquesea" GO TOP m.contador=0 DO WHIL .not. eof() m.contador=m.contador+IIF(lock(),0,1) unclock SKIP ENDD SET REPROCESS TO "lo que uses habitualmente" ? "Hay "+str(m.contador)+" terminales conectados"Espero que todo lo anterior, te pueda servir de algo; En cualquier caso, un saludo a Todos
jesse
Saber si finalizó un programa
#DEFINE NORMAL_PRIORITY_CLASS 32 #DEFINE IDLE_PRIORITY_CLASS 64 #DEFINE HIGH_PRIORITY_CLASS 128 #DEFINE REALTIME_PRIORITY_CLASS 1600 * Return code from WaitForSingleObject() if * it timed out. #DEFINE WAIT_TIMEOUT 0x00000102 * This controls how long, in milli secconds, WaitForSingleObject() * waits before it times out. Change this to suit your preferences. #DEFINE WAIT_INTERVAL 200 DECLARE INTEGER CreateProcess IN kernel32.DLL ; INTEGER lpApplicationName, ; STRING lpCommandLine, ; INTEGER lpProcessAttributes, ; INTEGER lpThreadAttributes, ; INTEGER bInheritHandles, ; INTEGER dwCreationFlags, ; INTEGER lpEnvironment, ; INTEGER lpCurrentDirectory, ; STRING @lpStartupInfo, ; STRING @lpProcessInformation DECLARE INTEGER WaitForSingleObject IN kernel32.DLL ; INTEGER hHandle, INTEGER dwMilliseconds DECLARE INTEGER CloseHandle IN kernel32.DLL ; INTEGER hObject DECLARE INTEGER GetLastError IN kernel32.DLL * STARTUPINFO is 68 bytes, of which we need to * initially populate the 'cb' or Count of Bytes memb er * with the overall length of the structure. * The remainder should be 0-filled start = long2str(68) + REPLICATE(CHR(0), 64) * PROCESS_INFORMATION structure is 4 longs, * or 4*4 bytes = 16 bytes, which we'll fill with nulls. process_info = REPLICATE(CHR(0), 16) * Start a copy of NOTEPAD (EXE name must be null-terminated) File2Run = "C:\WINNT\NOTEPAD.EXE" + CHR(0) * Call CreateProcess, obtain a process handle. Treat the * application to run as the 'command line' argument, acce pt * all other defaults. Important to pass the start and * process_info by reference. RetCode = CreateProcess(0, File2Run, 0, 0, 1, ; NORMAL_PRIORITY_CLASS, 0, 0, @start, @process_info) * Unable to run, exit now. IF RetCode = 0 =MESSAGEBOX("Error occurred. Error code: ", GetLastError()) RETURN ENDIF * Extract the process handle from the * PROCESS_INFORMATION structure. hProcess = str2long(SUBSTR(process_info, 1, 4)) DO WHILE .T. * Use timeout of TIMEOUT_INTERVAL msec so the display * will be updated. Otherwise, the VFP window never repaints until * the loop is exited. IF WaitForSingleObject(hProcess, WAIT_INTERVAL) != WAIT_TIMEOUT EXIT ELSE DOEVENTS ENDIF ENDDO * Show a message box when we're done. =MESSAGEBOX ("Process completed") * Close the process handle afterwards. RetCode = CloseHandle(hProcess) RETURN ******************** FUNCTION long2str ******************** * Passed : 32-bit non-negative numeric value (m.longval) * Returns : ASCII character representation of passed * value in low-high format (m.retstr) * Example : * m.long = 999999 * m.longstr = long2str(m.long) PARAMETERS m.longval PRIVATE i, m.retstr m.retstr = "" FOR i = 24 TO 0 STEP -8 m.retstr = CHR(INT(m.longval/(2^i))) + m.retstr m.longval = MOD(m.longval, (2^i)) NEXT RETURN m.retstr******************* FUNCTION str2long ******************* * Passed: 4-byte character string (m.longstr) * in low-high ASCII format * returns: long integer value * example: * m.longstr = "1111" * m.longval = str2long(m.longstr) PARAMETERS m.longstr PRIVATE i, m.retval m.retval = 0 FOR i = 0 TO 24 STEP 8 m.retval = m.retval + (ASC(m.longstr) * (2^i)) m.longstr = RIGHT(m.longstr, LEN(m.longstr) - 1) NEXT RETURN m.retval
Salvapantallas. Ejecutar desde VFP
Puedes ejecutar tu salvapantallas desde VFP con:
RUN /N black16.scr /SPrueba 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 DATABASE
. Menú 'proyecto-' L impiar 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 personales 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ípico:
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 valor es.Se define como pública y se crea en el 'main' del proyec to 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 withPor supuesto necesitas la cabecera de office para acceder a las constantes.
Si no la tienes:
wdlinestylenone = 0 wdborderleft = -2 wdborderright = -4 wdbordertop = -1 wdborderbottom = -3 wdborderhorizontal = -5 wdbordervertical = -6--
Saludos,
-----------------------------
Carlos Yohn Zubiria
A.G.P.
Bases de datos
Referencias
Autor del artículo: Camf