martes, agosto 28, 2012

Abrir formularios en Lazarus-FreePascal



Como en un lenguaje de programación moderno (con extensión para orientación a objetos), en Lazarus - FreePascal tenemos dos formas de abrir formularios:



  1. De forma estática. Diseñas los formularios. Luego, al iniciar la aplicación se crean todos los formularios, aunque están ocultos. Cuando quieras lo haces visible en tiempo de ejecución.
  2. De forma dinámica. Cuando abres una aplicación como el Microsoft Word, tú no sabes cuantos formularios "de documento" vas a tener que abrir. El usuario puede abrir 1 documento o 20. Cada vez que haga clic en "Nuevo documento" hay que abrir un formulario.
1.-FORMA ESTÁTICA DE CREAR FORMULARIOS.

Diseñamos los formularios que necesitemos con Lazarus. Para crear un nuevo formulario vamos al MENÚ ARCHIVO, Opción NUEVO FORMULARIO.

Hay que tener en cuenta que cada formulario gráfico que hemos creado está descrito en una unidad (UNIT). Para verlo seleccionamos el formulario y vamos al MENÚ VER, Opción "EDITOR DE CÓDIGO FUENTE". El nombre de la unidad se encuentra en la primera línea del código fuente del formulario. Por ejemplo:

unit Unit1;

Si desde este form1 que está definido en Unit1, queremos llamar al form2, tenemos que incluir la definición de form2 dentró de la sección uses:

uses: 
xxxxx, xxxxxx, xxxxxx, xxxxxx, unit2;

Ahora ya podemos "llamar" al form2 desde form1. Realmente la invocación sólo consiste en hacer visible el formulario. Eso es así porque al arrancar se crean todos los formularios que hemos diseñado.

form2.show;

2.-FORMA DINÁMICA DE CREAR FORMULARIOS.

Tenemos que pensar que cada formulario es un objeto. Nuestro programa puede necesitar abrir varios objetos de ese tipo (formularios de entrada, informes, etc.), aunque cada uno tenga datos diferentes.

Vamos al MENÚ PROYECTO, Opción OPCIONES DEL PROYECTO, y elegimos FORMULARIO. Saldrá esta ventana:


Pasamos los formularios que haya que abrir dinámicamente, de la columna "CREAR FORMULARIOS AUTOMÁTICAMENTE" a la de "FORMULARIOS DISPONIBLES".

En los eventos OnClose de los formularios tenemos que añandir lo siguiente para que libere la memoria:
CloseAction:= caFree;

Lo único que hay que hacer ahora para abrir el form2 desde el form1 es instanciar el objeto form2:

procedure Tform1.Button1Click(Sender: TObject);
var
   frmDocumento: Tform2;
begin
   frmDocumento:= Tform2.Create(Application);
   frmDocumento.Show;
end;  

Saludos.

lunes, agosto 27, 2012

Lazarus (freepascal), acceso a Oracle, segunda parte




El otro día explicaba cómo acceder a la base de datos desde FreePascal, aunque realmente sólo hacía una SELECT.
Hoy toca una update que es muy parecido.






Es muy similar a la SELECT del otro día. Hay estas diferencias:

  • En la SELECT se hace SQLQuery1.Open.
  • En la UPDATE SQLQuery1.ExecSQL.
  • En la UPDATE hay que hacer COMMIT de la transacción con SQLTransaction1.Commit.
Luego hay que tener en cuenta unos detalles para que no se generen errores:

ORACLE espera que indiquemos los valores VARCHAR2 (equivalentes al tipo String) entre comillas simples. El problema es que si ponemos comillas simples dentro de SQLquery1.SQL.Text, se corta el string y nos salta un error que indica que el String está mal construido.

La solución es incluir dos comillas simples. FreePascal entiende que la primera comilla es un caracter de escape y en el String que se forma tiene que haber una comilla simple.


El código fuente para el copia-pega:



procedure TfrmPrincipal.Button2Click(Sender: TObject);
var
  OracleConnection1: TOracleConnection;
  SQLquery1: TSQLQuery;
  SQLtransaction1: TSQLTransaction;
