Aplicaciones en la SysTray (1)

Colocar aplicaciones en la barra de tareas del Windows (más conocida como la SysTray) puede llegar a ser muy útil y muy conveniente.

Captura 1. La barra de tareas (SysTray) del Windows

Podemos usarla para que nuestra aplicación esté siempre activa, sin importar lo que haga el usuario, de esa manera podríamos hacer backups automáticos, verificaciones, descargas de archivos desde Internet, envíos de e-mails, avisarle que ocurrió algo que requiere de su atención, y un largo etcétera.

Y con Visual FoxPro es extremadamente fácil conseguir que nuestros programas se ubiquen allí. Quienes no lo saben, suponen que es algo muy difícil, pero no, es súper sencillo de lograr.

Lo que necesitaremos es una biblioteca de clases llamada SYSTRAY.VCX que viene incluida con el Visual FoxPro. La encontrarás en la carpeta:

C:\Program Files (x86)\Microsoft Visual FoxPro 9\Samples\Solution\Toledo\

Y lo mejor, es que en esa misma carpeta encontrarás un formulario de ejemplo. Mirando ese formulario podrás leer casi todo lo que necesitarás saber. El nombre del formulario es:

systray_sample.scx

Creando una aplicación que se ubicará en la barra de tareas del Windows

Hay dos formas de usar a la biblioteca de clases SYSTRAY.VCX:

  1. En un programa (.PRG)
  2. En un formulario (.SCX)

Si la queremos usar en un .PRG entonces crearemos un objeto con la función CREATEOBJECT(), en cambio si la queremos usar en un formulario insertaremos un control systray en nuestro formulario.

Entendiendo como funciona el menú en la barra de tareas del Windows

Lo que colocamos en la barra de tareas del Windows es un menú. No es un programa ni un formulario, sino un menú. O sea que en tu formulario podrías tener todos los controles que quieras, pero ninguno de ellos se verá en el menú.

¿Y por qué usar un formulario para colocar al menú en la barra de tareas?

A veces es cuestión de gustos y a veces puede facilitarte tu trabajo, porque tienes en el formulario propiedades o métodos que necesitarás. Pero lo importante a recordar es que puedes usar indistintamente un archivo .PRG o un formulario, ya que con cualquiera de ellos funcionará.

Estableciendo los valores de las propiedades:

Después que creamos el objeto en nuestro archivo .PRG o en nuestro formulario, hay 4 propiedades cuyos valores debemos establecer para que nuestra aplicación se ubique en la barra de tareas del Windows, las 4 propiedades son obligatorias:

  • IconFile
  • MenuText
  • MenuTextIsMPR
  • TipText

IconFile es el nombre de un archivo gráfico de icono. Es el icono que el usuario verá en la barra de tareas.

MenuText puede ser un string conteniendo las opciones o el nombre de un archivo .MPR

MenuTextIsMPR indica si MenuText es un string o si es un archivo .MPR

TipText es el mensaje que verá el usuario cuando mueva su cursor sobre el icono

Listado 1. Un ejemplo donde se establecen esas 4 propiedades:

IconFile      = "MI_ICONO_TAREAS_1.ICO"
MenuText      = "1;Bloc de Notas;2;Calculadora;3;Paint;4;Mensaje;5;Procedure;6;Salir"
MenuTextIsMPR = .F.
TipText       = "Ejemplo de un programa en la barra de tareas del Windows"

Captura 2. Al colocar el mouse sobre el icono, se muestra un texto de ayuda

En la propiedad IconFile se escribió el nombre de un archivo de icono; en la propiedad MenuText se escribieron las opciones que estarán visibles para el usuario, en todos los casos es: un número, seguido de un punto y coma, seguido de un texto, y finalizado con un punto y coma. Los números pueden ser cualesquiera, el Visual FoxPro los usa para identificar a las opciones. En este ejemplo, se usaron los números 1, 2, 3, 4, 5, y 6, pero tú puedes usar cualquier número que se te ocurra. Como las opciones que verá el usuario se escribieron en la propiedad MenuText y no en un archivo .MPR entonces en la propiedad MenuTextIsMPR se colocó .F., y finalmente en la propiedad TipText se escribió el texto que ve el usuario cuando coloca su mouse sobre el icono, tal y como se puede ver en la Captura 2. (El icono de este ejemplo es un ojo)

Mostrando a nuestra aplicación en la barra de tareas del Windows

Captura 3. El menú que ve el usuario cuando hace clic en el icono

Especificando un archivo .MPR que contiene las opciones del menú

En el Listado 1. las opciones se escribieron directamente en un string, pero también podemos escribir las opciones en un archivo .MPR si queremos, y quizás te preguntarás ¿para qué haríamos eso? la respuesta es que en ese caso tu menú podría tener distintos colores y tipos de letras y tamaños de letras y por lo tanto sería más vistoso, llamaría más la atención del usuario.

Captura 4. Un menú con varios colores en las opciones

En la Captura 4. vemos un menú cuyas opciones se muestran en distintos colores. En general no es buena idea exagerar con eso, pero se muestra ahí para que veas algunas de tus posibilidades.

Captura 5. Un menú con colores, pero más sobrio que el anterior

Si comparas la Captura 3., con la Captura 4., y la Captura 5., notarás que tienen varias diferencias: distintos tipos de letras, distintos tamaños de letras, distintos colores.

Es por ese motivo que muchos programadores preferimos usar un archivo .MPR para mostrar las opciones del menú, ya que nos permite ser más creativos. El menú de la Captura 3. parece muy aburrido. Aunque sobre gustos…

¿Cómo ejecutamos la opción que eligió el usuario?

Ya le hemos mostrado al usuario cuales son sus opciones disponibles, él hizo clic sobre una de esas opciones, ¿cómo la ejecutamos?

Bien, eso depende de si su menú está en un archivo .MPR o no lo está. Si no está en un archivo .MPR entonces en el procedure ProcessMenuEvent()  de nuestro objeto systray colocamos los comandos. Algo así:

Listado 2. Ejecutando la opción elegida, cuando no se usa un archivo .MPR

PROCEDURE ProcessMenuEvent     && Aquí se debe procesar la opción elegida por el usuario
LPARAMETERS tnMenuItemID

  DO CASE
    CASE tnMenuItemID = 0     && Salió sin elegir opción, nada se debe hacer entonces
    CASE tnMenuItemID = 1     && Eligió la primera opción
      =ShellExecute(0, "OPEN", "NOTEPAD.EXE", "", "", 1)
    CASE tnMenuItemID = 2     && Eligió la segunda opción
      =ShellExecute(0, "OPEN", "CALC.EXE", "", "", 1)
    CASE tnMenuItemID = 3     && Eligió la tercera opción
      =ShellExecute(0, "OPEN", "MSPAINT.EXE", "", "", 1)
    CASE tnMenuItemID = 4     && Eligió la cuarta opción
      =MessageBox("Un mensaje de bienvenida")
    CASE tnMenuItemID = 5     && Eligió la quinta opción
      DO MI_PROCEDURE_SALUDA
    CASE tnMenuItemID = 6     && Eligió la sexta opción
      This.RemoveIconFromSystray()
      CLEAR EVENTS
    ENDCASE

ENDPROC
*
*

Los números que se encuentran después de la variable tnMenuItemID deben coincidir con los números que escribimos en la propiedad MenuText. Si el valor de la variable tnMenuItemID es cero, eso significa que el usuario salió sin elegir alguna de las opciones.

IMPORTANTE: Para que se termine el procesamiento, se debe escribir el comando CLEAR EVENTS

Como puedes ver, nada hay de raro en el Listado 2., ya que se trata de un simple procedure con una construcción CASE…ENDCASE dentro suyo. Lo único realmente importante que debes recordar es que si quieres darle al usuario la opción de terminar tu aplicación, debes escribir el comando CLEAR EVENTS en alguna de las opciones.

Descarga:

