domingo, 30 de septiembre de 2007

Forms10g: Modificar apariencia

En el archivo formsweb.cfg se dispone del parámetro lookAndFeel para modificar la apariencia de la aplicación, los valores que puede tomar son:
  • generic: Apariencia típica de Windows
  • oracle: Apariencia por defecto definida por Oracle. Dentro de esta apariencia se puede usar el parámetro colorScheme para modificar el conjunto de colores usados. Los valores que puede tomar son:
    • teal
    • red
    • titanium
    • blue
    • khaki
    • olive
    • purple
    • blaf: Este en concreto no está soportado oficialmente por Oracle fuera de Oracle Applications.
Podemos modificar estos parámetros en el archivo formsweb.cfg o también a través de la url, por ejemplo: http://direccionequipo:8889/forms/frmservlet?config=prueba&lookandfeel=generic

domingo, 23 de septiembre de 2007

Forms10g: clientDPI

Se me ha dado el caso de una aplicación desarrollada en Forms10g sobre plataforma Windows, que al desplegarse en algún sistema Linux se veían las pantallas demasiado pequeñas.

Dependiendo de la aplicación, puede ser que parezca que es problema de las fuentes, en mi caso la aplicación al arrancar se maximizaba y ocupaba toda la pantalla y eso hacía que pareciese que el problema fuera con las fuentes.

El problema se encuentra en los puntos por pulgada que usa la máquina virtual de Java. La configuración de los puntos por pulgada se puede variar añadiendo el parámetro clientDPI en el archivo de configuración formsweb.cfg en la sección de nuestra aplicación, por ejemplo:

[prueba]
form=prueba.fmx
...
clientDPI=96

Para que el applet tenga en cuenta este parámetro tenemos que modificar los archivos webutiljpi.htm, webutiljini.htm, webutilbase.htm, basejpi.htm, basejini.htm y base.htm. En realidad solo sería necesario modificar los que terminan en jpi (Java plug-in) ya que en Linux no se puede instalar el Jinitiator por lo que nunca podríamos usar los que terminan en jini (Jinitiator), pero podría ser que en ordenadores Windows con Jinitiator quisiesemos alterar este valor, por lo que modificarlos todos no está más.

La modificación que hay que hacer es la siguiente (para el webutiljpi.htm):

Después de la línea: <param name="WebUtilMaxTransferSize" value="%WebUtilMaxTransferSize%">

Añadir:

<param name="clientDPI" value="%clientDPI%">

Después de la línea: WebUtilMaxTransferSize="%WebUtilMaxTransferSize%"

Añadir la línea:

clientDPI="%clientDPI%"

Ejemplo del formulario de prueba a 96 dpi:


Ejemplo del formulario de prueba a 50 dpi:



Para hacer pruebas para encontrar el valor que mejor se nos ajuste, no hace falta estar modificando el archivo de configuración formsweb.cfg, podemos alterar el valor añadiendo el parámetro clientDPI a la url, por ejemplo: http://equipo:8889/forms/frmservlet?config=pru&form=test&clientDPI=50

Para más detalles consultar la nota 1071248.6 en el metalink.

sábado, 22 de septiembre de 2007

Configurar varios entornos de desarrollo

Muchas veces se me ha dado el caso de tener que trabajar en varios proyectos, donde las librerías (plls) y librerías de objetos (olb) son distintas y se encuentran en varios directorios, la solución que solía hacer era modificar la variable FORMS60_PATH en el regedit, pero un día se me ocurrió una idea que consiste en lo siguiente:

Por cada entorno de ejecución me hice un script que inicializa las variables de entorno y luego arranca el Forms Builder, incluso ya arranca conectado con la base de datos que quiero.

Ejemplo: Nombre del script produccion.cmd

set FORMS60_PATH=L:\olb;L:\adaptaciones;L:\plls;L:\mmx;L:\fmxs
set UI_ICON=L:\iconos
set REPORTS60_PATH=L:\adaptaciones;L:\plls;L:\reps
set PATH=c:\oracle\dev6i\bin
set NLS_LANG=SPANISH_SPAIN.WE8ISO8859P15
set NLS_DATE_FORMAT=DD/MM/YYYY
set NLS_NUMERIC_CHARACTERS=,.
set NLS_SORT=BINARY
set REPORTS60_TMP=c:\temp
start ifbld60 userid=usuario/password@cadenaconexion

Ejecutando el script primero inicializa las variables y luego arranca el Forms Builder. Si tenemos otro proyecto y las librerías están en otros directorios hacemos otro script de forma similar.

En caso de Forms10g es muy similar solo hay que cambiar los nombres de las variables de entorno, por ejemplo no es FORMS60_PATH, sería FORMS_PATH y el ejecutable no es ifbld60, sería frmbld

