Etiqueta

11 de enero de 2011

Ajuste de la resolución de pantalla

Descripción del problema:

A menudo nos encontramos con diferentes monitores y diferentes configuraciones de resolución, además algunos usuarios prefieren una resolución menor de pantalla a fin de aumentar el tamaño de los objetos representados (no sólo el texto), especialmente aquellos que tengan alguna dificultad de visión.

Para resolver esta cuestión las aplicaciones desarrolladas con Omnis Studio deberían ser capaces de permitir al usuario elegir la resolución que deseen. Afortunadamente Omnis Studo incorpora los elementos necesarios para realizar este proceso, tan sólo se debe tener en cuenta que cuando se asignen estas preferencias se debe cerrar y reabrir la biblioteca para que surtan efecto.

A continuación describo en detalle un procedimiento que podría incorporarse a las opciones de preferencias de nuestra aplicación Omnis Studio, el ejemplo muestra un objeto visual que permitirá al usuario hacerse una idea del tamaño que tendrán sus ventanas tras aumentar o disminuir la resolución:


La ventana de preferencias podría ser de un estilo similar a este, mostrando (por ejemplo) un cuadro he indicadores de grado (Slider Control) para que el usuario modifique la resolución ha obtener según lo desee, no obstante tendremos que prefijar las resoluciones máximas y mínimas posibles, en nuestro caso las resoluciones posibles estarán entre 1.680x1.050 y 1.360x850. Para la resolución máxima (1.680x1.050) el rectángulo guía tendrá un tamaño de 130x220 ($height=130, $width=220).

Usaremos dos variables numéricas definidas para la clase "ventana de preferencias", las llamaremos “ZoomHori” y “ZoomVert”.

A continuación añadiremos al procedimiento $construct las siguientes líneas de código:

; Recoge el valor actual de resolución en pantalla
Do $cwind.$objs.ZoomHorizontal.$val.$assign($clib.$prefs.$hscale)
Calculate ZoomHori as $clib.$prefs.$hscale
Do $cwind.$objs.ZoomVertical.$val.$assign($clib.$prefs.$vscale)
Calculate ZoomVert as $clib.$prefs.$vscale
Do $cwind.$objs.NaviElement.$val.$assign($clib.$userinfo)
Calculate $cwind.$objs.ZoomHorizontal.$::min as 1360
Calculate $cwind.$objs.ZoomVertical.$::min as 850
Do $cwind.$bobjs.1053.$height.$assign(int((1680-$clib.$prefs.$hscale)/'6,40')+130)
Do $cwind.$bobjs.1053.$width.$assign(int((1050-$clib.$prefs.$vscale)/'3,33')+220)

Esto fijará la escala (o resolución) a los valores actuales y ajustará el tamaño del cuadro (ID=1053), lo que permitirá al usuario hacerse una idea aproximada de como se verán las ventanas en su pantalla.

Ahora debemos fijar los procedimientos asociados a las barras "Slider Control"

Para ZoomHorizontal:

On evNewValue
Calculate ZoomHori as pNewVal
Do $cwind.$bobjs.1053.$height.$assign(int((1680-ZoomHori)/'6,40')+130)

Para ZoomVertical:

On evNewValue
Calculate ZoomVert as pNewVal
Do $cwind.$bobjs.1053.$width.$assign(int((1050-ZoomVert)/'3,33')+220)

Finalmente debemos dejar ajustada la resolución que el usuario ha seleccionado, esto lo haremos al abandonar la clase "ventana de preferencias", (procedimiento $destruct) tal y como sigue:

; Establece nuevos valores de resolución en pantalla
Do $clib.$prefs.$hscale.$assign(ZoomHori)
Do $clib.$prefs.$vscale.$assign(ZoomVert)

Suelo incorporar este procedimiento en todas las aplicaciones que realizo, los usuarios agradecen disponer de un ajuste personalizado para cada aplicación.

Si encontráis útil la idea o tenéis otra mejor, os animo a que dejéis vuestros comentarios en el "blog", por mi parte seguiré incorporando alguna otra idea de interés general.

Un cordial saludo a todos los desarrolladores de Omnis Studio y en especial a los participantes del grupo programomnis.

10 de enero de 2011

ORACLE: Convertir vocales acentuadas

Problemática

Cuando realizamos consultas sql a la base de datos, (para, por ejemplo buscar por nombre de persona) podemos usar la función UPPER a fin de que la comparación no distinga entre mayúsculas y minúsculas, pero no ocurre lo mismo en el caso de las vocales acentuadas, a fin de solventar este problema podríamos implementar la siguiente función:

CREATE OR REPLACE function acentos(wcadena in varchar2) RETURN varchar2 is cadena varchar2(200);

BEGIN

cadena := replace(wcadena,'Á','A');
cadena := replace(cadena,'É','E');
cadena := replace(cadena,'Í','I');
cadena := replace(cadena,'Ó','O');
cadena := replace(cadena,'Ú','U');

return(cadena);

END;

6 de enero de 2011

Limpiar una variable List o Row eliminado los valores NULL

Limpiar una variable de tipo "list" o "Row", realemente es una tarea sencilla con Omnis Studio bastará con el siguiente comando:

iSqlRow.$clear()

El único problema que esto plantea es que deja las columnas con valores NULL, con todos los problemas que esto conlleva, como (por ejemplo) al realizar operaciones matemáticas .

La solución es la siguiente:

iSqlRow.$cols.$sendall($ref.$clear())

Esto causará que cada columna quede correctamente iniciada llenando con valores "0" las variables numéricas.

En el caso de variables de tipo "list" utilizadas en un objeto de tipo "complex grid", permitirá que el usuario coloque el cursor sobre ella para entrar datos, sin necesidad de añadir una primera línea vacía a la lista.

Existe algo publicado sobre esto en la nota técnica de Omnis: TNNO0016 (http://www.omnis.net/support/index.html?detail=technotes) pero esta solución me parece más simple y elegante.

Saludos a todos los lectores de este "blog".