Etiqueta

Mostrando entradas con la etiqueta #AULAOMNIS. Mostrar todas las entradas
Mostrando entradas con la etiqueta #AULAOMNIS. Mostrar todas las entradas

18 septiembre 2017

Componentes JSON&JS (Parte 4 de 12)

Uso de componentes JSON&JS ya preparados


Para hacer uso de componentes JSON&JS ya preparados, (es decir los obtenidos de terceros) deberá comenzar por agregar los archivos con extensión ".js" a la carpeta "html/scripts", así como cualesquiera otros archivos CSS y de imagen necesarios para el correcto funcionamiento del control sobre las carpetas correspondientes. También necesitaremos disponer de las propiedades, métodos y eventos del control, contenidas en el fichero JSON de definición y creado mediante el "JSON Control Editor".

Una nota técnica en el sitio web de Omnis describe con detalle el procedimiento a usar, siguiendo como modelo un componente JSON&JS disponible para descargar e instalar libremente:

También necesitará consultar la guía "JavaScript Control Reference" del "JS SDK" y que podrá encontrar aquí:


11 septiembre 2017

Gestión de licencias del Servidor de Aplicaciones Omnis versión 8.1 y Web Service

Desde la versión 8.1, las conexiones hacia el Servidor de Aplicaciones Omnis (mediante jsClient) realizadas desde un mismo navegador del cliente, ahora cuentan como un solo uso de licencia para el servidor. Anteriormente se contaba cada conexión como usuarios independientes, lo que incluía el consumo adicional de licencias de servidor.

La tecnología "jsClient" ahora genera automáticamente un UUID de identificación, el cual guardará como una cookie (denominada OMNISCLIENTID) y que se enviará como parámetro con cada conexión. La cookie caducará tras un año, generando entonces un nuevo UUID. Las cookies deben estar habilitadas tanto en el servidor web, como en cualquier cliente que desee conectarse, para que esto funcione.

En cuanto al uso de la extensión "Web Services", mencionar que ya no necesitamos un número de serie para hacer uso de servicios web basados en REST, no obstante recuerde que si hacemos uso del objeto "HTTPClientWorker" para generar un cliente de Servicios Web (WSDL), necesitaremos instalar y configurar Java (no será necesario con los nuevos objetos de OW3 CURL).

Componentes JSON&JS (Parte 3 de 12)

Propiedades


Para establecer las propiedades del control, disponemos de los apartados siguientes:

  • Flags
Permiten indicar que eventos estarán o no habilitados, si el control tendrá fondo transparente, si se permite la capacidad de arrastrar-soltar y otros por el estilo.

  • Standard properties
Tabla de propiedades estándar soportadas por el control además de las básicas, tales como su nombre.

  • Properties
Permite la definición de un objeto con las propiedades específicas del control; La columna nombre, (name) determina cada uno de los miembros del "object-properties" es el nombre de la propiedad, la cual deberá escribirse sin el símbolo "$". El resto de las columnas determinarán cada aspecto de la propiedad.

  • Multivalue properties
Permite configurar posibles valores (múltiples valores) para las propiedades que así lo requieran.

  • Constants
Permite la definición de un objeto con las constantes que tendremos disponibles para su uso con el control. (Name, Value y Desc) 

  • Events
Permite definir que eventos generará el control (además de los especificados en el grupo "Flags") e incluye eventos estándar como "evClick"; Note que sus nombres incluyen el prefijo "ev" 

  •  Methods
Permite indicar los nombres de los métodos de tipo "client-executed" (ejecución del lado del cliente) proporcionados por el control; El nombre del método deberá incluir el prefijo "$".

  •  Html
Permite indicar cómo deberá generarse el HTML que enviará el control al cliente.

La opción "Save" creará el archivo JSON del control sobre la carpeta "html/controls". La opción "Build" creará el archivo JavaScript correspondiente al control, sobre la carpeta "html/scripts" (localizable sobre el directorio raíz de instalación Omnis). También se le preguntará sobre la idónea inclusión de una referencia al archivo JavaScript del control, en el archivo "jsctempl.htm", lo cual garantizará que el control esté disponible para probarlo con cualquier formulario remoto que pueda contenerlo.

Tras la creación de cualquier control JSON, deberá reiniciarse Omnis, a fin de que esté disponible para su uso. Después del reinicio, el control aparecerá sobre la pestaña "JSON Components" del "Component Store" listo para ser usado. Para su entrega con la aplicación final, deberá colocar los archivos JSON y JavaScript sobre las carpetas correspondientes del servidor Web y verificar que se esté haciendo referencia al mismo, desde la página html, encargada de cargar el formulario remoto.







05 septiembre 2017

Indicador de carga personalizado (comando "showloadingoverlay")

Desde la versión Omnis Studio 8.0.2 en adelante es posible agregar un indicador de carga (imagen animada) sobre un determinado componente o bien cubriendo el entero formulario remoto, ésto es posible gracias a un nuevo "clientcommand", denominado "showloadingoverlay".

Esto es realmente útil, pues nos permite mostrar al usuario un indicador de que se está la espera de la conclusión de un proceso largo, hasta que la información deseada aparezca actualizada para ese componente o formulario, al mismo tiempo que se evita posibles acciones del usuario sobre los elementos mostrados en el mismo. Resultará especialmente útil si están realizando operaciones asíncronas, como cargar una lista con valores desde un acceso SQL. Cómo ya sabemos, los llamados comandos-cliente, tales como "showloadingoverlay", deben ser ejecutados mediante el método "$clientcommand", del siguiente modo:

Do $cinst.$clientcommand("showloadingoverlay",rowvariable)

Donde "rowvariable" es "row(show,controlName,message,cssClass)".

  • show
Valor booleano "kTrue" indica que deberá mostrarse, "kFalse" para ocultarlo.

  • controlName
Es el la propiedad "$nombre" del componente en el formulario, sobre el que se deberá mostrar o eliminar el indicador. Dejar éste parámetro vacío, causará que el indicador se muestre sobre el entero formulario. 

  • message