Para que todo lo visto hasta aquí te quede más claro y lo puedas ver funcionando en la vida real, puedes descargar un archivo .ZIP que contiene todo lo que necesitas para mostrar una aplicación en la barra de tareas del Windows cuando no se usa un archivo .MPR y en el siguiente artículo tendrás la posibilidad de descargar un archivo .ZIP que te mostrará como hacer cuando  quieres usar un archivo .MPR

https://www.mediafire.com/file/zx0lidv48koqj2r/SYSTRAY_1.ZIP/file

Conclusión:

Algo que no es muy frecuente que hagan los programadores de Visual FoxPro pero que sin dudas es muy útil es colocar aplicaciones en la barra de tareas del Windows. Quizás una de las razones es que desconocen como hacerlo o piensan que es algo muy difícil y complicado. En realidad, es muy fácil.

En este artículo solamente hemos visto una pincelada de lo que se puede lograr, en siguientes artículos profundizaremos más con este interesante tema.

Artículos relacionados:

Entendiendo a ShellExecute

Aplicaciones en la SysTray (2)

Aplicaciones en la SysTray (3)

Aplicaciones en la SysTray (4)

El índice del blog VFPavanzado

 

Motores SQL (3). Instalación del Servidor

Como ya sabes, para poder trabajar con Cliente/Servidor se necesita de un Servidor y de un Cliente. Instalar el Cliente es muy sencillo, en general es simplemente copiar un archivo .DLL en la misma carpeta en la cual se encuentra tu .EXE y listo, esto es todo.

Instalar el Servidor en cambio es un poco más complicado, pero no mucho más, tal y como veremos ahora.

El Servidor de un motor SQL en general puede instalarse como un servicio o como una aplicación.

¿Cuál es la diferencia?

  • Cuando se instala como un servicio, al encender la computadora ya el Servidor está en funcionamiento y ya podemos acceder a todas sus bases de datos. Nada debemos hacer, funciona de forma automática.
  • Cuando se instala como una aplicación, al encender la computadora el Servidor todavía no está funcionando, para que funcione debemos ejecutarlo, tal y como ejecutamos a cualquier otro .EXE

Normalmente, al Servidor lo instalamos como un servicio, de esa manera está siempre disponible cuando lo necesitamos.

Instalando al Servidor como un servicio

Aquí veremos como instalar al Servidor del Firebird. La instalación de los otros Servidores es similar.

El archivo .EXE de instalación lo podemos descargar desde:

https://firebirdsql.org/en/firebird-2-5/

Si la computadora donde se instalará el Servidor es de 32 bits, debemos elegir el instalador de 32 bits.

Captura 1. El instalador para computadoras de 32 bits

En cambio, si la computadora donde se instalará el Servidor es de 64 bits, podemos elegir cualquiera, porque ambos funcionarán bien, tanto el de 32 bits como el de 64 bits funcionarán a la perfección con nuestras aplicaciones de Visual FoxPro.

Captura 2. El instalador para computadoras de 64 bits

Cuando ejecutes al instalador verás algo como esto:

Captura 3. El idioma en que se mostrarán los mensajes al instalar el Servidor

Captura 4. Instalando al Servidor

 

Captura 5. Firebird es completamente gratis, siempre

Firebird es completamente gratis, siempre y en todos los casos, y también es open-source (o sea que puedes ver su código fuente). Otros motores SQL tienen una versión gratis, la cual tiene funcionalidades limitadas, y una versión de pago, que tiene todas las funcionalidades…pero debes pagar.

Captura 6. Siguiendo con la instalación

Captura 7. Seleccionando la carpeta donde se instalará el Servidor del Firebird

En esta pantalla puedes elegir en cual carpeta se instalará el Servidor. El programa de instalación te sugiere la carpeta que ves en la Captura 7. pero tú puedes elegir cualquier otra carpeta de tu disco duro, si quieres.

Captura 8. Seleccionando lo que quieres instalar

En la Captura 8. te pregunta que es lo que deseas instalar, esas son las opciones por defecto y están muy bien, puedes continuar.

Captura 9. El nombre de la carpeta en el menú de inicio del Windows

Si quieres tener una carpeta en el menú de inicio del Windows (no es obligatorio tenerla, solamente si quieres) en esta pantalla puedes especificar cual nombre tendrá esa carpeta.

Captura 10. Es conveniente dejar así esas opciones

Captura 11. Ya todo está listo para empezar la instalación del Servidor

Captura 12. Ya finalizó la instalación del Servidor

Captura 13. Haciendo clic en el botón de «Finalizar» se cierra el programa de instalación

Y listo, ya el Servidor está instalado y también ya se inició el servicio, o sea que ya está en pleno funcionamiento.

Conclusión:

Como todos los motores SQL están basados en Cliente/Servidor debemos instalar el Cliente y también el Servidor. Instalar el Cliente es muy sencillo porque usualmente se trata de un archivo .DLL que se puede copiar en la misma carpeta donde se encuentra nuestro .EXE, en cambio instalar el Servidor es un poco más complicado, pero no mucho más.

El siguiente paso, luego de instalar al Servidor, es configurarlo, y eso veremos en el siguiente artículo de esta serie.

Artículos relacionados:

Motores SQL (1). Conceptos básicos

Motores SQL (2). Cliente/Servidor

Como instalar Firebird dos (o más) veces en la misma computadora

El índice del blog VFPavanzado

 

 

¿Debemos permitir que pirateen nuestras aplicaciones…o no?

Cuando a un programador se le pregunta algo como: ¿te gusta que se pirateen tus aplicaciones? casi siempre la respuesta es un rotundo NO.

Esa forma de pensar tiene una cierta ventaja: si se instaló la aplicación en 20 computadoras, se cobró 20 veces. Y si se la instaló en 50 computadoras se cobró 50 veces.

Sin embargo…¿es una política de ventas correcta?

Veamos un ejemplo.

Como seguramente sabes, la mayor empresa de software del mundo es Microsoft, la cual tiene más de 130.000 empleados. Más empleados que habitantes tienen la gran mayoría de las localidades del mundo.

https://es.statista.com/estadisticas/650835/numero-de-trabajadores-de-microsof-a-nivel-mundial/

Para darte una idea de cuanto dinero le ingresa cada año, en el 2018 fueron más de 110.000.000.000 de dólares, una cifra astronómicamente grande.

https://www.efe.com/efe/america/economia/ingresos-de-microsoft-suman-110-360-millones-en-2018-impulsados-por-la-nube/20000011-3696462

Entonces, la pregunta es: ¿cómo consigue obtener tantos ingresos?

Y aunque no lo creas la respuesta es: «gracias a la piratería»

¿Cuántas veces en tu vida has visto publicidad de Microsoft en periódicos, revistas, o canales de televisión? Seguramente muy pocas veces…o ninguna vez. Sin embargo, en la grandísima mayoría de las computadoras hay software de Microsoft: Windows, Office, o muy frecuentemente, ambos.

¿Cómo se entiende eso, cómo puede ser tan popular el software de Microsoft si casi no gasta en publicidad?

Y la respuesta es que no necesita gastar en publicidad, porque la grandísima mayoría de la gente cuando adquiere una computadora quiere que tenga Windows y Office. Es más, no concibe una computadora sin esos softwares. No les hables de Linux o de FreeBsd o cosas así, eso le puede interesar a un informático, pero no a la gran mayoría de las personas.

Como vimos, Microsoft tiene más de 130.000 empleados, algunos de los cuales se cuentan entre los mejores programadores de todo el mundo. Entonces ¿por qué no implementan un método anti-piratería que sea realmente efectivo y que impida que se piratee el software de Microsoft? La respuesta es: porque no les conviene.

¿Cuánta gente usaría Windows, Office, e inclusive Visual FoxPro si tuviera que comprar una licencia legal? Con toda seguridad muchísima menos gente de la que actualmente usa.

