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

14 diciembre 2017

Android Studio vs Omnis Studio

En éste artículo quiero comparar lo que supone crear una aplicación sencilla para un dispositivo Android, con dos diferentes herramientas para el desarrollo de "App's": Android Studio (exclusiva de la plataforma y gratuita) y Omnis Studio (multi-plataforma y de pago). Queremos que la aplicación sea capaz de crear una base de datos SQLite en el dispositivo, con tres campos: ID, Nombre y Apellido y cuatro botones para iteracción con el usuario: "Buscar", "Insertar", "Actualizar" y "Borrar", su aspecto y código necesarios se muestran a continuación:

Aspecto con Android Studio

Aspecto con Omnis Studio

Para añadir los elementos de la "interface" en ambos casos sólo ha sido necesario arrastrar y soltar componentes desde sus respectivas paletas, pero a la hora de girar el dispositivo, "Android Studio" a requerido programación adicional, mientras que con "Omnis Studio" no ha sido necesario incluir programación alguna.

A continuación indicaremos el código que ha sido necesario escribir en cada caso, empezando por la creación de la BBDD SQLite en el dispositivo:

Creación de la BBDD en Android Studio

public class Estructura_BBDD {

private Estructura_BBDD() {}

        public static final String TABLE_NAME = "datosPersonales";
        public static final String NOMBRE_COLUMNA1 = "id";
        public static final String NOMBRE_COLUMNA2 = "nombre";
        public static final String NOMBRE_COLUMNA3 = "apellido";

    public static final String SQL_CREATE_ENTRIES =
            "CREATE TABLE " + Estructura_BBDD.TABLE_NAME + " (" +
                    Estructura_BBDD.NOMBRE_COLUMNA1 + " INTEGER PRIMARY KEY," +
                    Estructura_BBDD.NOMBRE_COLUMNA2 + " TEXT," +
                    Estructura_BBDD.NOMBRE_COLUMNA3 + " TEXT)";

    public static final String SQL_DELETE_ENTRIES =
            "DROP TABLE IF EXISTS " + Estructura_BBDD.TABLE_NAME;
}

Creación de la BBDD en Omnis Studio

Do $cinst.$sqlobject.$execute('CREATE TABLE Empleados (Id INTEGER UNIQUE, Nombre TEXT, Apellido TEXT)')
      Returns IDcreatetable

Un apunte antes de continuar en cuanto a la programación asociada a cada botón, en el caso de "Andriod Studio" ha sido necesario añadir código adicional para poner los botones en modo "OnClickListener", cosa totalmente innecesaria en "Omnis Studio", salvando ésta diferencia, (no trivial) indicamos el asociado a cada botón:

Botón "Buscar" en Android Studio

botonBuscar.setOnClickListener(new View.OnClickListener() {
   @Override   public void onClick(View v) {
       SQLiteDatabase db = helper.getReadableDatabase();
       String[] projection = {
               Estructura_BBDD.NOMBRE_COLUMNA2,
               Estructura_BBDD.NOMBRE_COLUMNA3       };

       String selection = Estructura_BBDD.NOMBRE_COLUMNA1 + " = ?";
       String[] selectionArgs = { textoId.getText().toString() };

       try {
           Cursor c = db.query(
                   Estructura_BBDD.TABLE_NAME,         
                   projection,                         
                   selection,                          
                   selectionArgs,                      
                   null,                               
                   null,                               
                   null                                
           );

           c.moveToFirst();
           textoNombre.setText(c.getString(0));
           textoApellido.setText(c.getString(1));

       }catch (Exception e){
           Toast.makeText(getApplicationContext(),"No se han encontrado registros.", Toast.LENGTH_LONG).show();
       }
   }
});

Botón "Buscar" en Omnis Studio

On evClick
Do lRow.$define(i_ID;i_Nombre;i_Apellido)
Do lRow.$assigncols(i_ID;i_Nombre;i_Apellido)
Do $cinst.$sqlobject.$selectfetch("Select * from Empleados where Id = @[i_ID]";lRow;kFetchAll) 
              Returns IDselectfetch

Botón "Insertar" en Android Studio