begin
  OracleConnection1 := TOracleConnection.Create(nil);
  SQLquery1 := TSQLQuery.Create(nil);
  SQLtransaction1 := TSQLTransaction.Create(nil);
  try
    try
      with OracleConnection1 do begin
           DatabaseName:='entradaTNS-ORACLE';
           UserName:='usuario';
           Password:='password';
           Transaction := SQLtransaction1;
      end;
      OracleConnection1.Connected:=true;
      SQLtransaction1.Active:=true;
      SQLquery1.DataBase := OracleConnection1;
      SQLquery1.SQL.Text := 'update TABLA set CAMPO=''C'' where CAMPO2=''D''';
      SQLQuery1.ExecSQL;
      SQLTransaction1.Commit;
      ShowMessage ('Campo actualizado');
      SQLquery1.Close;
      OracleConnection1.Close;
    finally
      SQLtransaction1.Free;
      SQLquery1.Free;
      OracleConnection1.Free;
    end;
  except
    on E: Exception do
      writeln(E.message);
  end;
end;

Saludos,

viernes, agosto 24, 2012

Formulario MDI en Lazarus - FreePascal

Quiero iniciar una aplicación en Lazarus. Lo primero es el formulario MDI principal (Multiple Document Interface). Si abrimos el Word por ejemplo, hay un formulario principal MDI que contiene los menús, las barras de herramientas, etc. Y luego podemos abrir múltiples documentos Word, cada uno de ellos en formularios "hijos" que se pueden minimizar, maximizar, hacer un mosaico, pero dentro del formulario MDI principal.

Como el otro día, reina la confusión. En este foro de freePascal de Enero de 2010, una persona pregunta por los formularios MDI y por las respuestas, todo parece indicar que no existe la implementación.

En el Club Delphi una persona recomienda utilizar la propiedad FormStyle. Dice que pongamos el formulario principal como fsnormal y los formularios hijos como fsStayOnTop.

En los Wiki de FreePascal y de Lazarus, indican que no hay formularios MDI, pero que tenemos algo similar que denominan MultiDoc (MultiDoc en FreePascal y MultiDoc en Lazarus). Sin embargo, es un desarrollo de un tercero, y los enlaces a la descarga de la última versión (0.3.1) están rotos.

Llegados a este punto desisto de los formularios MDI. Ya me he hecho a la idea que habrá que usar el truco del FormStyle. Voy a la propiedad FormSyle de mi formulario principal y SORPRESA!!! LA PROPIEDAD ADMITE LOS SIGUIENTES VALORES:


  1. fsNormal
  2. fsSplash
  3. fsStayOnTop
  4. fsSystemStayOnTop
  5. fsMDIForm
  6. fsMDIChild
Bueno, pues salvo nuevas sorpresas parece que ya hay formularios MDI en freePascal/Lazarus.

Saludos.

jueves, agosto 23, 2012

Lazarus (freepascal), acceso a Oracle

 ACCESO A ORACLE DESDE LAZARUS (FREE PASCAL):

Desarrollar en Lazarus tiene un grave problema: Hoy en día se utiliza Google como herramienta de documentación para el desarrollo de aplicaciones. En el caso de Lazarus no hay más remedio ya que no hay ninguna ayuda integrada en el IDE. Sin embargo en Internet no hay muchos ejemplos de código freePascal cuando toca hacer algo en el entorno de trabajo (conexión a Oracle por ejemplo).

Digo esto en comparación con otros lenguajes o plataformas como C# o VB.NET por ejemplo. En estos casos el problema suele ser las diferencias que hay entre los diferentes framework, pero ese es otro asunto.

 1.-Forma gráfica: añadir control TORACLECONNECTION de la pestaña SQLdb de la barra de herramientas.

El problema es que no hay una ayuda clara para saber lo que hay que poner en los campos principales. Esto es lo que yo he necesitado:
  1. En DatabaseName ponemos la entrada TNS del fichero TNSNAMES.ORA del cliente Oracle.
  2. En UserName ponemos el usuario Oracle.
  3. En Password la password de ese usuario Oracle.
y nada más. En cuanto pongamos la propiedad CONNECTED a TRUE veremos si conecta bien o no.

2.-Forma no gráfica de hacer la conexión y una ejecución de una instrucción SQL.

NOTA IMPORTANTE: como antes he metido en control gráfico TORACLECONNECTION, este objeto se ha creado en la carga del formulario. Si no agregamos el control de forma gráfica, tendremos que declara la variable en la zona de VAR, y crearla después del BEGIN:

var
OracleConnection1: TOracleConnection;
...
begin
OracleConnection1 := TOracleConnection.Create(nil);
...



El código fuente para copia-pega:

procedure TForm1.Button1Click(Sender: TObject);
var
  SQLquery1: TSQLQuery;
  SQLtransaction1: TSQLTransaction;