Entonces, permitir que pirateen tus softwares puede ser muy buen negocio. Microsoft te lo demuestra. ¿Por qué? Porque entre todos los que piratean algunos por «x» o «b» motivo deben adquirir una licencia legal, no pueden tener una instalación pirata. Y esos pocos que compran (¿quizás el 1% de todos los que tienen instalado software de Microsoft?) ya le sirvieron para facturar más de 110.000 millones de dólares en un solo año. ¿Estás comprendiendo que no es mal negocio que te pirateen?

Resumiendo lo visto hasta aquí:

  1. Si Microsoft realmente lo quisiera podría evitar que se pirateen sus softwares.
  2. No lo evita (lo dificulta un poco, pero no lo evita) porque es una muy buena política de negocios.
  3. La persona común quiere usar software de Microsoft. Nada de Linux o cosas raras, solamente quiere software de Microsoft.
  4. Algunas personas o empresas se ven obligadas a comprar licencias legales del software de Microsoft, por un motivo o por otro, pero deben comprar.
  5. Esas pocas personas que compran software legal le permiten facturar a Microsoft más de 110.000 millones de dólares anuales.
  6. Y como la gente quiere software de Microsoft, sí o sí, es que ni siquiera necesita gastar en publicidad.
  7. Los «piratas» que instalan software de Microsoft le están haciendo publicidad gratis…y no les paga un sueldo ni comisiones por las ventas realizadas.

Si estás siguiendo el artículo hasta este punto es que te está interesando lo que lees. Así que vayamos a lo realmente interesante: ¿cómo podemos conseguir que se pirateen nuestros softwares y así conseguir muchoooooooo dinero?

La respuesta es que la instalación debe ser gratis, la activación no.

¿Qué significa eso?

Primero, vayamos a lo básico: si tu software no se quiere piratear es porque es una porquería.

Segundo, si tu software es lo suficientemente bueno, siempre habrá interesados en piratearlo.

Tercero, al pirata debes facilitarle la tarea, no complicársela.

Cuarto, si haces las cosas bien, los piratas te harán publicidad gratis, venderás muchas licencias gracias a ellos, y no les pagarás ni un sueldo ni comisiones por ventas. No es mal negocio ¿verdad?

Entonces, la metodología puede ser la siguiente:

  1. Instalas tu software en la computadora de un cliente que te lo compró legalmente.
  2. Usas una programa «activador» que solamente tú tienes, para «activar» ese software en esa computadora.
  3. Dejas el instalador de tu software en esa computadora.
  4. Le dices a tu cliente que le dejas el instalador por si necesita reinstalar el software alguna vez (y cuantas más personas te oigan, mucho mejor).
  5. Si tu cliente, su empleado, su hijo, su amante, o quien sea, usa el instalador para instalar tu software en otra computadora, le funcionará perfectamente.
  6. Pero como tu software no está activado en esa otra computadora entonces tendrá fecha de caducidad. Por ejemplo, a los 90 días le avisa que debe comprar una licencia legal porque esa instalación es pirata.
  7. Como el usuario ya usó tu software durante 90 días y ya cargó muchos datos, no le causará ninguna gracia perder todo su tiempo y su trabajo y en muchos casos (no en todos, pero sí en muchos casos) aceptará pagar por la licencia de tu software.
  8. Y así, gracias al «pirata» hiciste una venta que no hubieras hecho si tu software no hubiera sido pirateado.

Otra pregunta interesante: ¿cómo mostrar el mensaje de aviso de que caducó el software?

Aquí, hay dos alternativas:

  1. Avisarle al usuario que dentro de «N» días su software caducará y que debe adquirir una licencia legal.
  2. No avisarle con anticipación al usuario y tomarlo totalmente por sorpresa.

La alternativa 1. a mí no me gusta, porque si le pones algo como: «Este software no tiene una licencia legal y dentro de 15 días dejará de funcionar» entonces el usuario se apresurará a imprimir sus informes, generar sus gráficos, sus planillas Excel, o lo que sea que necesite y cuando los 15 días se cumplan habrá realizado todo su trabajo y sin pagarte un solo dólar.

La alternativa 2. en cambio no le deja opción: o te paga, o pierde todo el tiempo y el trabajo que empleó usando tu software. Cuando vea un mensaje como: «La licencia de uso libre de este software ha caducado. Póngase en contacto conmigo mediante el número de celular 9999-999999 para adquirir una licencia comercial legal» entenderá que debe pagar para seguir usando.

Ahora bien, aquí también tenemos dos alternativas, cuando llegó la fecha límite:

  1. No se le permite usar el software. Cuando ingresa a él lo único que puede ver es la ventanita con el mensaje que le reclama que compre la licencia.
  2. Se le permite usar el software…pero con capacidades limitadas. Por ejemplo, en las tablas de detalle y en los informes solamente se le muestran las 20 primeras líneas. Los procesos también solamente se realizan sobre los primeros 20 registros de cada tabla.

Hay personas que prefieren la alternativa 1. En lo particular yo prefiero la alternativa 2. porque el usuario puede ver todo lo que hizo y lamentarse por todo el tiempo que ya invirtió en cargar todos esos datos. Por ejemplo, si en el formulario donde carga las ventas ve que cargó 800 ventas pero en los informes solamente puede ver las 20 primeras ventas…muy posiblemente piense muy seriamente en que debe pagar la licencia.

Desde luego que 20 es un ejemplo. Tú puedes usar 10, 15, o cualquier otro número que prefieras.

Entonces, resumiendo, lo que necesitamos es:

  1. Un programa instalador de nuestro software. Ese instalador lo dejamos en la computadora de todos quienes nos compran software.
  2. Un programa activador de nuestro software. Ese solamente lo tenemos nosotros y lo cuidamos como a un camión lleno de lingotes de oro.

Nuestro software debe verificar cada vez que es usado si está activado o no.

¿Cómo hacemos eso?

La forma más sencilla es guardar en una tabla 3 fechas:

  1. La fecha desde la cual se puede usar el software
  2. La fecha hasta la cual se puede usar el software
  3. La fecha de último uso del software

Esas 3 fechas desde luego que se guardan encriptadas, para que no estén visibles para cualquier informático.

Nuestro programa instalador guarda la fecha 1. y la fecha 2. (haciendo que la fecha 2. sea la fecha 1. más 90 días, por ejemplo).

Cada vez que se ingresa a nuestro software (que puede ser pirateado) se actualiza la fecha 3.

Si la fecha 2. es menor que la fecha 3. o si la fecha 2. es menor que la fecha de la computadora, el software caducó.

Si el usuario cambia la fecha de su computadora para ponerle la fecha de un mes atrás, por ejemplo, entonces la fecha de la computadora será menor que la fecha 3. y eso es imposible si no cambió la fecha de la computadora. Por lo tanto, allí detectamos que le cambió la fecha a su computadora. Y por lo tanto nuestro software seguirá mostrando la ventanita con el pedido de que compre la licencia.

Nuestro programita activador lo único que hace es cambiar la fecha 2.  La cambia por ejemplo a 31/12/2099 y así quien nos compre una licencia siempre podrá usar nuestro software porque jamás la fecha de su computadora será mayor que 31/12/2099 (y si sus tataranietos quieren usar nuestro software en esa computadora en el año 2.100 no podrán hacerlo…pero tampoco nos podrán reclamar).

¿Y si reinstalan nuestro software en esa misma computadora?

Aquí el truco es que no puedan cargar más datos ni imprimir informes sobre lo que ya habían cargado. La forma más fácil es que en la misma tabla donde se guardan las tres fechas encriptadas también se guarden datos de las tablas en las cuales el usuario carga datos. Por ejemplo, cuando se instala/reinstala nuestro software la Primary Key de las ventas vuelve a cero. Entonces, si reinstaló nuestro software, cuando cargue una nueva venta su Primary Key será 1, pero como ya existe una venta que tiene 1 en su Primary Key, no podrá grabarla.