botonInsertar.setOnClickListener(new View.OnClickListener() {
    @Override    public void onClick(View v) {
        SQLiteDatabase db = helper.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(Estructura_BBDD.NOMBRE_COLUMNA1, textoId.getText().toString());
        values.put(Estructura_BBDD.NOMBRE_COLUMNA2, textoNombre.getText().toString());
        values.put(Estructura_BBDD.NOMBRE_COLUMNA3, textoApellido.getText().toString());

        long newRowId = db.insert(Estructura_BBDD.TABLE_NAME, null, values);
        Toast.makeText(getApplicationContext(),"Insertado ID: " + newRowId, Toast.LENGTH_LONG).show();
    }
});

Botón "Insertar" en Omnis Studio

On evClick
Do lRow.$define(i_ID;i_Nombre;i_Apellido)
Do lRow.$assigncols(i_ID;i_Nombre;i_Apellido)
Do $cinst.$sqlobject.$insert("INSERT INTO Empleados (Id, Nombre, Apellido) VALUES (@[i_ID],@[i_Nombre],@[i_Apellido])";lRow)
             Returns IDinsert

Botón "Actualizar" en Android Studio

botonActualizar.setOnClickListener(new View.OnClickListener() {
    @Override    public void onClick(View v) {

        SQLiteDatabase db = helper.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(Estructura_BBDD.NOMBRE_COLUMNA2, textoNombre.getText().toString());
        values.put(Estructura_BBDD.NOMBRE_COLUMNA3, textoApellido.getText().toString());

        String selection = Estructura_BBDD.NOMBRE_COLUMNA1 + " LIKE ?";
        String[] selectionArgs = { textoId.getText().toString() };

        int count = db.update(
                Estructura_BBDD.TABLE_NAME,
                values,
                selection,
                selectionArgs);
        Toast.makeText(getApplicationContext(),"Registro actualizado.", Toast.LENGTH_LONG).show();
    }
});

Botón "Actualizar" en Omnis Studio

On evClick
Do lRow.$define(i_ID;i_Nombre;i_Apellido)
Do lRow.$assigncols(i_ID;i_Nombre;i_Apellido)
Do $cinst.$sqlobject.$update("UPDATE Empleados SET Nombre=@[i_Nombre], Apellido=@[i_Apellido] where Id = @[i_ID]";lRow;lRow)
              Returns IDupdate

Botón "Borrar" en Android Studio

botonBorrar.setOnClickListener(new View.OnClickListener() {
    @Override    public void onClick(View v) {

        SQLiteDatabase db = helper.getWritableDatabase();
        String selection = Estructura_BBDD.NOMBRE_COLUMNA1 + " LIKE ?";
        String[] selectionArgs = { textoId.getText().toString() };
        db.delete(Estructura_BBDD.TABLE_NAME, selection, selectionArgs);
        Toast.makeText(getApplicationContext(),"Registro borrado.", Toast.LENGTH_LONG).show();
        textoId.setText("");
        textoNombre.setText("");
        textoApellido.setText("");
    }
});

Botón "Borrar" en Omnis Studio

On evClick
Do lRow.$define(i_ID;i_Nombre;i_Apellido)
Do lRow.$assigncols(i_ID;i_Nombre;i_Apellido)
Do $cinst.$sqlobject.$delete("DELETE FROM Empleados WHERE Id = @[i_ID]";lRow)
              Returns IDdelete

Notemos que en el código Android se ha evitado deliberadamente la incorporación del código necesario para tratar las excepciones, salvo en el caso del botón "Buscar" donde se usa un "try-catch", para controlar el hecho que pueda no encontrarse el registro buscado. Omnis predefine un método para tratar las excepciones denominado "$sqldone", a continuación mostramos un ejemplo de uso:

;  Se ejecuta cada vez que concluye una operación SQL (asíncrona)
;  Abandona el método con el mensaje de error, si se produce.

Do $cinst.$sqlobject.$getlasterrortext() Returns lErr
If lErr<>"OK"
Calculate i_ID as 0
Calculate i_Nombre as ''
Calculate i_Apellido as ''
Do $cinst.$showmessage(lErr;"Error")
Quit method
End If