(Opcional) Texto para mostrar junto con el indicador.

  • cssClass
(Opcional) Clase CSS para aplicar al indicador. Nos permite personalizar su apariencia.
De forma predeterminada, el indicador oscurecerá lo que haya detrás, mostrando una animación, junto con el texto (opcional) incluido. Si desea personalizar su apariencia, puede hacerlo mediante el uso de CSS. Cree una clase CSS sobre el archivo "user.css" y pase su nombre de clase como parámetro cssClass.

El indicador de carga estará contenido en un "div" de tipo "toplevel", a la que se le asignará el nombre de su clase CSS. Este div tiene como nombre de clase "indicator", la clase CSS tiene el nombre "container", además de un elemento "p" con "message" como nombre de clase . Son los nombres que deberemos usar al aplicar los estilos CSS.

La clase "omnisLoadingOverlay" contenida en el fichero "omnis.css" puede servirnos como base.


04 septiembre 2017

Componentes JSON&JS (Parte 2 de 12)

JSON Control Editor


Un control o componente JSON&JS, es definido mediante un archivo JSON, denominado "JSON Control Definition" (en adelante JCD), el cual podrá ser creado o editado mediante cualquier editor de textos JSON o bien mediante una nueva herramienta disponible desde el menú "Tools>>Add Ons", denominada "JSON Control Editor".


El "JSON Control Editor" muestra una plantilla con todas las propiedades necesarias para crear un JCD básico. El editor nos permite fijar las propiedades del control bajo cada pestaña, para finalizar haciendo clic sobre la opción "Save", la opción "Build" nos permitirá llevar a cabo la creación del control así definido, la opción "Reset" permite eliminar los cambios realizados sobre la plantilla predeterminada, haciendo posible comenzar de nuevo. Antes de configurar las propiedades y los métodos de nuestro control, necesitaremos conocer sus definiciones, cosa que iremos desgranando en sucesivas entregas de éste blog.

Control Name


El nombre del control debe ser único, por lo que la primera cosa será cambiar su nombre (o simplemente aceptar el nombre predeterminado, si es que sólo estamos probando el editor). El nombre de control predeterminado tiene el prefijo "net.omnis" para mostrar la convención de nomenclatura preferida, la cual deberemos cambiar por el correspondiente a nuestro propio nombre de empresa, por ejemplo: "com.miempresa.micontrol1", o cualquier otra convención de nomenclatura apropiada. Note que utilizamos puntos en el nombre del control, pero Omnis finalmente los sustituirá por caracteres de subrayado, ya que los puntos causan problemas con la sintaxis de notación usada en la programación con Omnis.



31 agosto 2017

Notificaciones "Push" con Omnis Studio 8.1

La versión 8.1 de Omnis Studio, permite el uso de notificaciones "push" en el desarrollo de aplicaciones para Android, iOS y Windows 10 (necesitaremos hacer uso de los "wrappers" versión 2.0 o posteriores).

Para quienes no estén familiarizados con el uso de notificaciones "push", mencionar que ésto significa que ahora podremos enviar mensajes a cualquier cliente que tenga instalada nuestra aplicación para dispositivos móviles, aunque (en ese momento) no la esté ejecutando. En este sentido, la capacidad de enviar notificaciones "push" otorga a nuestras aplicaciones una funcionalidad muy potente e interactiva, ya que permite animar proactivamente a los usuarios finales a abrir y usar la aplicación.

Una notificación o mensaje enviado de éste modo al cliente, podría (por ejemplo) incluir una noticia importante, un mensaje acerca de una nueva entrada en la base de datos o cualquier otra cosa que deseemos. Incluso es posible la inclusión de información útil, que se adjuntará a la notificación y que se pasará al "remote-form" de la aplicación, permitiendo al usuario interactuar con la aplicación a partir de la notificación recibida.

El soporte para éste tipo de notificaciones es proporcionado a través del servicio de mensajería en la nube o servicio de notificación "push", para cada plataforma respectiva y deberá haber sido habilitada para nuestro proyecto de aplicación móvil, mediante el SDK y el "JavaScript Wrapper" correspondiente. Para configurar el uso de notificaciones para Android e iOS, necesitaremos activar el servicio "Firebase" de Google y en caso de Windows 10 necesitaremos configurar los servicios de notificación "push" del "Store Dashboard".


Herramienta de administración de notificaciones push


Para administrar las notificaciones, podemos optar por crear grupos de dispositivos, a fin de enviar notificaciones a determinados grupos o bien a dispositivos concretos. Toda esta funcionalidad puede ser manejada desde el propio código Omnis (mediante el uso de nuevas propiedades y métodos), o bien mediante una nueva herramienta de administración, denominada: "Push Notifications", localizable bajo el menú de opciones "Tools≥≥Add Ons" de Omnis. Tenga en cuenta que la herramienta es en si misma una librería Omnis (un fichero .lbs) ubicado en la carpeta "startup", por lo que deberá estar presente para que la funcionalidad de notificaciones "push" pueda ser usada con nuestras aplicaciones para móviles, además de nuestro código Omnis y también es necesaria para configurar el servidor de aplicaciones de Omnis.

Métodos y nuevo "Client Command"


Un nuevo "clientcommand" nos permite habilitar y deshabilitar el uso de notificaciones "push" en nuestras aplicaciones móviles:

$clientcommand(“enablepushnotifications”, row(bEnable))

bEndable: Es booleano - Si es "true" habilita las notificaciones push, "false" las deshabilita.
returns: (Booleano) - Indicará si el comando ha terminado con éxito. (método client-execute)

Además de éste comando, disponemos de un nuevo método denominado "$pushnotifycommand" que podremos utilizar para configurar las "Notificaciones Push".

Para obtener más información sobre la configuración de notificaciones "push" en nuestras aplicaciones para móviles, así como el uso de comandos y métodos, consulte el nuevo documento "Push Notifications" que podrá encontrar bajo el siguiente enlace:


Aplicaciones Omnis Studio 8.1 firmadas (signed code) para MacOS

La nueva versión de Omnis Studio 64Bits para MacOS, requiere que todos los archivos actualizables, sean instalados de modo separado a la propia aplicación y bajo un directorio perteneciente al usuario principal, MacOS ya dispone de un directorio con éste propósito y es el usado por Omnis durante su instalación, el directorio o carpeta se denomina "Application Support", localizable en:

~/Library/Application Support/Omnis/

Para ello, (cada vez que Omnis es ejecutado) comprueba la existencia de una carpeta llamada "firstruninstall" localizable bajo el directorio raíz de instalación, del paquete Omnis. Los elementos en ella contenidos, son copiados de forma predeterminada en una sub-carpeta de "Application Support" que tendrá el mismo nombre que el paquete Omnis, por ejemplo:

~/Library/Application Support/Omnis/Omnis Studio 8.1 x64

La copia no llevará a cabo si la carpeta de destino ya existe, evitando así que se sobrescriban los archivos.

De éste modo se nos proporciona un eficaz método para colocar todas nuestras carpetas de datos y elementos propios de nuestra aplicación terminada, sobre la carpeta de instalación "firstruninstall", (tales como "icons", "studio" o "startup"). Una vez trasladados a "Application Support", posteriormente sólo necesitará actualizar los archivos de esa ubicación, sin necesitar realizar cambio alguno sobre la carpeta original de instalación, manteniendo así válida la firma de su aplicación para MacOS.

Tenga en cuenta que con la versión firmada de Omnis Studio, se deberán agregar o actualizar componentes externos o JavaScript sobre la carpeta de datos del usuario, permitiendo así que la parte de código firmada de Omnis permanezca inalterada,. Por ejemplo, un componente estándar podría ubicarse del siguiente modo:

~/Library/Application Support/Omnis/\Omnis\ Studio\ 8.1\ x64/xcomp

Y si se trata de un componente JavaScript podría ser así:

~/Library/Application Support/ Omnis/\Omnis\ Studio\ 8.1\ x64/jscomp/

Si la carpeta requerida no existe, deberá ser ser creada manualmente por el usuario.

La carpeta de datos de usuario siempre es cargada en primer lugar, por lo que si un componente con el mismo nombre ya existe bajo el directorio principal de instalación Omnis, la version del usuario será la elegida.

28 agosto 2017

Componentes JSON&JS (Parte 1 de 12)

Otra interesante característica que incorpora la versión 8.1 de Omnis, es la de poder definir nuestros propios controles para formularios remotos (remote-form) mediante JSON y JavaScript, dejándolos listos para ser usados en cualquier momento con nuestras aplicaciones web y móviles. Seguramente, pasando el tiempo veremos muchos componentes de éste tipo ya construidos por terceros, abriendo infinitas posibilidades a la incorporación de nuevos controles, listos para usar en nuestras aplicaciones.

Este nuevo método proporciona una alternativa real al uso de C++ y el SDK JavaScript. (método actualmente en uso para la creación de componentes JavaScript) Sin duda una buena noticia, pues tan sólo necesitaremos poseer conocimientos de JSON y JavaScript, para crear y usar nuestros propios controles JavaScript en aplicaciones web o móvil o bien como contribución a la nuestra y cada vez más amplia comunidad de desarrolladores Omnis.

Tras la creación de un "JSON Component", bastará con reiniciar Omnis para que aparezca sobre el "Component Store", bajo un nuevo grupo denominado "JSON". Su uso será muy similar al de cualquier otro componente, lo arrastraremos sobre nuestro formulario remoto y estableceremos sus propiedades mediante el "Property Manager".

La representación (en modo de diseño) de los controles JSON en un formulario remoto es muy básica y no refleja el control real, su presentación real sólo la obtendremos en tiempo de ejecución, aunque para aquellos controles que no requieran de una interfaz visual ésto no será un problema, si que está previsto que en futuras versiones de Omnis, pueda mejorarse ésta cuestión.

En ésta serie de 12 artículos breves, intentaré explicar como hacer uso de ésta nueva característica.

Sigan atentos a éste blog.

25 abril 2017

Novedades Omnis Studio 8.1

Son muchas e interesantes las novedades que nos acercará la inminente aparición de la versión 8.1 de Omnis Studio

  • Soporte para repositorios de software distintos al VCS-OMNIS (Exportación e importación de librerías en formato JSON)
  • jsForms con soporte de diseño "responsive"
  • Nuevos controles jsClient
  • Correcciones y añadidos menores, en Web Services, el  Editor de métodos y el asistente de codificación

Pero de todas ellas quizás la más destacable sea el jsForm "responsive". El diseño "responsive" es una técnica utilizada para componer formularios que se ajustan de modo automático a los  diferentes tamaños de pantalla del dispositivo en uso, ya sea que se trate de teléfonos móviles, tablets u otras pantallas. La razón para su uso es la de poder disponer de un único formulario desde el cual y mediante unos pocos métodos de código, adaptar automáticamente los objetos al dispositivo en uso o bien tras un cambio en el tamaño de la ventana del navegador por acción del usuario. Cuando hablamos de páginas web estándar, el diseño "responsive" se implementa mediante el uso de técnicas CSS y puntos de interrupción, Omnis Studio 8.1 adopta un enfoque similar, permitiendo especificar los puntos de interrupción que se desee durante el diseño del jsForm. (formulario remoto JavaScript) Cada punto de interrupción se corresponderá con su correspondiente re-diseño o ajuste de objetos en el formulario. 


Los jsForm's confeccionados antes de la versión 8.1, podrán seguir haciendo uso de la ya conocida propiedad "$screensize" que (como ustedes saben) nos permite ajustar el diseño a los diferentes dispositivos, mientras que los jsForm's creados a partir de ésta versión podrán hacer uso del modo "responsive". Una nueva herramienta de migración, (disponible desde el menú "Tools>>Add-Ons") nos permitirá migrar los jsForm's creados con versiones anteriores de Omnis Studio, a los nuevos tipos "responsive".