Antes de mostrarle un informe de ventas (por ejemplo), verificamos que la última Primary Key de la tabla de ventas sea igual a la Primary Key guardada en nuestra tabla de control (que es la misma tabla donde guardamos las 3 fechas, como recordarás). Si son distintas…hemos detectado que reinstaló nuestro software y no le mostramos el informe de las ventas.

Y por lo tanto, reinstalar nuestro software en la misma computadora, no funcionará.

¿Y si reinstalan nuestro software en otra computadora?

Eso sí podrá hacer, pero si quiere transferir las bases de datos de la computadora vieja a la computadora nueva, se encontrará con el mismo problema: cuando quiera cargar una venta, la Primary Key de esa venta será 1 y como ya existe una venta con 1 como su Primary Key, entonces no podrá grabarla. Y si quiere imprimir un informe, la Primary Key de la última fila de la tabla será distinta a la Primary Key guardada en nuestra tabla de control, y tampoco le funcionará.

Entonces, resumiendo:

  1. Tenemos una tabla llamada por ejemplo CONTROL.
  2. En la tabla CONTROL guardamos encriptadas 3 fechas: fecha inicial, fecha final, fecha de último uso.
  3. Si la fecha final es menor que la fecha de la computadora o que la fecha de último uso, el software caducó.
  4. Si la fecha de último uso es mayor que la fecha de la computadora, el usuario cambió la fecha de su computadora y lo detectamos. Pero igualmente, el software caducó.
  5. Cuando el usuario inserta una venta (por ejemplo), la Primary Key de esa venta guardamos en nuestra tabla de CONTROL.
  6. Cuando el usuario quiere imprimir un informe de ventas, verificamos que la Primary Key de la última venta sea igual a la Primary Key guardada en la tabla de CONTROL.
  7. Si el usuario borra la última venta, actualizamos la Primary Key guardada en la tabla de CONTROL (o sea, guardamos en ella la que ahora es la última Primary Key de la tabla de ventas).
  8. Nuestro programa instalador deja en blanco (o en cero, si es numérica) la Primary Key guardada en la tabla de CONTROL.

Hay varias medidas más que puedes tomar, por ejemplo, para evitar que copien las bases de datos de una computadora a otra y les funcione, en tu tabla de CONTROL tienes un número de instalación (encriptado, por supuesto) y ese mismo número de instalación lo guardas en un archivo que está en otra carpeta (o aún mejor, en el Registro del Windows). Entonces, al iniciar tu software se verifica que el número de instalación que se encuentra en la tabla de CONTROL sea idéntico al número de instalación que se encuentra en un archivo de otra carpeta (o en el Registro del Windows, lo cual es mejor). Si no son iguales…has detectado que copiaron las bases de datos de una computadora a otra computadora y que quieren usar tu software sin pagarte la licencia. Ah, un detalle aquí: tu programa instalador debe copiar el número de instalación en un archivo de otra carpeta (o en el Registro del Windows) solamente si ya no existe ahí. Si ya existía, deja el que estaba y en ese caso se podrá detectar que los números de instalación son distintos.

Como comentario aparte, para asegurarte que los números de instalación jamás se repitan aunque instalen tu software millones de veces, podrías usar un número UUID (Microsoft lo llama GUID), como veremos en otro artículo de este blog.

Conclusión:

Una muy buena política de ventas es permitir que nuestro software se piratee. El mejor ejemplo de que funciona muy bien lo tenemos en Microsoft. Sin embargo, lo más importante es que debemos ser capaces de detectar cuando nuestro software está pirateado y a partir de ese momento impedirle al usuario que use de forma normal a nuestro software. Podemos permitirle que lo use con capacidades muy limitadas, porque eso psicológicamente lo afectará y nos resultará más fácil conseguir la venta.

Artículos relacionados:

El índice del blog VFPavanzado

 

 

De VFP a WEB-MOVIL (1)

Desde hoy en el blog iniciamos una nueva serie de artículos, para mostrar como crear aplicaciones que se pueden usar en la web o en teléfonos celulares (móviles).

Como todos sabemos, gran parte del presente y del futuro de la Informática está relacionado con Internet y con teléfonos celulares, tabletas, y otros dispositivos similares.

La información sobre esos temas  vinculados al Visual FoxPro es muy escasa, sobre todo en idioma español, y por ese motivo es que decidí empezar a escribir esta serie de artículos. Algunos de los puntos que se tratarán son:

  • HTML 5
  • XML
  • CSS
  • JavaScript
  • TypeScript
  • Angular
  • Ionic
  • Node.Js
  • React
  • Json
  • Firebase
  • SQLite
  • MongoDB
  • Android
  • IOS
  • SMS
  • Whatsapp

Y muchos más, la de arriba es una lista no exhaustiva de los temas que serán tratados en esta serie de artículos.

NOTA: Inicialmente la idea del autor fue escribir artículos sobre Angular relacionado con Visual FoxPro pero pronto fue evidente que para entender a Angular se necesitaban conocimientos previos, conocimientos que muy pocos lectores del blog tenían, y por ese motivo es que ahora empieza un proyecto mucho más ambicioso. Aquí, mostraremos desde cero todo lo que se necesita conocer para crear aplicaciones que funcionen en la web y también en dispositivos móviles. Desde luego que lo más interesante será conseguir que esas aplicaciones para web y para dispositivos móviles se puedan integrar, relacionar, o desarrollar, con Visual FoxPro.

Ese es el futuro de todos nosotros así que … ¡¡¡vamos para allá!!!

Artículos relacionados:

El índice del blog VFPavanzado

 

De DBF a SQL (27). Entendiendo Cliente/Servidor

Hasta ahora, todo lo que hemos hecho en esta serie de artículos podíamos realizarlos con las tablas .DBF, nativas del Visual FoxPro. Eso está muy bien y podríamos quedarnos allí porque como habrás comprobado si pusiste en práctica los ejemplos con tus propias tablas, hay una muy notoria ganancia en velocidad. Escribes menos y obtienes los resultados mucho más rápidamente. Está muy bueno eso ¿verdad?. Pero no nos  quedaremos allí sino que daremos un gran salto hacia adelante y nos adentraremos en una tecnología muy distinta a la tradicionalmente usada en Visual FoxPro pero que a su vez es extremadamente poderosa. Su nombre es Cliente/Servidor y es más o menos el equivalente a que un jugador de fútbol de un club sudamericano de mediano porte vaya a jugar al Barcelona de España o al Real Madrid o algo así. Es totalmente otro nivel de juego.

Entonces, ¿de qué se trata Cliente/Servidor?

Lo primero que debes saber es que esta es una metodología para acceder a los datos desde varias computadoras, en otras palabras, desde una red de computadoras. Aunque puedes hacer aplicaciones Cliente/Servidor que sean monousuario no fue pensado para eso sino para aplicaciones multiusuario.

En las aplicaciones antiguas (o sea, las tradicionales del VFP) los programas “tocaban” físicamente a los datos, o sea que por un lado estaba el programa, por el otro lado estaban los datos que se guardaban dentro de los archivos y no había algo entre ellos que los separara.

Programa <——–> Archivo de datos

Esto funcionaba, pero con muuuchos problemas potenciales, por ejemplo un usuario estaba modificando un registro que otro usuario también estaba modificando. O un usuario estaba borrando un registro que otro usuario necesitaba en su informe. Eso causaba muchos inconvenientes. Mientras no había algo mejor los usuarios debían conformarse con eso … pero ahora tenemos Cliente/Servidor.

¿Cómo funciona Cliente/Servidor?

En esta metodología los programas jamás “tocan” físicamente a los datos, aunque quieran hacerlo no podrán, es totalmente imposible. En lugar de eso, los programas se comunican con el Cliente, el Cliente le envía una petición al Servidor, y es el Servidor quien procesa esa petición y le envía la respuesta al Cliente y el Cliente se la envía de regreso al programa.

Programa —–> Cliente —–>Servidor