begin
  SQLquery1 := TSQLQuery.Create(nil);
  SQLtransaction1 := TSQLTransaction.Create(nil);
  try
    try
      with OracleConnection1 do begin
           DatabaseName:='instancia.host.es';
           UserName:='xxxxxxx';
           Password:='xxxxxxx';
           Transaction := SQLtransaction1;
      end;
      OracleConnection1.Connected:=true;
      SQLtransaction1.Active:=true;
      SQLquery1.DataBase := OracleConnection1;
      SQLquery1.SQL.Text := 'select * from tabla1';
      SQLquery1.Open;
      SQLquery1.Last;
      ShowMessage (intToStr(SQLquery1.RecordCount));
      SQLquery1.First;
      while not SQLquery1.EOF do
      begin
        ShowMessage (SQLquery1.FieldByName('campo1').AsString);
        SQLquery1.Next;
      end;
    finally
      SQLtransaction1.Free;
      SQLquery1.Free;
      OracleConnection1.Free;
    end;
  except
    on E: Exception do
      writeln(E.message);
  end;
end;

Más información, aunque más orientada a la base de datos Firebird en el wiki de FreePascal, tema: SQLdb Tutorial.

Saludos.

jueves, agosto 16, 2012

Lazarus 1.0 ya disponible


En Febrero de 2011 me preguntaba si ya era el momento de Lazarus, el IDE multiplataforma y software libre para desarrollar con el lenguaje Pascal (la alternativa libre de Delphi).

La noticia ahora es que han lanzado la versión 1.0 RC que ya está disponible en http://sourceforge.net/projects/lazarus/files/

Características destacables de Lazarus:

  • Genera binarios directamente ejecutables, sin máquinas virtuales ni frameworks intermedios, por lo que el despliegue de aplicaciones y la resolución de problemas se simplifica.
  • Software libre.
  • Multiplataforma (Windows, GNU/Linux, Mac OSX). Su lema es "Write once, compile anywhere".
  • Lenguaje Pascal: elegante y potente.
  • IDE con muchas facilidades gráficas, similar en apariencia al del Visual Studio
Saludos.

domingo, agosto 12, 2012

Seguimos con los privilegios del señor. Antes era uno y ahora un montón.

Igual que con el sistema feudal de la edad media. Antes había que pagar tributos al señor feudal y el diezmo a la iglesia. Ahora no hay señor, pero están los políticos (no todos, pero si los más caraduras).



Esto es peor de lo que cualquiera puede imaginar (ir a la noticia por favor). Resulta que las mesas del parlamento y del congreso deciden estos sueldos según su propio criterio y de forma secreta. Si les caes mal te quedarás sin él. Si eres muy majo para el grupo de privilegiados te pondrán unos 2.000 euros al mes. Si te condenaron por algún delito grave pero te deben algún favor, pues también tendrás los 2.000 euros mensuales. ¡¡¡INAUDITO!!!

Hablamos del "desvío" de 635.000 euros anuales de dinero público que como todo privilegio medieval es heredable. En estos momentos 65 viudas cobran la graciosa ayuda. Lo peor es que si se lo comentas a algún político (inténtalo) mostrará su asombro por la queja, y no tardará en explicarte que es una virtud de la democracia y bla bla bla.

Con tanta corrupción no sé si saldremos de esta.
Saludos.

sábado, agosto 11, 2012

Mi experiencia con Apple (de momento)

En este interesante artículo titulado CINCO DETALLES QUE APPLE NO QUIERE QUE CONOZCAS, enumeran cinco prácticas de Apple que quería comentar.

1.-"Su producto no será puntero por mucho tiempo".
Bien, ¿y a quien le importa eso? Cuando compramos un coche ocurre lo mismo. Esto sólo puede importar a los snob. No compres tecnología por imagen. Para el tema de la imagen cómprate una gafas bonitas.

Más me preocupa mi caso particular:
En Diciembre de 2008 compré un MAC Mini. Bastante barato por cierto (unos 800 euros). Venía con el S.O. OSX Leopard. Al poco tiempo lanzaron el Snow Leopard por unos 35 euros. Pensé que ya lo compraría cuando me hiciera falta. Ha pasado el tiempo y empieza a haber aplicaciones que no se van a actualizar más para Leopard (el Chrome por ejemplo). Es algo grave porque afecta a la seguridad. Voy a comprar el Snow Leopard... SORPRESA. No se puede adquirir en el MAC Store. Lo han retirado. Tampoco puedo comprar el Mountain Lion porque hay que comprarlo desde el Mac App Store. No hay Mac App Store para Snow Leopard. Estoy atrapado en un S.O. obsoleto sin que sea un problema de hardware ¿Esto tiene algún sentido?