Una nueva propiedad denominada "$layouttype", (sólo disponible para los nuevos jsForm's) permite especificar el modo de diseño soportado, podrá ser: kLayoutTypeResponsive, kLayoutTypeScreen (para versiones anteriores de Omnis Studio) o kLayoutTypeSingle (diseño no-resposive)

Los nuevos jsForm's son creados con una serie de puntos de interrupción preestablecidos: 320, 768 y 1024 que corresponderían de modo generalizado a teléfonos, tabletas y computadoras de escritorio. Pero podremos cambiar estos puntos de interrupción para adaptarlos a nuestras propias necesidades o tamaños que deseemos soportar en nuestras aplicaciones.

Aquí es donde yo quería llegar con éste artículo, pues llegados a éste punto, seguramente surja la pregunta: ¿Qué puntos de interrupción debo soportar en mi aplicación?

Naturalmente todo dependerá del uso o ámbito de actuación que queramos dar a nuestra aplicación, pero contestando de modo generalista, deberíamos crear al menos un punto de interrupción para el dispositivo más pequeño, de entre el conjunto de dispositivos que deseemos soportar, ya sea que se trate de teléfonos, tablets o escritorios. Por lo tanto, el valor del primer punto de interrupción sería el ancho físico del teléfono más pequeño, no deberemos confundir sus dimensiones físicas con la resolución de pantalla soportada.

Por ejemplo, las dimensiones físicas de la pantalla del iPhone 6 y 7 son 375x667, y el Samsung Galaxy S5 y S6 son 360x640, por lo que podría establecer el primer punto de ruptura de diseño a 360, o tal vez 350 para añadir un margen de seguridad y así dar soporte a ambos teléfonos.

Del mismo modo, para fijar el punto de interrupción para tabletas, deberíamos tener en cuenta el ancho mínimo de entre la gama de tabletas que deseemos  soportar. Como ya hemos mencionado, los puntos de interrupción predeterminados son (320, 768 y 1024) están pensados para dar soporte a la mayoría de dispositivos, tanto en su orientación vertical como horizontal, pero podemos cambiar éstos ajustes según nuestras propias necesidades.

20 abril 2017

Creación y uso de iconos con Omnis Studio (Icon Editor)

Creación de nuevos iconos

  1. Abra “Omnis Studio Developer”.
  2. Abra una librería.
  3. Haga doble clic sobre la librería desde el “Studio Browser” (F2).
  4. Haga doble clic sobre la carpeta “System CLasses”.
  5. Haga doble clic (o “checkout” si trabaja con VCS) sobre la clase #ICONS. Esto causará la apertura de la ventana “Icon Editor”. Si se trata de una nueva librería, la clase #ICONS estará vacía.
  6. Haga clic sobre “New Icon Page..” para crear una nueva página de iconos.
  7. Asigne un nombre para la nueva página y seleccione el tamaño de los iconos que desea crear en ella.
  8. Si desea crear iconos transparentes, seleccione “Solid & Alpha radio button”. Nota: Si selecciona “Solid and Alpha” se creará un icono para cada versión. El primer icono será la versión “Solid”, el segundo icono será la versión “Alpha”. Se puede pasar de una versión a otra haciendo clic sobre el icono “A” (mayúscula/minúscula) situado la derecha del “Icons Editor”. No obstante, siempre podrá añadir la versión “Alpha” de sus iconos mediante hacer clic sobre el botón “Page Options” y después sobre “Alpha copy of 24 bit”.
  9. Haga clic en el botón “Create”.
  10. Copie una imagen al portapapeles (Ctrl + c). La imagen podrá proceder de herramientas como Photoshop, Illustrator, etc.
  11. Haga clic sobre cualquiera de los 20 espacios vacíos de la parte superior derecha.
  12. Haga clic sobre la imagen 48x48 situada en la parte inferior izquierda.
  13. Pegue la imagen desde el portapapeles (Ctrl + v). Esto asignará un tamaño de 48x48 píxeles.
  14. Repita este paso para los tamaños 32x32 y 16x16 (si es necesario).
  15. Si ha creado una versión “Alpha” de los iconos, haga clic sobre la opción situada a la izquierda para cambiar a versión “Alpha” y repita la acción de copiar y pegar para los diferentes tamaños de iconos.
  16. Haga clic sobre el botón “Set Icon ID” y a continuación introduzca un identificador único.
  17. Para editar un icono ya existente, selecciónelo, seleccione después el tamaño y haga clic sobre el botón “Edit Icon”.
Consejo: Si necesita crear iconos grandes y pequeños, comience por el más grande. Una vez satisfecho con su aspecto, cree las versiones más pequeñas mediante la acción de copiar y pegar dese éste mismo icono.

 

Creación de iconos transparentes


Para crear un icono transparente a partir de su versión “Solid”:
  1. Seleccione el icono desde el “Icon Editor”.
  2. Compruebe que el botón A (Solid/Alpha) esté en modo “Solid”.
  3. Haga clic sobre el botón “Page Options”.
  4. Compruebe que esté seleccionada la opción “Substitute Transparent Color”.
  5. Haga clic sobre el botón “Update Page Settings”, para que los cambios surtan efecto.
  6. Haga clic sobre el botón “Edit Icon”.
  7. Ahora podremos ver sobre la paleta de colores, un cuadro de color verde que contiene la letra "T". Esto corresponde al color transparente. Haga clic sobre el para seleccionarlo.
  8. Seleccione la función “paint” (por ejemplo).
  9. Haga clic sobre las áreas que desee hacer transparentes.
  10. Haga clic sobre el botón “Update” cuando haya terminado.
Para crear un icono opaco o totalmente transparente, desde su versión “Alpha”:
  1. Seleccione el icono desde el “Icon Editor”.
  2. Compruebe que el botón A (Solid/Alpha) esté en modo “Alpha”.
  3. Use la herramienta “eyedropper” para seleccionar el color que desea hacer transparente u opaco.
  4. Use la barra “Alpha slider” situada al lado derecho, para modificar el grado de transparencia. Cuanto más hacia la izquierda más transparente.
  5. Seleccione la función “paint” (por ejemplo).
  6. Haga clic sobre las áreas que desee hacer transparentes u opacas.
  7. Haga clic sobre el botón “Update” cuando haya terminado. Nota: Los cambios serán visibles sólo después de cerrar la ventana del “Icon Editor”.

Uso de iconos con Omnis Studio


Existen diversos componentes capaces de mostrar iconos. En el ejemplo siguiente usaremos el denominado “OmnisIcn Control” (en nuestro ejemplo denominado “icon1”). Para asignar un icono simplemente indicamos su identificados único $::iconid (en nuestro ejemplo 1021) y el tamaño deseado (en nuestro ejemplo 32x32 píxeles).
Do $cinst.$objs.icon1.$::iconid.$assign(k32x32+1021)

 

Preguntas frecuentes


¿Donde se almacenan los iconos?

Omnis Studio, guarda los iconos en dos archivos “.df1”. El “usperic.df1” y el “omnispic.df1” situados en la carpeta “icons” situada a su vez en el directorio raíz de la instalación Omnis.

Precaución: Nunca edite los iconos de archivo “omnispic.df1”, ya que los cambios se sobrescribirán con cada actualización de Omnis Studio.

¿Dónde está la clase Omnis creada para contener iconos?

La clase #ICONS se guarda sobre carpeta “System Classes” de cada librería.  Cada una de ellas tiene una propiedad denominada “$iconlib”, que le permite hacer uso de clase #ICONS que usted prefiera. De este modo podrá disponer de un repositorio único para todas sus librerías, evitando la necesidad de copiar (o actualizar) la clase #ICONS una y otra vez. También podrá hacer uso de VCS para crear clases comunes.

¿Cuáles son las propiedades de un icono?

Los iconos poseen un identificador único “icon number”. Además, pueden tener hasta tres diferentes tamaños: 16x16, 32x32 y 48x48.

Ejemplo: Do myIconRef.$iconid.$assign(k32x32+102)

Una práctica habitual es usar una única librería a modo de repositorio que contenga todos los iconos a usar en los diferentes proyectos.

19 diciembre 2016

Gráficas combinadas con Graph2

Una particularidad del componente Graph2, es la de poder trabajar con capas, lo cual nos permite (por ejemplo) combinar dos o más tipos de gráficas en una misma muestra de datos, tal y como se puede ver a continuación:

 

Sin embargo, la incorporación de sucesivas capas en una misma gráfica, (según se puede desprender tras una rápida lectura del manual para el componente Graph2) parece supeditado al uso del evento evPreLayout, por lo que (al menos en mi caso) se me escapaba el modo de componer éste tipo de gráficas cuando queremos usarlas en informes impresos y no para su representación en pantalla.

Hasta que una lectura más detenida del manual antes citado y en su página 39, me hizo tropezar con el párrafo que cito textualmente a continuación: "When using an object variable based on the Graph2 component you can use the $prelayout() method in the object to add layers"

De esto se desprende que cuando hacemos uso del componente Graph2 en su modo "no-visual", es decir asignado a una variable de tipo objeto, se lleva a cabo la invocación de un posible método $prelayout, desde donde poder añadir capas y cualesquiera otras alteraciones que deseemos sobre la gráfica en composición, como por ejemplo, cambiar el grosor predefinido para la líneas que componen la segunda y tercera capa.

Adjunto una librería que ilustra con detalle lo explicado en éste artículo. No he encontrado mucha información sobre esto en los foros de programación con Omnis Studio, por lo que creo que compartir ésta experiencia con vosotros puede resultar útil. Espero vuestros comentarios al respecto, saludos cordiales.



17 noviembre 2016

Omnis Studio 8 y la localización con jsClient

En ésta entrada nos ocuparemos de mencionar un cambio que se ha producido desde la versión 6.1 de Omnis y la localización a otros idiomas de los mensajes que de forma nativa puede recibir el usuario en su navegador, cuando desarrollamos aplicaciones con jsClient.

En versiones anteriores de Omnis Studio, hemos estado haciendo uso del fichero "Studio.stb", con éste propósito, pero desde la versión 6.1 en adelante ha dejado de ser operativo, en nuestros desarrollos para la Web, decir que para otros entornos todo sigue siendo igual.

Es decir, "Localization" y "StringTables" siguen funcionando como antes, pero para los mensajes que se envían desde de núcleo del cliente JavaScript, se necesita hacer otra cosa, decir que aparece parcialmente documentado en el manual "Omnis_WebDev.pdf", bajo el apartado "Localization for the JavaScript Client" en la página 187, pero desafortunadamente, resulta difícil de entender y la información es incompleta (Omnis Software a prometido corregir esto pronto).

En mi caso tropecé con ésta "falta de información" al tratar de localizar al castellano el mensaje que Omnis muestra sobre el navegador del usuario, cuando el tiempo de conexión a expirado, el mensaje en ingles dice: "You have been disconnected. Refresh or restart application to reconnect"

Centrándonos en la localización para éste texto, mostraremos las dos opciones de que disponemos para resolverlo:

1) Agregar las siguientes líneas al archivo HTM inicial (marcamos en rojo las líneas que ya existen en el fichero:

<!-- The following placeholder is replaced with either a script tag for the remote task string table or nothing when there is no remote task string table -->

jOmnisStrings.en = {"disconnected":"You have been disconnected. Refresh or restart application to reconnect" };
jOmnisStrings.es = {"disconnected":"Ha sido desconectado. Refresque el navegador o vuelva a cargar la aplicación para conectarse de nuevo" };

<title></title>
</head>
Sin embargo, esto puede resultar algo incómodo si son muchas los textos y el número de idiomas a traducir (Existen más de 30 textos de error), por lo que se recomienda hacer lo siguiente:

2) En la carpeta o directorio HTML del raiz de instalación Omnis, crear una nueva carpeta a la que denominaremos "strings" y agregar a ella un archivo denominado "Error_Strings.js" con el siguiente contenido:

jOmnisStrings.en = {"disconnected":"You have been disconnected. Refresh or restart application to reconnect"};
jOmnisStrings.es = {"disconnected":"Ha sido desconectado. Refresque el navegador o vuelva a cargar la aplicación para conectarse de nuevo.(es_es)"};

Ahora necesitaremos modificar el archivo HTML indicado en el punto 1 (o el jsctemp.htm) para que lea como sigue:

<!-- The following placeholder is replaced with either a script tag for the remote task string table or nothing when there is no remote task string table -->
<script type="text/javascript" src="strings/Error_Strings.js"></script>

<title></title>
</head>
Obviamente, tanto la nueva carpeta como el archivo htm modificado deberán ser llevados al Servidor Web.

13 julio 2016

Como convertir caracteres Apple MacRoman a Unicode

Aunque "raras", existen las ocasiones en que vamos a necesitar obtener el correspondiente carácter en formato unicode, partiendo de su codificación no-unicode. En mi caso la razón es que dispongo de una fuente de caracteres Mac OS X para representación de códigos de barras, en formato no-unicode y necesito usarla desde su correspondencia unicode.

Buscando en internet, encontré una tabla con las diferencias que se pueden encontrar entre sus códigos ascii y que extracto a continuación...

...como se puede observar existen diferencias entre la codificación Mac y Unicode, por ejemplo alcaracter ê le corresponde el código 144 (no-unicode) y el 234 en formato unicode.