Servidor —–> Cliente —–> Programa

Como ves, el camino es mucho más largo pero también es muchísimo más seguro y confiable. El Cliente es el intermediario. Nada puede hacerse sin él.

Entonces, el Servidor se instala en una computadora. ¿En cuál computadora? En la computadora donde estarán alojadas todas las bases de datos.

El Cliente se instala en todas las demás computadoras, o sea en las computadoras que usarán los usuarios.

¿Y cómo se comunica el Cliente con el Servidor, y viceversa? Para que la comunicación entre ellos sea posible se necesita de una canal de comunicación. Hay muchos canales de comunicación, entre ellos: ADO, JDBC, ODBC, .NET, .PYTHON, etc. El más usado es el ODBC, pero tú puedes optar por cualquier otro, si así lo prefieres.

Cuando un programa necesita algo se lo pide al Cliente y éste se lo pide al Servidor. ¿Qué puede necesitar un programa? Veamos algunos ejemplos:

  • Grabar la venta que corresponde a la Factura Nº 12345, con fecha de hoy, le vendimos a Juan Pérez y el monto de la venta fue de 1.250 dólares
  • Grabar la cobranza que hoy le hicimos a María Benítez, según el Recibo Nº 785 y por un monto de 420 dólares
  • Cambiar el precio de venta de los monitores Toshiba de 21″, el nuevo precio es 100 dólares
  • Ver todas las ventas que hicimos el mes pasado
  • Ver los nombres de todos los vendedores que hoy hicieron ventas por más de 500 dólares

En todos estos casos el programa se lo pide al Cliente, el Cliente se lo pide al Servidor y el Servidor trata de cumplir con el pedido. Si pudo cumplir se lo indica al Cliente enviándole un número 1. Si no pudo cumplir le envía el número -1. Y si aún no terminó de procesar el pedido le envía un 0 (cero) y así el Cliente sabe que el Servidor todavía está trabajando.

Por lo tanto, cuando recibe un 1 el Cliente sabe que su petición tuvo éxito. Y si recibe un -1 el Cliente sabe que su petición falló. Súper fácil ¿verdad?

Si la petición tuvo éxito entonces el Cliente recibe un “cursor”. ¿Y qué es un cursor? ya lo sabes, porque ya lo hemos descrito en artículos anteriores de esta serie. Un cursor es una tabla de memoria, una tabla virtual, una copia del contenido que hay en el Servidor.

Eso significa que si modificas el cursor la Base de Datos ni se entera, su contenido queda exactamente igual a como estaba antes. ¿Por qué? porque el cursor es una copia de lo que está dentro de la Base de Datos (es como fotocopiar un libro, si escribes sobre la fotocopia el libro original continúa igual, allí no verás lo que escribiste en la fotocopia. En Cliente/Servidor siempre trabajas con fotocopias y jamás puedes tocar al libro original).

Resumiendo:

  • El Servidor se instala en una sola computadora (en la que se guardarán todas las bases de datos)
  • El Cliente se instala en muchas computadoras (en las que trabajarán los usuarios)
  • Para que el Cliente y el Servidor puedan comunicarse entre sí se necesita de un canal de comunicación entre ellos (por ejemplo el driver ODBC)
  • El Cliente envía peticiones al Servidor, el Servidor procesa esas peticiones y luego le envía el resultado al Cliente
  • El Cliente sabe que su petición tuvo éxito si recibe como respuesta el número 1. Si la respuesta es -1 entonces la petición falló. Si la respuesta es 0 entonces el Servidor aún continúa procesando los datos
  • Si el Cliente recibió un 1 porque la petición tuvo éxito entonces también recibe un “cursor”, o sea una tabla de memoria, donde se encuentra la respuesta enviada por el Servidor (por ejemplo, los nombres de todos los vendedores que hoy vendieron por un monto superior a 500 dólares)
  • Ni la aplicación (el sistema de contabilidad, de ventas, de tesorería, de cobranzas, etc.) ni el Cliente jamás tocan a los datos, solamente el Servidor puede hacer eso.
  • El Servidor sólo toca a los datos si recibe un pedido del Cliente para hacerlo. Si el Cliente no se lo pide, el Servidor jamás toca a los datos.

Ventajas de usar Cliente/Servidor

Control centralizado: Para poder acceder a una Base de Datos se necesita el nombre de un usuario y su contraseña y los permisos (también llamados derechos o privilegios) correspondientes. Una tabla .DBF puede abrirla cualquiera que conozca aunque sea un poquito de Visual FoxPro. Una tabla SQL no. Solamente podrá abrirla si tiene autorización para hacerlo.

Ocultamiento: Para abrir una tabla .DBF se requiere conocer en cual computadora se encuentra, en cual carpeta de esa computadora, y cual es el nombre de esa tabla .DBF. En buenos motores como Firebird SQL, no es necesario tener toda esa información. Podrías pedir conectarte a MISERVIDOR/MIBASEDATOSCOLEGIO y si previamente el Administrador de la Base de Datos definió a cual computadora se la conoce como MISERVIDOR y a cual Base de Datos de esa computadora se la conoce como MIBASEDATOSCOLEGIO, podrías realizar la conexión sin tener la menor idea del nombre real de la Base de Datos (podría ser DARWIN.FDB, por ejemplo) ni cual es la computadora (podría ser una computadora local, la que tiene el IP 192.168.0.25, por ejemplo; o podría ser una computadora remota, la que tiene el IP 181.120.90.145, por ejemplo).

Seguridad: Como consecuencia directa de los dos puntos anteriores, la seguridad que se puede obtener es muy grande. Si por ejemplo a un usuario solamente se le otorgó el derecho de hacer SELECT a la tabla ALUMNOS, él no podrá causarle un daño a la Base de Datos aunque lo intente y lo reintente. Primero, porque con un SELECT jamás podría causar daño, y segundo porque como ya vimos quizás ni siquiera sabe en cual computadora se encuentra la Base de Datos, ni en cual carpeta, ni cual es el nombre real de esa Base de Datos.

Velocidad: Los Servidores SQL están optimizados para conseguir una muy buena velocidad de respuesta. ¿Visual FoxPro te parece rápido? Si crees eso entonces es seguro que no has probado un buen motor SQL, tal como Firebird. El autor de este blog aún recuerda cuando un proceso que con tablas .DBF se demoraba más de 20 minutos en realizar, con Firebird finalizaba en 5 ó 6 segundos, es otro mundo.

Escalabilidad: Al mejorar el hardware de la computadora donde se encuentra el Servidor se puede conseguir un gran incremento en la velocidad de las respuestas.

Menos fallas: En las tablas .DBF un problema eterno es que pueden corromperse. Un corte de la energía eléctrica o de la conexión con el Servidor pueden dañar a las tablas de datos o a los archivos de índice. En un buen motor SQL (ya lo sabes: como Firebird) tal cosa no puede ocurrir. Aunque se corte la energía eléctrica 100 veces en un día, ninguna tabla de la Base de Datos será dañada.

Backups en cualquier momento: las tablas .DBF no se pueden copiar mientras están siendo usadas, primero debes cerrarlas y luego copiarlas. Con un buen motor SQL (y sí…Firebird) puedes realizar los backups cuando se te ocurra, ningún problema.

Mejor desarrollo de aplicaciones: como ya no debes escribir tanto código y además no debes perder tanto tiempo pensando en los algoritmos correctos, y haciendo un larguísimo proceso de prueba/error entonces puedes concentrarte en lo realmente importante: que tu aplicación se vea mejor, sea más fácil de usar, sea más completa. Esto te posibilitará aumentar las ventas y por lo tanto, ganar más dinero.

Conclusión:

Cambiar de la forma tradicional de programar a Cliente/Servidor no es algo que se puede conseguir de la noche a la mañana pero las ventajas de realizar ese cambio son muy grandes y deberían muy seriamente ser analizadas.

