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.EXE

Pero 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’
               EndIf

Y 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)
               ENDFOR

Luis 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
               ENDIF

si 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 ""
               unlock

La 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 /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 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 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

 

 

 


 

Referencias

Autor del artículo: Camf

 


 

 

 



error: Contenido protegido