;  Se ejecuta uno u otro proceso según el resultado
Switch pID
Case IDselecttables
If pResult.$linecount=0
Do $cinst.$creaTabla()     ;; Si no existe se crea la tabla
End If
Case IDselectfetch
Calculate lRows as pResult.$linecount
If lRows=0
Calculate i_ID as 0
Calculate i_Nombre as ''
Calculate i_Apellido as ''
Do $cinst.$showmessage("No existe el ID";"Respuesta")
Quit method
End If
Calculate i_Nombre as pResult.C2
Calculate i_Apellido as pResult.C3
Case IDcreatetable
Do $cinst.$showmessage("Tabla creada";"Respuesta")
Case IDinsert
Do $cinst.$showmessage("Inserción realizada";"Respuesta")
Case IDdelete
Calculate i_ID as 0
Calculate i_Nombre as ''
Calculate i_Apellido as ''
Do $cinst.$showmessage("Entrada borrada";"Respuesta")
Case IDupdate
Do $cinst.$showmessage("Actualización realizada";"Respuesta")
Default
Calculate i_ID as 0
Calculate i_Nombre as ''
Calculate i_Apellido as ''
Do $cinst.$showmessage("Error inesperado")
End Switch

En ocasiones los programadores y compañías dedicadas al desarrollo y mantenimiento de software, nos preguntamos ¿Porqué pagar por una herramienta, cuando existe otra que es gratis?, pero definitivamente puedo decir que en muchas ocasiones lo "barato" sale caro. Omnis Studio permite el desarrollo de aplicaciones para dispositivos móviles (Android, iOS y Windows), aplicaciones de escritorio (MacOS, Windows, Linux) o aplicaciones para la Web, sin necesidad de usar más herramientas que el propio Omnis Studio. El ejemplo de eficacia que hemos expuesto, compara una herramienta que sólo permite el desarrollo para dispositivos Android, por lo que el código resultante no podrá ser ejecutado en (por ejemplo) un dispositivo iOS, en cambio el código Omnis, puede ser ejecutado sin cambio alguno, sobre dispositivos iOS o Windows 10.

Juzguen ustedes mismos sobre si lo "barato" sale caro, llevo trabajando con Omnis Studio por unos 20 años ya, período durante el que las tecnologías han sufrido muchos y diferentes cambios que han hecho, al mismo tiempo, aparecer y desaparecer lenguajes de programación, pero Omnis Studio a sabido adaptarse a los tiempos y a tiempo con gran lujo y esmero.

Programar con Omnis Studio hace que me guste éste trabajo.

21 septiembre 2017

Nuevo Servidor de Aplicaciones Omnis para Linux

Puedo decir que Omnis expande sus oportunidades de negocio, así como la robustez de su plataforma para el despliegue de aplicaciones en la Web, con la nueva versión "headless" del "Omnis App Server" para Linux, ya que permite la ejecución de aplicaciones web y móviles basadas en su tecnología jsClient bajo el entorno de comandos linux y sin necesidad de interface gráfica alguna, aunque permitiendo su administración remota desde un navegador Web. El denominado servidor "headless" está disponible sólo para Linux.

Todas las opciones del servidor podrán ser controladas remotamente desde la línea de comandos del terminal de la máquina Linux o (como ya hemos comentado) hacer uso de su herramienta "Admin" para la Web, incluida en el directorio "clientserver\server".

Consideraciones


Comandos de consola


Encontraremos un nuevo parámetro boleano en el fichero "config.json" denominado "headlessAcceptConsoleCommands". Puesto a "true" (su valor predeterminado), el servidor dejará disponible para su uso la interfaz de línea de comandos.

Funciones


Cuando el servidor está funcionando en modo línea de comandos, la nueva función "isheadless()" devolverá "true", "sys(231)" devolverá cero y "sys(233)" devolverá una cadena vacía, de otro modo devolvería el título de la ventana situada en primer plano sobre el Servidor Omnis.

Java


En caso de usarse el modo comandos y para iniciar la (Maquina Virtual Java) JVM deberá fijar a "ture" el elemento "startjvm" del fichero "config.json".


Creación de clases desde código Omnis


Si en su código Omnis crea nuevas clases dinámicamente mediante notación, ahora dispone de un mecanismo para crear objetos nuevos mediante plantillas, las cuales deberán estar ubicadas bajo la carpeta "componenttemplates" de "Studio". Las carpetas son...