Porque en resumidas cuentas lo que se conseguirá será trabajar menos y obtener mejores resultados.

Artículos relacionados:

De DBF a SQL (1). Introducción

De DBF a SQL (2). Reemplazando comandos

De DBF a SQL (3). Entendiendo a los cursores

De DBF a SQL (4). Ejemplos de usar SELECT con una sola tabla

De DBF a SQL (5). Las funciones agrupadas

De DBF a SQL (6). Agrupando filas

De DBF a SQL (7). Poniéndoles condiciones a los grupos

De DBF a SQL (8). Ordenando las filas

De DBF a SQL (9). Uniendo tablas

De DBF a SQL (10). Obteniendo las primeras filas de una tabla

De DBF a SQL (11). Relacionando una tabla con otra tabla

De DBF a SQL (12). Relacionando una tabla consigo misma

De DBF a SQL (13). Relacionando a varias tablas entre sí

De DBF a SQL (14). Más sobre el uso de DISTINCT

De DBF a SQL (15). Usando subconsultas

De DBF a SQL (16). Más sobre las subconsultas

De DBF a SQL (17). Ejemplos de subconsultas

De DBF a SQL (18). Paginación

De DBF a SQL (19). Hallando los porcentajes sobre un total

De DBF a SQL (20). Los operadores especiales de comparación

De DBF a SQL (21). La técnica de los dos cursores

De DBF a SQL (22). Optimizando el uso del operador de comparación especial IN

De DBF a SQL (23). Usando la función CAST()

De DBF a SQL (24). Buscando texto

De DBF a SQL (25).  Creando tablas y cursores

De DBF a SQL (26). INSERT, UPDATE, y DELETE, con subconsultas

De DBF a SQL (28). Conectándose a un Servidor

De DBF a SQL (29). Las cadenas de conexión ODBC a los motores SQL más populares 

De DBF a SQL (30). Conectándose mediante ADO a las bases de datos

De DBF a SQL (31). Optimizando la escritura de los SELECT

De DBF a SQL (32). Mejorando la estética de los SELECT 

De DBF a SQL (33). Usando la función SQLEXEC()

De DBF a SQL (34). Enviándole parámetros a la función SQLEXEC()

El índice del blog VFPavanzado

 

Diferencias entre Angular y AngularJS

Aunque los nombres son muy similares, son productos totalmente distintos.

Para mejorar la productividad de sus programadores que usaban JavaScript en el año 2009 Google creó a AngularJS y en el año 2010 lo liberó para uso público. Desde el principio AngularJS tuvo mucho éxito, primero porque ayudaba mucho al programador a desarrollar más rápido sus aplicaciones web y segundo porque era un producto de Google. En los siguientes años Google recibió mucho feedback (críticas, consejos, sugerencias, recomendaciones) de los usuarios de AngularJS y así se decidió crear un producto nuevo, mejorado, al cual al principio se le llamó Angular2 y luego quedó simplemente en Angular. Este nuevo producto vio la luz en el año 2016.

El sufijo JS en AngularJS significa JavaScript. Un superconjunto de JavaScript se llama TypeScript y fue el que se decidió usar con Angular.

¿Y qué significa que sea un superconjunto? Que TypeScript es JavaScript con muchas nuevas características, que lo hacen más poderoso. Es un JavaScript con esteroides, dicen por ahí.

Angular no es un AngularJS mejorado, es un framework completamente nuevo, escrito desde cero, y con conceptos y formas de trabajar totalmente distintos.

Según Google, las aplicaciones escritas con Angular pueden llegar a ser hasta 5 veces más rápidas que las aplicaciones escritas con AngularJS.

Esa, ya sería una buena razón para que optemos por usar Angular y no AngularJS.

Se justificaría usar AngularJS solamente si los usuarios utilizan navegadores viejos que no cuentan con las características que necesita Angular, pero como los navegadores son gratis no hay razón para no actualizar los navegadores a sus últimas versiones.

¿Qué es un framework?

Es un entorno de trabajo (también llamado: marco de trabajo) que comprende una estructura basada en módulos de software que trabajan de forma integrada y coordinada.

Como muchas de las tareas que necesitaremos realizar al desarrollar software ya se encuentran incluidas en el framework, ahorraremos mucho tiempo y así terminaremos la aplicación mucho más rápidamente.

Principales diferencias entre Angular y AngularJS

  1. Angular está orientado a teléfonos inteligentes (smartphones). AngularJS no se hizo para soportar teléfonos inteligentes (smartphones). Los soporta mediante bibliotecas adicionales pero no se hizo pensando en  eso. En cambio Angular desde el principio se creó para que tuviera un buen rendimiento en los teléfonos inteligentes (smartphones).
  2. Angular usa TypeScript, mientras que AngularJS usa JavaScript. TypeScript es un superconjunto de JavaScript, en otras palabras es un JavaScript muy mejorado.
  3. En Angular se usan componentes web, en AngularJS se usan controladores. Los componentes web son un conjunto de características que se añaden a las especificaciones HTML y DOM. La intención es que sean reutilizables en las aplicaciones web.
  4. La sintaxis de las directivas estructurales ha cambiado. Por ejemplo, en Angular se usa *ngFor y en AngularJS se usa ng-repeat.
  5. Angular usa directamente el DOM. Las siglas DOM significan Document Object Model. Se trata de un conjunto de objetos para representar documentos HTML, XHTML, y XML, un modelo estándar sobre cómo pueden combinarse dichos objetos, y una interfaz estándar para acceder a ellos y manipularlos. A través del DOM, los programas pueden acceder y modificar el contenido, la estructura y el estilo de los documentos HTML y XML, que es para lo que se diseñó el DOM principalmente. En AngularJS se usan directivas para acceder al DOM, en Angular ya es algo directo.

En síntesis, aunque los nombres son parecidos, no son la misma cosa. Angular es mejor que AngularJS.

Conclusión:

No te confundas, Angular y AngularJS no son la misma cosa. Angular no es una versión mejorada de AngularJS sino que es un producto totalmente nuevo y distinto. Hacen cosas similares pero Angular es mejor, y por lo tanto es lo más recomendable para aprender y para utilizar.

Artículos relacionados:

De Visual FoxPro a Angular

El índice del blog VFPavanzado

De Visual FoxPro a Angular

Visual FoxPro es un lenguaje de programación muy bueno y tiene muchas características superlativas de las cuales carecen otros lenguajes de programación y por eso continúa vigente después de décadas.

Sin embargo, desde el año 2004 que no aparece una nueva versión y ya nunca aparecerá una nueva versión porque está discontinuado.

Mientras tanto, la tecnología irá avanzando y avanzando, no nos esperará, y si no nos ponemos al día estaremos cada vez más atrasados y no podremos competir en un mercado tan competitivo como es el de la Informática.

Por ese motivo en algún momento deberemos decirle adiós a nuestro Visual FoxPro y elegir otra alternativa entre las decenas o centenas que existen. Tenemos lenguajes muy populares como Java, C, C++, Delphi, Lazarus, JavaScript y otros que no son tan conocidos pero que sin embargo pueden ser muy útiles para nuestros fines. ¿Cuál de ellos elegir?

En este momento la tecnología se decanta hacia aplicaciones web.

¿Qué es una aplicación web?

Una aplicación que se ejecuta en un navegador. Este navegador puede utilizar un servidor web externo o un servidor web interno. Esto último significa que no es necesario tener una conexión a Internet activa para que la aplicación funcione.