2.-"Con Apple se gasta más".
Al leer este punto verás que habla del iPhone y del iPad y dice que se gasta más que con otros dispositivos móviles (un 10% más). No tengo el iPhone (tengo un Samsung baratito). Mi gasto exceptuando la operadora telefónica es cero. El 10% de cero es cero. Con el iPad sí es verdad que compré un ajedrez electrónico. Fueron menos de 5 euros porque era de lo mejorcito.

3.-"Los inversores dudan de nuestra capacidad de innovación".
Hablan de que al morir Steve Jobs puede que no sepan que cosas nuevas hacer. Mencionan también que el entorno móvil es muy cambiante y Apple podría ser el siguiente en caer. Mi opinión es que esto para la prensa rosa. El futuro ya vendrá y en informática 5 años es toda una vida.

4.-"El iPhone está muy sobrepreciado".
Si se vende no veo el problema. Será que el comprador considera que lo vale. Mayor problema me parece que sea su producto estrella, esto es, la que más beneficios le reporta. Esto podría perjudicar al desarrollo del resto de familias de productos (ordenadores y portátiles básicamente). No será la primera vez que algo bueno desaparece por el éxito de otra línea de producto.

5.-"Te engancharemos de por vida".
Precisamente han dejado en último lugar lo más importante para el usuario. Restricciones a la libertad del uso de nuestros propios contenidos. El riesgo de verse atrapado por una marca concreta. Si compramos un coche, es razonable que en algunos elementos como la centralita electrónica, la radio integrada, la llave electrónica, etc. dependamos totalmente de la marca, pero las ruedas, el aceite, los arreglos de carrocería, etc. etc. los haré donde me dé la gana. Si a lo largo de un largo viaje compro unos CD-s de música, no sería razonable que sólo funcionaran en mi coche. Al parecer es lo que ocurre en la actualidad con el iTunes (eso dicen en el artículo, aunque que yo sepa hay iTunes para Windows). Respecto a la nube de Apple, el iCloud , según indica sólo es accesible desde dispositivos Apple. Entiendo que esta no es una situación deseable para el usuario y tiene que ser debidamente valorada.

Saludos.

jueves, agosto 02, 2012

Guerra ORACLE - HP - INTEL

Publiqué el 5 de Mayo de 2011 que empezaba una importante guerra entre gigantes, cuya resolución va a ser importante para casos similares que puedan ocurrir en el futuro.

ORACLE no iba a desarrollar más sobre la plataforma Itanium de Intel. Teniendo en cuenta que el mayor fabricante que trabaja con Itanium es HP, y que el 30% de las bases de datos ORACLE corren en esas máquinas HP Itanium, estaba claro que HP (e INTEL) no se iban a quedar de brazos cruzados.

En este caso además ocurren dos circunstancias que hacen sospechar mala fe por parte de ORACLE:


  1. En abril de 2009 ORACLE compra SUN y pasa a ser fabricante de servidores. Tal vez las ventas no iban todo lo bien que querían y su mayor competidor es HP. Dejar de desarrollar ORACLE para HP le quita competencia y aumenta su ración de tarta.
  2. El ex-presidente de HP Mark Hurd, que fue despedido después de un escándalo sexual, con un indemnización de 40 millones de dólares que incluía un acuerdo de confidencialidad, fue contratado por ORACLE para sustituir a Charles Phillips como copresidente y miembro del consejo de administración de ORACLE, que a su vez también fue despedido por un escándalo con su amante. Yo me pierdo con tanto escándalo, aquí lo explican mejor. Un vengativo Mark Hurd en su nombramiento debió decir: “Creo que con su estrategia de combinar software y hardware, Oracle podrá batir a IBM tanto en servidores de empresas como en almacén de datos”. Claro que para eso primero tiene que comerse la tajada de HP. Esta historia ocurrió por el mes de Septiembre de 2010.
Pues la primera batalla parece que la gana HP, ya que la noticia hoy es que "LOS TRIBUNALES DAN LA RAZÓN A HP EN UN MILLONARIO JUICIO CONTRA ORACLE".

Lo que está claro es que para clientes de HP con un Itanium de última generación a nuestro cargo, es una buena noticia el poder migrar un día a ORACLE 12 cuando se estime conveniente.

Saludos.