La manera de obtener dicho carácter en su formato unicode, partiendo de su ascii 144, sería la siguiente...
Do byteset(lBin,0,144)
Do uniconv(kUniTypeNativeCharacters,lBin,kUniTypeCharacter,lChar,kFalse,lErrorText)
...donde lBin es una variable local de tipo binario, mientras que lChar y lErrorText son de tipo carácter. La ejecución de éste código de notación, almacenará en la variable lChar el caracter ê convertido a unicode.

30 marzo 2016

25 febrero 2016

Nuevas opciones del Device Control en Omnis Studio

La propiedad $action del "Device Control" es utilizada para acceder a las características hardware o servicios en un teléfono móvil, tales como hacer una llamada, pero (como ya sabemos) dicha propiedad sólo estaba disponible cuando la aplicación es ejecutada en modo autónomo o "sin-conexión".

Sin embargo la última versión de Omnis Studio, nos permite utilizar el correo electrónico, las llamadas telefónicas y los mensajes SMS (Email, Call y SMS) a modo de una aplicación que fuese ejecutada sobre un navegador y no bajo el "wrapper" o aplicación instalada, es decir que será el navegador instalado por defecto en el dispositivo quien ejecute la acción correspondiente, en lugar de nuestra aplicación. Dichas acciones se corresponden con las siguientes constantes de la propiedad $action: kJSDeviceActionSendEmail, kJSDeviceActionMakeCall, y kJSDeviceActionSendSms. Naturalmente el resto de acciones ya conocidas deberán seguir siendo ejecutadas desde dentro del "wrapper".

Cuando es el navegador quien ejecuta la acción de enviar un SMS, se enviará un único mensaje y para el número especificado bajo la propiedad $communicationaddress del "Device Control", el texto del mensaje deberá figurar bajo la propiedad $communicationdata. Consulte el manual "Creating Web & Mobile Apps" para obtener más información sobre cómo utilizar "Device Control" en la construcción de aplicaciones para dispositivos móviles.

Por cierto, me estoy planteando la posibilidad de traducir al castellano el manual al que hacemos referencia en el párrafo anterior ;-)

03 febrero 2016

Paso de parámetros por URL a una "Remote Task" (Antes y después de la 6.1)

Desde la versión 6.1 Omnis puede capturar para nosotros los parámetros adicionales incluidos en la URL de llamada a la página web, donde indicamos la carga del "remote form". Éstos parámetros se hacen disponibles directamente desde la variable de parámetro "row" del método $construct, ya conocido por todos nosotros. Su funcionamiento es el siguiente:

Suponiendo la siguiente URL: http://127.0.0.1:5988/jschtml/rfSetCurField.htm?x=y&a=b

La tecnología jsClient agregará los parámetros indicados en una columna adicional de la variable parámetro "row" denominada "URLparams". Los datos de la "URLparams" se encuentran codificados en formato JSON, en nuestro ejemplo, x = y & a = b, la cadena JSON resultante sería: {"x": "y", "a": "b"}. Pero no nos preocupemos, pues podemos hacer uso de la nueva función "OJSON" para convertir esto a formato "row", del siguiente modo:

Do OJSON.$jsontolistorrow(pRow.URLparams) Returns lRow

...donde "lRow" es una variable "row", tendremos que lRow.x='y' y lRow.a='b'.

Pero... y antes de la versión 6.1, ¿Cómo podríamos capturar los parámetros de la URL? ¿Sería posible hacerlo con JavaScrip? Pues la respuesta es, si.

Tan sólo deberemos incluir en la sección "head" de nuestra página web, la siguiente función:

<script>
     function gup( name ){
          var regexS = "[\\?&]"+name+"=([^&#]*)";
          var regex = new RegExp ( regexS );
          var tmpURL = window.location.href;
          var results = regex.exec( tmpURL );
               if( results == null )
                    return"";
               else
                   return results[1];
       }
<script>

Con esta función podemos obtener cualquiera de los parámetros incluidos en la URL, simplemente pasándole en su llamada a al misma, el nombre del parámetro a obtener, por ejemplo:

<script>
     var x=document.getElementById("omnisobject1");
     x.dataset.param1=gup('x');
     x.dataset.param2=gup('a’);
<script>

El ejemplo anterior, pasaría el valor 'y' a la columna "param1" y el valor 'b' a la columna "param2" de la variable parámetro "row", tan sólo deberemos tener en cuanta colocar éste ultimo script, detrás del div donde invocamos al "remote form".

NOTA: Si trabajamos con versiones de Onnis Studio anteriores a la 6, deberemos usar la notación x.attributes.param1.value=gup('x') en lugar de x.dataset.param1=gup('x').

27 enero 2016

Uso de las funciones strpbrk() y strspn()

Encuentro especialmente útil su uso para comprobar si los valores almacenados en una variable cumplen con un determinado patrón.

El formato de la primera función es strpbrk(cadena1,cadena2), ¿Qué hace?


Devuelve una subcadena de cadena1, desde el punto en que cualquiera de los caracteres de cadena2 sea localizado en cadena1. Si ninguno de los caracteres de cadena2 coincide con los de cadena1, la función nos devolverá una cadena vacía.

Veamos un ejemplo:

Supongamos que disponemos de un campo de entrada en el que sólo deseamos permitir el uso de letras no acentuadas, números y comas, es decir sin caracteres especiales. Un modo de impedirlo sería mediante el método siguiente:

On evKey
    If len(strpbrk(upp(pKey),'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,'))=0&len(pKey)>0
        Quit event handler (Discard event)
    End If


Si pKey contiene (por ejemplo) el caracter #, la función strpbrk() anterior devolvería una cadena vacía, ya que el caracter # no está contenido la cadena: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,

El uso de "Quit event handler (Discard event)" anulará la introducción del caracter #. La comparación "len(pKey)>0" se ha añadido para evitar el uso de "SystemKey events" o dicho de otro modo, la generación de eventos del sistema mediante el teclado.

El formato de la segunda es strspn(cadena1,cadena2), ¿Qué hace?


Devuelve el índice del primer carácter de cadena1, no coincidente con los contenidos en cadena2. Si todos los caracteres son coincidentes, la función devolverá el valor correspondiente al "len(cadena1)+1", es decir la longitud de cadena1 más uno.

Si (por ejemplo) quisiéramos comprobar que todos los caracteres contenidos en una determinada cadena coincidan con los permitidos, podríamos usar lo siguiente:

If strspn(upp(NumeroDeTelefono),'0123456789() -/')>len(NumeroDeTelefono)
    ; Todos los caracteres de variable NumeroDeTelefono
    ; pertenecen o están contenidos en el grupo 0123456789() -/
End If


Suponiendo que NumeroDeTelefono="01\5551234", la función strspn() anterior devolvería '3', ya que el tercer carácter no está entre el grupo de los permitidos, pero si su valor fuera NumeroDeTelefono="01/5551234" la función strspn() devolvería '11', ya que su longitud es '10'.

20 enero 2016

Como abrir documentos en Mac OS y en Windows, desde Omnis.

Abrir documentos en Mac OS.


Calculate applescript as con('property target_URL : "', lvpath,'"',kCr,'open location target_URL')
Do method $doApplescript (applescript,results) Returns #F


Si lvpath es 'file://pathtofile') --≥ abre un archivo
Si lvpath es 'http://www.myurl.org/path.html' --≥ abre el navegador
Si lvpath es 'mailto:name@email.com'  --≥ abre el cliente e-mail
Si lvpath es 'feed:rssfeed path'  --≥ abre el lector de rss

Abrir documentos en Windows.


Calculate lvPath as 'C:\Users\Tom\Downloads\demo\demo.html'
Register DLL ("SHELL32.DLL","ShellExecuteW","JJCCCCJ")
Call DLL ("SHELL32.DLL","ShellExecuteW",0,"open",lvPath,"","",0) Returns lvHandle



13 enero 2016

Tabla de componentes externos

Bajo el directorio "xcomp" del raíz de instalación Omnis, podemos observar una larga lista de al menos 120 componentes, pero... ¿Donde pueden usarse y con qué propósito?

A continuación os dejo una tabla que he confeccionado, donde indico, donde puede ser usado un determinado componente y cual es su propósito, para conocer detalles específicos sobre su uso les recomiendo que utilicen el "Interface Manager".


NOMBRE

NO-VISUALES

VENTANAS

INFORMES

WEB

IOS

USO

Accordion Library



X







Presenta una lista de opciones hipervínculo, que se expandne para mostrar más información.

AMAZONDAM

X









Acceso base de datos AMAZON.

BlowFish Library

X









Permite cifrar y descifrar contraseñas.

Calendar Library



X

X





Presenta el mes en curso y la fecha de actual, en un formato de calendario estándar.

Clock Library



X







Permite visualizar la hora actual, teniendo en cuenta la zona horaria actual del cliente.

Cool DropList Library



X







Permite listas desplegable de iconos, estilos de líneas, y otros.

Document Viewer Library



X

X





Visor de documentos Omnis

FadePict Library



X







Permite aplicar un efecto de fundido a una imagen mientras se carga, dispone de más de 30 estilos diferentes.

FileList Library



X







Pueden mostrar el contenido de una carpeta, ya sea en un formato de lista estándar o como una lista desplegable

FileOps

X









Permite gestionar archivos.

FishEye Library



X







Muestra una fila o columna con iconos clicables.

Flic Library



X







Permite cargar y presentar archivos de películas de tipo “flc” y "fli”.

FontOps

X









Permite gestionar fuentes.

FORMROLL Library



X







Botón gráfico, que se pone de relieve cuando el usuario pasa el ratón sobre él.

Gif Library



X

X





Utilizado para guardar y mostrar archivos “GIF” animados o estáticos.

Graph2 Library

X

X

X





Programación de gráficas.

Help utilities



X







Gestión de textos y documentos de ayuda.

HOTPICT Library



X







Permite crear áreas "clicables" sobre fotos, mapas e ilustraciones.