jueves, 13 de septiembre de 2007

Forms 6: Enviar correo con adjunto a través de Outlook

Con este código nos permite añadir un mensaje en la bandeja de salida y luego enviarlo o mostrar el mensaje para ser enviado luego por el usuario.

DECLARE
v_outlookapp ole2.obj_type;
v_namespace ole2.obj_type;
v_mailitem ole2.obj_type;
v_oleparam ole2.list_type;
v_attachments ole2.obj_type;
BEGIN
v_outlookapp := ole2.create_obj('Outlook.Application');
v_oleparam := ole2.create_arglist;
ole2.add_arg(v_oleparam, 'MAPI');
v_namespace := ole2.invoke_obj(v_outlookapp, 'GetNameSpace', v_oleparam);
ole2.destroy_arglist(v_oleparam);
v_oleparam := ole2.create_arglist;
ole2.add_arg(v_oleparam, 0);
v_mailitem := ole2.invoke_obj(v_outlookapp, 'CreateItem', v_oleparam);
ole2.destroy_arglist(v_oleparam);
ole2.set_property(v_mailitem, 'To', 'xxxx@xxxmail.com');
ole2.set_property(v_mailitem, 'Subject', 'Asunto');
ole2.set_property(v_mailitem, 'Body', 'Texto del mensaje');

-- Añadimos el adjunto
v_attachments := ole2.get_obj_property(v_mailitem, 'Attachments');
v_oleparam := ole2.create_arglist;
ole2.add_arg(v_oleparam, 'C:\Temp\prueba.pdf');
ole2.invoke(v_attachments, 'add', v_oleparam);
ole2.destroy_arglist(v_oleparam);

-- Con esta línea invocamos el envío, si queremos
-- simplemente abrir el Outlook para que pueda revisar
-- el correo cambiamos 'Send' por 'Display'
ole2.invoke(v_mailitem, 'Send');

ole2.RELEASE_OBJ(v_mailitem);
ole2.RELEASE_OBJ(v_namespace);
ole2.RELEASE_OBJ(v_outlookapp);
END;

Sin adjunto sería parecido pero con menos código, ahí va el ejemplo:

DECLARE
v_outlookapp ole2.obj_type;
v_namespace ole2.obj_type;
v_mailitem ole2.obj_type;
v_oleparam ole2.list_type;
BEGIN
v_outlookapp := ole2.create_obj('Outlook.Application');
v_oleparam := ole2.create_arglist;
ole2.add_arg(v_oleparam, 'MAPI');
v_namespace := ole2.invoke_obj(v_outlookapp, 'GetNameSpace', v_oleparam);
ole2.destroy_arglist(v_oleparam);
v_oleparam := ole2.create_arglist;
ole2.add_arg(v_oleparam, 0);
v_mailitem := ole2.invoke_obj(v_outlookapp, 'CreateItem', v_oleparam);
ole2.destroy_arglist(v_oleparam);
ole2.set_property(v_mailitem, 'To', 'xxxx@xxxmail.com');
ole2.set_property(v_mailitem, 'Subject', 'Asunto');
ole2.set_property(v_mailitem, 'Body', 'Texto del mensaje sin adjunto');

-- Con esta línea invocamos el envío, si queremos
-- simplemente abrir el Outlook para que pueda revisar
-- el correo cambiamos 'Send' por 'Display'
ole2.invoke(v_mailitem, 'Send');

ole2.RELEASE_OBJ(v_mailitem);
ole2.RELEASE_OBJ(v_namespace);
ole2.RELEASE_OBJ(v_outlookapp);
END;

miércoles, 12 de septiembre de 2007

Tetris en Forms


Hace tiempo me encontré el juego del Tetris programado en Forms, en concreto en la versión 6. Me llamó la atención la forma en que captura las pulsaciones de las teclas, ya que Oracle Forms no tiene forma de manejar las pulsaciones de teclado de forma nativa (se podría hacer usando Java), por lo que hay que usar trucos.

En concreto el truco que han usado aqui es, para la tecla arriba y abajo capturan los eventos KEY-UP y KEY-DOWN respectivamente y para capturar las pulsaciones de las techas derecha e izquierda usan un campo de tipo radio-button oculto a la vista, es decir alto y ancho cero, entonces cuando se pulsa la techa derecha se lanza el evento WHEN-RADIO-CHANGED y a la izquierda lo mismo.

tetris.fmb en content-type.com
tetris.fmb en www.oraclehome.co.uk

Conclusión: No es matar moscas a cañonazos, es lo contrario, es como ir a la guerra usando alfileres como arma, pero es muy interesante lo que se puede llegar a hacer con un entorno de desarrollo 4gl que no está pensado precisamente para juegos.