"componenttemplates/window"
"componenttemplates/remoteform"
"componenttemplates/report"

...éstas contiene respectivamente los archivos de plantilla para la creación de ventanas, formularios remotos e informes. Cada nombre de plantilla deberá tener la forma "complibrary_compcontrol.json", con _ (subrayado) en lugar de espacios: Son copias de los archivos "object.json" con sus propiedades. "complibrary" y "compcontrol" identifican respectivamente un componente y un nombre de control.

Restricciones


Existen varias diferencias o (mejor dicho) restricciones en comparación con el Servidor de Aplicaciones Omnis convencional o de entorno gráfico y son las siguientes:

  • La inclusión de imágenes en un PDF está sólo permitido con PNG's (o a imágenes compartidas "true-color").
  • No está soportado el uso de "port".
  • Deberá usarse la entrada "start" bajo la sección "server" del "config.json" para iniciar el servidor en modo "multi-threaded"
  • El comando "Test if running in background" siempre devolverá "true".
  • Algunos comandos y métodos de notación producirán error si son ejecutados, tales como:  open window $open sobre una clase-ventana, etc.
  • Las funciones de conversión de imágenes no están soportadas: pictconvto, pictconvfrom, pictconvtypes, pictformat pictsize (producirán un error).
  • Los mensajes estándar generados por el servidor ("OK messages" y mensajes de error) se enviarán al archivo de "log" del servidor o bien al Terminal si fuese necesario.

Instalación


Descargue el instalador desde: www.omnis.net/download/

Esta instalación supone que se está ejecutando como "root" o utilizando "sudo".

Actualice su versión de Linux usando los siguientes comandos, según el entorno linux de que disponga:

  • Centos/redhat: sudo yum update
  • Suse: sudo zypper update
  • Ubuntu/debian: sudo apt-get update


Una vez actualizado, tendrá que instalar las dependencias que Omnis requiere para su ejecución y que son las siguientes:

  • Centos/redhat: cups, pango
  • Suse/Debian: Runs out of box
  • Ubuntu: cups, libpango1.0


Una vez instalados, deberá iniciar el instalador del siguiente modo:

./Omnis-Headless-App-Server-8.1-x64.run

Siga los pasos que le mostrará el instalador, tal y como lo haría en una instalación normal de Omnis Studio, asegurándose de que su número de serie sea el correcto, de otro modo, la instalación fallará.

En caso de Centos 7 o Redhat el servicio omnis no se iniciará automáticamente tras un reinicio, necesitará agregar manualmente Omnis a la lista "autostart" del siguiente modo:

sudo /sbin/chkconfig --add homnis
sudo /sbin/chkconfig --list homnis
                (Esta línea es para verificar que se ha agregado correctamente "homnis")
sudo /sbin/chkconfig homnis on

Ahora deberemos configurar el servidor utilizando la herramienta "Admin", tal y como mostramos a continuación y para según que plataforma:

CENTOS7 y REDHAT


Comandos necesarios para que Omnis funcione en Centos:

sudo yum update
sudo yum install cups
sudo yum install pango
sudo /sbin/chkconfig --add homnis
sudo /sbin/chkconfig --list homnis
sudo /sbin/chkconfig homnis on

SUSE


El servidor debe funcionar fuera del "box" de SUSE, pero recomendamos su actualización por si acaso:

sudo zypper update

Ubuntu 16.04, 17.04 y DEBIAN 9


sudo apt-get update
sudo apt-get install unzip
sudo apt-get install libpango1.0
sudo apt-get install cups

Herramienta Web de Administración