¿Cuáles son las ventajas de las aplicaciones web?

  1. Instalación. No se requiere instalar ningún programa en la computadora del usuario. Él simplemente usando su navegador se conecta a una URL y allí tendrá disponibles todas las opciones que necesita tener.
  2. Versión actualizada siempre. El programador coloca su aplicación en el servidor web y todos quienes se conecten a ese servidor web dispondrán al instante de la última versión de la aplicación.
  3. Ahorro en espacio de almacenamiento. Como todo se encuentra en el servidor web, no se usa el disco duro del usuario.
  4. Muy poco uso de recursos. Como casi todo el procesamiento se realiza en el servidor web entonces casi no se usan los recursos de la computadora del usuario.
  5. Multiplataforma. Se pueden usar en cualquier sistema operativo, y en cualquier momento. El usuario solamente necesita tener un navegador compatible. Y como los navegadores son gratis, tener uno compatible está al alcance de todos.
  6. Portables. Se pueden usar en computadoras de escritorio, en notebooks, en celulares inteligentes (smartphones), en tabletas, y en cualquier dispositivo presente o futuro que pueda visualizar páginas web.
  7. Trabajo compartido. Se puede trabajar en equipo fácilmente con otras personas, ya que las aplicaciones web son portables.
  8. Protección contra virus y malware. Aunque no son inmunes, es más difícil que se vean afectadas por virus o por malware.

¿Qué es el software como servicio?

Una estrategia comercial que puede ser muy redituable económicamente a los informáticos. Se trata simplemente de colocar el software en un servidor web al cual los usuarios se conectan mediante Internet. El usuario paga una cuota mensual o anual para usar la aplicación, la cual no se instala en su computadora.

Esto tiene varias ventajas:

  1. Sabremos cuantos clientes activos usan nuestra aplicación
  2. Sabremos cuales clientes usan pocas veces nuestra aplicación. ¿Por qué? ¿Qué pasó? ¿Por qué ya la usan pocas veces?
  3. Sabremos la cantidad de dispositivos que usan nuestra aplicación
  4. Tendremos un ingreso mensual o anual predecible

Pero también tiene sus desventajas:

  1. Internet en Latinoamérica no es muy confiable. Por «h» o «b» motivo se puede cortar la conexión durante muchos minutos y ninguna Empresa grande querrá correr el riesgo de dejar de trabajar por ese motivo.
  2. Si el cliente debe acceder a la aplicación web desde muchas computadoras eso le ocasionará un gasto mayor ya que deberá contratar un ancho de banda más grande con su Proveedor de Internet para que la aplicación trabaje de forma fluida.

¿Cuál herramienta elegir para crear aplicaciones web?

En este momento hay muchas alternativas y seguramente con el transcurrir de los meses y de los años irán surgiendo más y más. Por lo tanto, la decisión no es fácil. Cualquier herramienta que elijamos podría hacer que nos arrepintamos más tarde.

Después de evaluar los pros y los contras de decenas de esas alternativas el autor de este blog eligió a Angular.

¿Por qué Angular?

  1. Fue creado por Google.
  2. Es mantenido y actualizado por Google, quien se comprometió a lanzar una versión mayor cada 6 meses, y lo está cumpliendo.
  3. La probabilidad de que sea discontinuado en los próximos años es cero.
  4. Tiene muchísimos usuarios, es el framework más utilizado en la actualidad para crear aplicaciones web.
  5. Hay mucha ayuda en Internet, en YouTube hay cientos de vídeos que explican como instalarlo y utilizarlo.
  6. Las aplicaciones creadas con Angular pueden ser visualizadas y utilizadas en cualquier dispositivo que permita navegar por la web: computadoras de escritorio, notebooks, celulares inteligentes (smartphones), tabletas, etc.
  7. Es muy rápido. La mayor demora es cuando se carga la aplicación en el navegador, luego de eso ya corre rapidísimo.
  8. Es escalable. Se puede empezar con una aplicación pequeña y luego ir aumentando sus prestaciones, de una forma muy sencilla.
  9. Facilita el trabajo en equipo. Si un programador deja de trabajar en un proyecto, incorporar a un nuevo programador para que continúe con ese proyecto es muy fácil y muy rápido. Si trabajas solo esta característica puede no interesarte pero si eres o piensas ser el dueño de una Empresa de desarrollo de software, esta característica te resultará muy valiosa.
  10. Permite manipular grandes conjuntos de datos. No importa lo grande que sea una Empresa, con Angular se pueden manejar todos sus datos.
  11. Las interfaces con el usuario pueden ser muy vistosas. Hay miles de componentes (en Visual FoxPro los llamamos controles) ya creados, que sirven para que los formularios sean muy atractivos visualmente, y además puedes crear tus propios componentes, si lo deseas.
  12. Cuando estés escribiendo tu código fuente obtendrás ayuda sobre las dudas que tengas al instante, si usas un IDE compatible con Angular (y muchos IDE ya son compatibles).
  13. Es muy rápido crear una nueva aplicación porque ya mucho de lo que necesitas fue creado previamente por otros, entonces es simplemente cuestión de usar eso.

¿Qué es lo que queremos los desarrolladores de software?

La respuesta a esa pregunta, en la gran mayoría de los casos es: terminar las aplicaciones muy rápido y sin errores.

De esta manera, podríamos ganar mucho más dinero y también descansar más.

Y Angular nos puede ayudar a alcanzar ese objetivo, y es la razón por la cual el autor de este blog se decidió a aprenderlo.

¿Cuál es el siguiente paso?

Como es probable que alguien más esté interesado en aprender a usar Angular, a este blog se le agregó esa Categoría y artículos que mostrarán como pasar de Visual FoxPro a Angular irán apareciendo en los siguientes días.

Artículos relacionados:

El índice del blog VFPavanzado

 

Como insertar aplicaciones de terceros en nuestros formularios

A veces nos gustaría que aplicaciones de terceros sean llamadas por nuestra aplicación e insertadas en nuestros formularios. Aquí está como hacerlo.

  • Creamos un formulario
  • Le insertamos un control Shape
  • Colocamos a nuestro control Shape en la ubicación que nos gusta, con el ancho y el alto que la aplicación de terceros tendrá
  • Ponemos la propiedad Visible de nuestro control Shape en .F.

Captura 1. Si haces clic en la imagen la verás más grande

Listado 1. El método INIT() del formulario

LOCAL lnResultado, lnHwnd1, lnHwnd2, lnHeight, lnLeft, lnTop, lnWidth

  #DEFINE MSG_BOTON_OK 0
  #DEFINE MSG_ICONO_ERROR 16

  DECLARE INTEGER SetParent IN USER32 ;
    INTEGER, ;
    INTEGER

  DECLARE INTEGER WinExec IN KERNEL32 ;
    STRING , ;
    INTEGER

  DECLARE INTEGER FindWindow IN USER32 ;
    STRING, ;
    STRING

  DECLARE INTEGER SetWindowPos IN user32;
    INTEGER, ;
    INTEGER, ;
    INTEGER, ;
    INTEGER, ;
    INTEGER, ;
    INTEGER, ;
    INTEGER

  *--- Bloc de Notas. La aplicación que queremos insertar en nuestro formulario
  lnResultado = WinExec("NOTEPAD.EXE", 1)

  IF lnResultado < 32
    =MessageBox("Verifica que el Bloc de Notas esté instalado", MSG_ICONO_ERROR + MSG_BOTON_OK, "ERROR...")
    RETURN
  ENDIF

  *--- Hallamos el "handle" del Bloc de Notas. El Windows busca el Caption de esa aplicación,
  *--- así que debemos escribirla exactamente igual
  lnHwnd1 = FindWindow(.NULL., "Sin título: Bloc de notas")

  *--- Colocamos al Bloc de Notas dentro de nuestro formulario
  =SetParent(lnHwnd1, ThisForm.HWnd)

  *--- Dimensionamos al Bloc de Notas para que sea igual a nuestro control SHAPE
  WITH ThisForm.Shape1
    lnHeight = .Height
    lnLeft   = .Left
    lnTop    = .Top
    lnWidth  = .Width
  ENDWITH

  *--- Hacemos que el Bloc de Notas tenga las mismas dimensiones que nuestro control SHAPE
  =SetWindowPos(lnHwnd1, 1, lnLeft, lnTop, lnWidth, lnHeight, 64)