HTML Device





X





Permite visualizar documentos HTML.

HYPLINKS Library



X







Permite crear hipervínculos al estilo de la web.

iActivity









X

Componente para iOS

iButton









X

Componente para iOS

IconArray Library



X







Permite mostrar listas de elementos, identificados mediante iconos.

iDateTime









X

Componente para iOS

iImageView









X

Componente para iOS

iLabel









X

Componente para iOS

iMap









X

Componente para iOS

iNavigationbar









X

Componente para iOS

iPage









X

Componente para iOS

iProgress









X

Componente para iOS

iSearchBar









X

Componente para iOS

iSegmented









X

Componente para iOS

iSlider









X

Componente para iOS

iSwitch









X

Componente para iOS

iTabbar









X

Componente para iOS

iTable









X

Componente para iOS

iTextField









X

Componente para iOS

iTextView









X

Componente para iOS

iWebView









X

Componente para iOS

JavaCore

X









Motor java de Omnis

JavaObjs Library

X









Objetos Java

JDBCDAM

X









Acceso base de datos mediante JDBC.

JPEG Library



X

X





Permite guardar y mostrar gráficos en formato JPEG.

jsActivity







X



Componente JavaScript.

jsBack







X



Componente JavaScript.

jsButton







X



Componente JavaScript.

jsCheckbox







X



Componente JavaScript.

jschrt1







X



Componente JavaScript.

jschrt2







X



Componente JavaScript.

jsComboBox







X



Componente JavaScript.

jsDatePicker







X



Componente JavaScript.

jsDevice







X



Componente JavaScript.

jsDgrd







X



Componente JavaScript.

jsDropList







X



Componente JavaScript.

jsEdit







X



Componente JavaScript.

jsFile







X



Componente JavaScript.

jsHtml







X



Componente JavaScript.

jsHypl







X



Componente JavaScript.

jsLabel







X



Componente JavaScript.

jsList







X



Componente JavaScript.

jsmap







X



Componente JavaScript.

jsNativeList







X



Componente JavaScript.

jsNativeSlider







X



Componente JavaScript.

jsNativeSwitch







X



Componente JavaScript.

jsNavbar







X



Componente JavaScript.

jsNavMenu







X



Componente JavaScript.

jsPage







X



Componente JavaScript.

jsPict







X



Componente JavaScript.

jsPopm







X



Componente JavaScript.

jsProg







X



Componente JavaScript.

jsRadioGroup







X



Componente JavaScript.

jsRich







X



Componente JavaScript.

jsSlider







X



Componente JavaScript.

jsSwitch







X



Componente JavaScript.

jsTabs







X



Componente JavaScript.

jsTimer







X



Componente JavaScript.

jsTrans







X



Componente JavaScript.

jsTree







X



Componente JavaScript.

jsVideo







X



Componente JavaScript.

Marquee Library



X







Permite la visualización en desplazamiento continuo áreas de texto.

MYSQLDAM

X









Acceso base de datos MYSQL.

Navigation Menu Library



X







Permite crear menús en cascada interactivos.

NPAPI Library



X







Componenete NPAPI

ODBCDAM

X









Acceso base de datos mediante ODBC.

OJSON

X









Gestión de documentos JSON

Omnis PDF Device

X









Gestión de documentos PDF

OmnisIcn Library



X







Permite mostrar cualquier icono de los existentes en “OmnisPIC”, “USERPIC”, o “#ICONS”.

OMSQLDAM

X









Acceso base de datos df1 mediante SQL.

ORACLE8DAM

X









Acceso base de datos ORACLE.

OWEB

X









Implemetación del protocolo HTML

OXML

X









Gestión de documentos XML

PCX Library



X

X





Permite visualizar imágenes PCX.

PGSQLDAM

X









Acceso base de datos POSTGRE.

PicList Library



X







Permite mostrar cualquier icono de los existentes en “OmnisPIC”, “USERPIC”, o “#ICONS”.

PortProfile

X









Configuración de puertos de comunicación.

Progress Library



X







Permite visualizar una barra de progreso

QuickTime3 Library



X







Gestión de documentos Quick Time.

RegAdmin

X









Permite el acceso al registro del sistema.

Report Lists Library





X





Muestra una variable de tipo "list" en un informe.

Report Object Library





X





Permite incrustar clases "report" en ventanas.

RTF Device

X









Permite mostrar archivos RTF.

Sidebar Library



X







Permite visualizar una serie de iconos o botones en una barra vertical.

Slider Library



X







Proporciona un deslizador gráfico graduado, que el usuario podrá modificar.

SpreadSheet Grid Library



X







Funciona como una hoja de cálculo de sólo lectura, con los datos contenidos en una variable de tipo "list".

SQLITEDAM

X









Acceso base de datos SQLITE.

Stix Library



X







Control Stix

StringTable

X

X

X





Permite la localización de etiquetas en diferentes idiomas.

SYBASEDAM

X









Acceso base de datos SYBASE.

TabBar Library



X







Presenta una serie de “thumb tabs” o pestañas, sobre las que el usuario podrá hacer clic.

Tile Library



X







Permite mostrar un icono que se propagará, sobre toda la zona.

Timer Library

X

X







Proporciona un temporizador de segundos o milisegundos.

ToolPal Library



X







Control tool pal

Tooltip Library



X







Control de tool tip's

TransButton Library



X







Implementa un “rollover” de tipo botón.

Transform Library



X







Permite efectos de animación y transformación.

Tree Library



X







Proporciona una forma gráfica de mostrar elementos u opciones dispuestos en forma de árbol.

Wash Library



X







Permite añadir un efecto de degradado de color, sobre toda la zona.

WAV Library

X

X







Permite cargar y reproducir archivos de sonido en formato “WAV”.

WBMP Library

X









Permite cargar y reproducir archivos de imagen en formato “WBMP”.

Zoom Library



X







Permite ampliar áreas de la pantalla.