01 octubre 2008

¿Cómo permitir al usuario eliminar filas en un "Data Grid"/"Smart List"?

Descripción del problema:

Pongamos como ejemplo la siguiente tabla de datos, representada en un objeto tipo "kdatagrid":

Do cTablaEdit.$definefromsqlclass(iTituVen)
Do cTablaEdit.$sessionobject.$assign(iSessionObj) Returns #F
Do cTablaEdit.$select() Returns lStatus
Do cTablaEdit.$fetch(kFetchAll) Returns lStatus
Do cTablaEdit.$line.$assign(1)
Do cTablaEdit.$smartlist.$assign(kTrue)
If cTablaEdit.$linecount=0
Do cTablaEdit.$add()
End If

El problema parte de que mientras el usuario se mueve entre las celdas de la tabla, el atributo "cTablaEdit.$line" no cambia. En el ejemplo deseamos que el usuario pueda seleccionar la fila a borrar pulsando la tecla "F5", el asunto entonces es: ¿Cómo saber que número de fila (cTablaEdit.$line) debemos eliminar?

Solución:

On evCellChanged
Do cTablaEdit.$line.$assign(pVertCell)
On evKey
If pSystemKey=5
Yes/No message Eliminar registros {¿Desea realmente eliminar la línea de la tabla?}
If flag true
Do cTablaEdit.$remove(cTablaEdit.$line)
Do $root.$redraw()
End If
Process event and continue (Discard event)
End If

El evento evCellChanged, mantendrá seleccionada la línea o fila a borrar, de tal modo que el prodedimiento Do cTablaEdit.$dowork() actualizará finalmente la tabla en el servidor eliminando las filas marcadas para borrar.

No he encontrado un método mejor para solucionar este problema, no obstante (si usted querido lector lo tiene a bien), tal vez pueda sugerir algún otro procedimiento, de ser así lo ánimo a dejar su comentario en este blog.

Gracias por su atención.

17 septiembre 2008

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.