Disponemos de una herramienta "Admin" para configurar y mantener el servidor: la herramienta "Admin" se implementa por medio de un "remote-form" ubicado en la carpeta "clientserver\server" y puede ser cargado desde un navegador web, mediante abrir la página web llamada "osadmin.htm". Deberá tener en cuenta que, (para poder abrir esta página) deberá configurar antes en el servidor, el parámetro "data-webserverurl" de la página html mencionada, (URL, dirección IP o nombre y número de puerto, por ejemplo, http://192.1.1.68.5000), además de colocar el archivo html, bajo una ubicación que le permite abrirlo desde un navegador web.


La herramienta Administrador tiene varias pestañas que le permiten ver o configurar el servidor Activity, Logs, Settings y Users. Cuando abre la herramienta por primera vez en su navegador, se le pedirá que inicie la sesión: use el nombre de usuario predeterminado: omnis, contraseña: 0mn1s (el primer carácter es un cero). Una vez iniciada la sesión, podrá cambiar la contraseña predeterminada y crear otros usuarios.

Activity


La pestaña "Activity" le permite ver todas las librerías abiertas en el servidor. Puede utilizar el botón "Refresh" para actualizar la lista.

El botón "Open" le permite abrir una librería sobre el servidor; tenga en cuenta que eso ocasionará la ejecución de su método "construct". Puede hacer clic sobre cualquier librería para cerrarla con el botón "Close"; tenga en cuenta que al cerrar una librería se perderán todos las conexiones de los posibles clientes conectados a ella.

La pestaña "Active Tasks" mostrará todas las instancias "task" actualmente activas o (lo que es lo mismo) todas las conexiones de clientes actuales; mediante seleccionar una "task" o conexión, podrá ver sus detalles. También podremos matar o cerrar una instancia "task" o conexión mediante el botón "Kill Task"; tenga en cuenta que al eliminar una tarea o conexión se perderán las acciones en curso para ese cliente.

Logs


La pestaña "Logs" nos permite ver la siguiente información:

  • Server. Muestra un registro de la actividad del servidor (su ubicación puede indicarse en la pestaña "Settings")
  • Monitor. Muestra un registro de todas las conexiones de cliente activas (instancias "task")
  • Service. Muestra un registro de todos los errores o mensajes generados por el servidor, incluyendo cualquier mensaje de rastreo o información sobre cualquier solicitud "Web Service".


Bajo la pestaña "Service", el botón "Configure" le permite configurar los mensajes que se guardarán en el registro, incluyendo los atributos "folder" de "logToFile", los cuales indican la ruta hacia el lugar donde se encuentran los ficheros de registros en el servidor. Estos ajustes están localizados en el "config.json" del servidor, bajo el miembro "log", del siguiente modo:

"log": {
        "logcomp": "logToFile",
        "datatolog": [
            "restrequestheaders",
            "restrequestcontent",
            "restresponseheaders",
            "restresponsecontent",
            "tracelog",
            "seqnlog",
            "soapfault",
            "soaprequesturi",
            "soaprequest",
            "soapresponse",
            "cors",
            "headlessdebug",
            "headlesserror",
            "headlessmessage",
            "systemevent"
        ],
        "overrideWebServicesLog": true,
        "logToFile": {
            "stdout": true,
            "folder": "logs",
            "rollingcount": 10
},
        "windowssystemdragdrop": true
    }

Settings


Bajo la pestaña "Settings" podremos especificar la ubicación de los ficheros de registro del servidor y del monitor, además del período (temporizador) y el tamaño de los mismos. También podremos configurar el puerto que deberá usar el servidor ("Server Port"), el número de pilas de ejecución ("Server Stacks") y su "Timeslice" (todo quedará guardado en el archivo "config.json"), también podremos reiniciar el servicio desde aquí.

El nombre de servicio predeterminado es "homnis" y es especificado bajo la entrada "server" del archivo "config.json" del siguiente modo:

{
     "server": {
          …
               "service": "homnis"

Users


Bajo la pestaña "Users" podremos tanto modificar usuarios, como crear nuevos. El usuario predeterminado es "omnis" y podremos cambiarlo desde aquí. La selección, de la opción "Re-start Option" permite que un usuario reinicie el servidor.

Nota del autor


Decíamos al principio de éste artículo que "Omnis expande sus oportunidades de negocio" y la razón es que (en mi opinión) el nuevo servidor "headless", resulta en una opción muy apropiada, para poner en marcha un servicio "hosting" para el despliegue de aplicaciones Omnis en la Web, algo que me consta ha sido demandado por los desarrolladores de aplicaciones Omnis Studio.

Aunque aún no he tenido oportunidad de probarlo, parece sencillo el disponer de una o más máquinas virtuales Linux con servicios OAS (Omnis Application Server) instaladas en nuestro Data Center. ¿Que os parece la idea?


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.