Y listo, eso es todo. Si ahora ejecutamos nuestro formulario veremos que tiene a un Bloc de Notas insertado, y en la ubicación y con las dimensiones que nosotros quisimos que tuviera.

Captura 2. Si haces clic en la imagen la verás más grande

Podemos hacer lo mismo con otras aplicaciones, no solamente con el Bloc de Notas, también con Excel, por ejemplo. Para tener a ambas aplicaciones en nuestro formulario:

Captura 3. Si haces clic en la imagen la verás más grande

Listado 2. El nuevo método INIT() del formulario

LOCAL lnResultado, lnHwnd1, lnHwnd2, lnHeight, lnLeft, lnTop, lnWidth

  #DEFINE MSG_BOTON_OK 0
  #DEFINE MSG_ICONO_ERROR 16

  DECLARE INTEGER SetParent IN USER32 ;
    INTEGER, ;
    INTEGER

  DECLARE INTEGER WinExec IN KERNEL32 ;
    STRING , ;
    INTEGER

  DECLARE INTEGER FindWindow IN USER32 ;
    STRING, ;
    STRING

  DECLARE INTEGER SetWindowPos IN user32;
    INTEGER, ;
    INTEGER, ;
    INTEGER, ;
    INTEGER, ;
    INTEGER, ;
    INTEGER, ;
    INTEGER

  *--- Bloc de Notas. La aplicación que queremos insertar en nuestro formulario
  lnResultado = WinExec("NOTEPAD.EXE", 1)

  IF lnResultado < 32
    =MessageBox("Verifica que el Bloc de Notas esté instalado", MSG_ICONO_ERROR + MSG_BOTON_OK, "ERROR...")
    RETURN
  ENDIF

  *--- Hallamos el "handle" del Bloc de Notas. El Windows busca el Caption de esa aplicación,
  *--- así que debemos escribirla exactamente igual
  lnHwnd1 = FindWindow(.NULL., "Sin título: Bloc de notas")

  *--- Colocamos al Bloc de Notas dentro de nuestro formulario
  =SetParent(lnHwnd1, ThisForm.HWnd)

  *--- Dimensionamos al Bloc de Notas para que sea igual a nuestro control SHAPE
  WITH ThisForm.Shape1
    lnHeight = .Height
    lnLeft   = .Left
    lnTop    = .Top
    lnWidth  = .Width
  ENDWITH

  *--- Hacemos que el Bloc de Notas tenga las mismas dimensiones que nuestro control SHAPE
  =SetWindowPos(lnHwnd1, 1, lnLeft, lnTop, lnWidth, lnHeight, 64)
*--- Excel. La aplicación que queremos insertar en nuestro formulario
  lnResultado = WinExec("C:\Program Files\Microsoft Office\Office14\EXCEL.EXE", 1)

  IF lnResultado < 32
    =MessageBox("Verifica que Excel esté instalado", MSG_ICONO_ERROR + MSG_BOTON_OK, "ERROR...")
    RETURN
  ENDIF

  *--- Hallamos el "handle" del Excel. El Windows busca el Caption de esa aplicación,
  *--- así que debemos escribirla exactamente igual
  lnHwnd2 = FindWindow(.NULL., "Microsoft Excel - Libro1")

  *--- Colocamos al Excel dentro de nuestro formulario
  =SetParent(lnHwnd2, ThisForm.HWnd)

  *--- Dimensionamos al Excel para que sea igual a nuestro control SHAPE
  WITH ThisForm.Shape2
    lnHeight = .Height
    lnLeft   = .Left
    lnTop    = .Top
    lnWidth  = .Width
  ENDWITH

  *--- Hacemos que el Excel tenga las mismas dimensiones que nuestro control SHAPE
  =SetWindowPos(lnHwnd2, 1, lnLeft, lnTop, lnWidth, lnHeight, 64)

RETURN
*
*

Y entonces, al ejecutar nuestro formulario:

Captura 4. Si haces clic en la imagen la verás más grande

Y listo, eso es todo. Ya tenemos al Bloc de Notas y al Excel insertados en nuestro formulario. Usando esta misma técnica podemos insertar a cualquier otra aplicación.

Comentarios:

Usar los controles Shape no es obligatorio, es simplemente para de una forma muy sencilla poder ubicar y dimensionar a las aplicaciones de terceros. Es más fácil mover y dimensionar a un control Shape que estar probando y probando mediante código la ubicación y el tamaño de la aplicación de terceros. Además, aunque en este artículo hemos puesto a sus propiedades Visible en .F. esto tampoco es obligatorio, puedes ponerlas en .T. si te gusta más el resultado que obtienes.

Tampoco es obligatorio usar a la función de la API del Windows llamada WinExec(), puedes usar a la función ShellExecute() si quieres. O el comando RUN del Visual FoxPro, también servirá.

Si la función WinExec() termina con un error, el número de ese error será menor que 32. Si al ejecutar el Listado 2. no se abre el Bloc de Notas o no se abre Excel entonces puedes buscar en Internet el valor que te devolvió esa función (el cual se guarda en la variable lnResultado). El error más común es File not found (o sea, archivo no encontrado, en español).

Artículos relacionados:

El índice del blog VFPavanzado

Fuente:

Este artículo está basado en un artículo de Bernard Bout de Australia:

https://www.foxite.com/archives/use-notepad-on-a-scx-0000129391.htm

 

Registrando archivos OCX y DLL

Muchas veces nuestras aplicaciones necesitan para su correcto funcionamiento algunos archivos OCX o librerías DLL y por lo tanto necesitamos que estén registrados antes de que el usuario ejecute nuestra aplicación.

Si un OCX o un DLL no están registrados en la computadora del usuario, entonces no se los puede utilizar.

En versiones antiguas del sistema operativo Windows la registración era muy sencilla, sin embargo a partir de Windows Vista se necesita tener derechos de Administrador para poder registrar.

Además, la registración también puede fallar. Los motivos más comunes son:

  1. No tenías derecho de Administrador
  2. El archivo que quisiste registrar no existe

Listado 1. Intentando registrar un archivo OCX

Local lnResultado

  lnResultado = REGISTRAR_OCX("E:\SISTEMAS\MSCHRT20.OCX")

  do case
    case lnResultado = 0
      =MessageBox("Registración OK")
    case lnResultado = 1
      =MessageBox("No existe el archivo que quisiste registrar")
    case lnResultado = 2
      =MessageBox("No se pudo registrar, error desconocido")
    otherwise
      =MessageBox("No se pudo registrar, no lo ejecutaste como Administrador")
  endcase

Return
*
*
FUNCTION REGISTRAR_OCX
LParameters tcNombreOCX
Local lnNumError

  lnNumError = 0

  TRY
    DECLARE LONG DllRegisterServer IN (tcNombreOCX)
  CATCH
    lnNumError = 1
  ENDTRY

  IF lnNumError = 0
    TRY
      lnNumError = DLLRegisterServer()
    CATCH
      lnNumError = 2
    ENDTRY
  ENDIF

Return(lnNumError)
*
*

En el Listado 1. se trata de registrar el archivo «E:\SISTEMAS\MSCHRT20.OCX» y luego se muestra un mensaje informando si se realizó con éxito o no.

La función REGISTRAR_OCX() es la que intenta realizar la registración.

NOTA: Aunque la función se llama REGISTRAR_OCX() también sirve para registrar archivos DLL.

Recuerda que para que funcione, debes ejecutar a ese programa con derechos de Administrador. Es por lo tanto una buena idea crear un archivo .EXE que se encargue de registrar a todos los OCX y todas las DLL que nuestra aplicación necesita y ejecutar a ese archivo .EXE como Administrador.

El mejor momento es cuando instalamos nuestra aplicación. Nuestra aplicación normalmente no necesita ser ejecutada con derechos de Administrador pero el programita .EXE que registra a los OCX y a las DLL sí que necesita esos derechos.

Artículos relacionados:

El índice del blog VFPavanzado