29 abril 2015

Ventanas adaptables (Sync Screens Tool)

¿Cómo funciona la nueva herramienta "Sync Screens"?


La idea es que, tras crear un "remote form", podamos formatear todos sus campos y controles para que aparezcan con el tamaño y posición correctos, según cada una de las posibles orientaciones y tamaños de pantalla, ya sean de tipo escritorio, tabletas o móviles. (según las diferentes configuraciones soportadas para la propiedad $screensize).

Sin duda se trata de una tarea que nos consume mucho tiempo a los desarrolladores, debido al gran número de diferentes dispositivos y diseños soportados por los "remote form".


Afortunadamente ésta herramienta nos permitirá realizar ésta labor de forma automática, lo que sin duda nos ahorrará mucho tiempo, además de hacer que nuestras aplicaciones sean más consistentes y fáciles de usar para los usuarios finales, puesto que se adaptarán al dispositivo en uso.


Podrá localizar la nueva herramienta "Sync screens" situada bajo el menú "Tools≥≥Add Ons".


Para utilizarla deberá seleccionar una biblioteca desde el desplegable "Library" y seleccionar el "remote form" JavaScript que desee sincronizar. Mediante el desplegable 'Source Screensize' podrá indicar cual es el punto de partida sobre el cual se construirán el resto de los tamaños seleccionados. (por defecto aparecerá seleccionado "desktop") Después, deberá elegir qué tamaños deberán sincronizarse mediante las casillas de verificación. Los elementos situados bajo "Options" le permitirán escalar o no los objetos, según su posición horizontal y/o vertical y/o según su anchura y altura. Si no desea que un objeto en particular sea alterado por la herramienta, puede optar por bloquearlo. Para ello y desde el modo-diseño, pulse botón derecho sobre el objeto y escoja la opción "Lock", la opción "Ignore Locked Components" (por defecto activada) le permitirá decidir si tal comportamiento deberá ser tenido en cuenta o no. Una vez realizados los ajustes pertinentes, haga clic sobre el botón "Sync".

Ahora podrá cambiar la propiedad $screensize de su "remote form", para comprobar el funcionamiento de los diferentes diseños seleccionados. Recomendamos que también realice pruebas en un navegador y en diferentes dispositivos para comprobar que los diferentes objetos del "remote form" se dimensionen y posicionen correctamente.

22 abril 2015

Como eliminar líneas duplicadas de una lista

El ejemplo siguiente une dos listas (listaUno y listaDos) sobre una nueva denominada listaUnida, para después eliminar de ella las líneas duplicadas, según el valor de la columna aValor.

Calculate listaUnida as listaUno
Do listaUnida.$merge(listaDos)
Do listaUnida.$sort($ref.aValor,kFalse)
Do listaUnida.$sendall($ref.$selected.$assign(kTrue),($ref.aValor=listaUnida.[$ref.$line+1].aValor)|(($ref.$line>1)&($ref.aValor=listaUnida.[$ref.$line-1].aValor)))
Do listaUnida.$remove(kListDeleteSelected)

El ejemplo siguiente está considerado como el más rápido de todos, para una "myList"  con 1578 filas de las cuales 250 están duplicadas, el tiempo fue de dos segundos.

Set current list (myList)
Set sort field (myCol)
Sort list
Set search as calculation {myList(1,#L)=myList(1,#L-1)}
Search list (Select matches (OR),Deselect non-matches (AND))
Delete selected lines

Aunque seguramente la mejor opción sea la apuntada por Xavier Blanco, que consiste en el uso del método predefinido "listaUnida.$cols.aValor.$removeduplicates(ktrue)" (Ver la página 101 del manual de programación en castellano).


15 abril 2015

Códigos de error y constantes FileOps

En ésta entrada os dejo el listado de las constantes disponibles para FileOps, los códigos de error a que corresponden y una breve explicación.


kFileOpsOK 0
Ejecutado con éxito
kFileOpsParamError 1 Faltan parámetros
kFileOpsOutOfMemory 12
Memoria insuficiente
kFileOpsDirFull -33 Fichero o directorio lleno
kFileOpsDiskFull -34
Disco lleno
kFileOpsVolumeNotFound -35 El volumen especificado no existe
kFileOpsDiskIOError -36
Error de disco E/S
kFileOpsBadName -37 Nombre de archivo o volumen incorrecto (tal vez sin nombre)
kFileOpsFileNotOpen -38
Archivo no abierto
kFileOpsEndOfFile -39 Se llegó al final del archivo durante una operación de lectura
kFileOpsPositionBeforeStart -40
Intento de posicionarse en un lugar anterior al inicial del archivo
kFileOpsTooManyFilesOpen -42 Se han abierto demasiados archivos
kFileOpsFileNotFound -43
Archivo no encontrado
kFileOpsHardwareVolumeLock -44 El volumen está bloqueado por hardware
kFileOpsFileLocked -45
Archivo bloqueado
kFileOpsSoftwareVolumeLock -46 El volumen está bloqueado por software
kFileOpsMoreFilesOpen -47
Uno o más archivos ya estan abiertos
kFileOpsAlreadyExists -48 Ya existe un archivo con el nombre especificado 
kFileOpsAlreadyWriteOpen -49
Sólo se permite un único camino de acceso al archivo durante su escritura              
kFileOpsNoDefaultVolume -50 El volumen predefinido no existe 
kFileOpsBadFileRef -51 - 
kFileOpsVolumeNotOnline -53
El volumen no esta disponible o montado
kFileOpsPermissionDenied -54 Permiso denegado o archivo de sólo lectura 
kFileOpsVolumeAlreadyMounted -55
El volumen especificado ya está disponible o montado
kFileOpsBadDrive -56 El número de unidad expecificado no existe
kFileOpsInvalidFormat -57
El volumen no contiene uno de los formatos sportados
kFileOpsExternalSystemError -58 Error externo detectado por el sistema de archivos
kFileOpsProblemDuringRename -59
Se ha producido un problema durante el cambio de nombre
kFileOpsBadMasterBlock -60 Se ha detectado un bloque índice defectuoso; deberá reiniciar el volumen
kFileOpsCantOpenLockedFile -61
No ha sido posible abrir el archivo por estar bloqueado
kFileOpsDirectoryNotFound -120 Directorio no localizado
kFileOpsTooManyDirOpen -121
Se han abierto demasiados directorios
kFileOpsCantMoveToOffspring -122 Intento de posicionarse fuera del ambito del archivo
kFileOpsNonHFSOperation -123
Intento de relizar una operación HFS sobre un volumen con otro formato
kFileOpsDifferentVolume -124
Intento de relizar la operación sobre volúmenes o nombres de archivo diferentes
kFileOpsInternalSystemError -127 Error interno detectado por el sistema de archivos
kFileOpsCrossDeviceLink 100 -
kFileOpsDeadlock 101 -
kFileOpsTooManyArguments 102 -
kFileOpsMathArgument 103 -
kFileOpsExecFormatError 104 -
kFileOpsResultTooBig 105 -
kFileOpsUnknownError 998
Error desconocido
kFileOpsNoOperation 999 Operación no compatible para la plataforma en uso
kFileOpsInvalidEncoding 1000 -

08 abril 2015

Como crear una aplicación personalizada a partir de un “runtime” Omnis Studio para Mac OS en ocho sencillos pasos.

Paso 1 – Instalar un “runtime”.


Instale un “runtime” Omnis, haga una copia del mismo y después cambie el nombre de la copia por el de su aplicación. De éste modo habremos construido lo que se conoce como el “Application Package”.

 

Paso 2 – Mostrar el contenido del “Application Package”.


Abra el “Application Package”. Para ello, haga clic-derecho sobre su icono y seleccionando la opción “Mostrar contenido del paquete” del menú contextual. El contenido del paquete se abrirá en otra ventana o pestaña del Finder. Cambie el modo de presentación a “vista en columnas” y verá el árbol de directorios con los distintos archivos y directorios que componen el “runtime”.

 

Paso 3 – Componer nuestra aplicación.


Si se está mostrando la carpeta “Contents” sobre el Finder en modo “vista en columnas”, podrá hacer clic sobre ella y ver que contiene varios elementos, incluyendo una carpeta llamada "MacOS". Haga clic en esta carpeta y se mostrarán todos los archivos y carpetas que componen la parte principal del “runtime”. Localice ahora la carpeta con el nombre “startup”.

Coloque las librerías y archivos especiales que conformen su aplicación dentro de esta carpeta, ponga cuidado en organizar los archivos exactamente como desea que figuren en su aplicación final. La ubicación de la librería principal sobre la carpeta “startup” hará que se cargue e inicie cada vez que se ejecute la aplicación. No deberá poner en esta carpeta el archivo de datos principal con los datos del usuario, pero si puede colocar en ella archivos de datos secundarios, como (por ejemplo) un archivo donde almacenar las preferencias del usuario, datos relativos a constantes, listas de búsqueda, estados u otros por el estilo.

Sea riguroso al comprobar su configuración a fin de resolver cualquier problema antes de continuar con la construcción del paquete. Para ello, cierre la ventana “Contents” y ejecute la aplicación, hasta comprobar que todo funciona normalmente.
 

 

Paso 4 - Modificar el archivo “info.plist”


En el nivel superior y dentro de la carpeta “Contents” podrá hallar un archivo denominado “info.plist”. Ábralo con el “Property List Editor”. A continuación le indicamos que propiedades deberán tenerse en cuenta, para personalizar su aplicación.

Mediante el “Property List Editor”, expanda su contenido desde el nodo raíz y actualice las propiedades que le indicamos a continuación. Guarde los cambios y cierre el archivo cuando haya terminado.

 

Propiedad:  “CFBundleExecutable”.


Contiene el nombre del archivo ejecutable ubicado en “Contents:MacOS”. Lo mejor es dejar este parámetro con el valor original “Omnis” y dejar el archivo ejecutable también con su nombre original “Omnis” ya que sólo es utilizado internamente y no es visible para el usuario final.

 

Propiedad:  “CFBundleGetInfo”.


Esta es la información sobre la versión que aparece cada vez que el usuario selecciona la opción “Obtener información” sobre su aplicación desde la ventana del Finder. En la mayoría de los casos se usará una sola línea de información, como por ejemplo “MyAplicación 1.0 © 2007 MyCompañia”. Si usted desea hacer uso de una segunda línea de información, deberá componer primero las dos líneas de texto con un procesador de textos como “TextEdit” para poner un retorno de carro entre las dos líneas. Después, seleccione las dos líneas y péguelas sobre el “Value” de la propiedad. Es posible que el nuevo valor no aparezca en el Finder, hasta que haya reiniciado su sesión en el ordenador.

 

Propiedad:  “CFBundleIconFile”.


Este es el nombre del archivo con el icono representativo de su aplicación, ubicado en la carpeta “Contents:Resources”. Le recomendamos dejar el nombre original “omnis.icns” y sólo modificar su contenido.

 

Propiedad:  “CFBundleIdentifier”.


El contenido de ésta propiedad no es visible para el usuario final, pero si lo desea, puede cambiarla de todos modos.

 

Propiedad:  “CFBundleName”.


Este es el texto que aparecerá como nombre de su aplicación en la barra de menús (junto al menú Apple). Al hacer clic sobre ese nombre para desplegar el menú, este mismo texto también aparecerá sobre las líneas “Ocultar ≤texto≥” y “Salir ≤texto≥”. Una copia de este parámetro en “InfoPlist.strings” (ver Paso 5) permite controlar lo que debe aparecer aquí, cuando nuestra aplicación está siendo localizada para diferentes idiomas. Le recomendamos que también modifique el valor en la copia del “Info.plist” para la versión en Inglés.

 

Propiedad:  “CFBundleShortVersion”.


Esta es la información sobre la versión que aparece a la derecha (sobre el panel de vista previa) tras hacer clic en su aplicación y si está activado en el Finder la opción de “vista en columnas”. Al igual que con ocurría con la propiedad “CFBundleGetInfoString” (ver más arriba), puede que tenga que reiniciar el ordenador para ver aparecer este valor en el Finder.

 

Propiedad:  “CFBundleVersion”.


Este es el número de versión de su “paquete”. Como ocurre con la propiedad “CFBundleIdentifier” (ver más arriba), no será visible para el usuario final, pero si lo desea, puede cambiar su valor.

 

Paso 5 - Modificar el archivo de recursos de idioma(s)


En el nivel superior y dentro de la carpeta “Contents” podrá hallar una carpeta denominada “Resources”. Ábrala y verá la carpeta “English.lproj”. Esta contiene un archivo denominado “InfoPlist.strings”. (Puede que existan otras carpetas “.lproj” correspondientes a otros países, pero cada uno de ellos contendrá un archivo “InfoPlist.strings”, y deberán ser modificados de igual modo.) Abra el archivo mediante el “Property List Editor”, aunque note que ésta no es la aplicación predeterminada para este tipo de archivos.

Observará que el contenido de este archivo es muy similar al archivo “info.plist”. No es exactamente el mismo, así que no intente simplemente copiar el archivo “info.plist” y cambiarle el nombre. Abra el archivo “InfoPlist.strings(s)”  y copia los valores de las propiedades desde el “info.plist” al archivo “InfoPlist.string”. (Si está modificando un archivo “InfoPlist.strings “para otro idioma, es probable que tenga que ajustar los valores para que tengan sentido en ese idioma en particular). Finalmente cierre y guarde el archivo (s).

 

Paso 6 - Añadir sus iconos.


Podrá optar por añadir un nuevo archivo de iconos o actualizar los contenidos en el archivo “omnis.icns”. Estos archivos se encuentran en “Contents:Resources”. Suponiendo que dejamos el valor “omnis.icns” para la propiedad “CFBundleIconFile” en el archivo “info.plist”, modificaremos el archivo “omnis.icns” ya existente, para poner en él nuestros propios iconos.

Si ha optado por cambiar el nombre de los archivos “omnis.icns” o crear uno con diferente nombre, éste deberá coincidir con el valor consignado para la propiedad “CFBundleIconFile” de los ficheros “info.plist” y “InfoPlist.strings” (ver paso 4).

En cualquier caso haremos uso de la utilidad “Icon Composer” para incluir los iconos de nuestra aplicación en el archivo. Comience por una imagen de tamaño 128x128 “Thumbnail”. Esto es lo que aparecerá en el panel de la derecha (el panel de vista previa) cuando se hace clic sobre la aplicación y el Finder está en modo “vista en columnas”. Copie o lleve su imagen al portapapeles y haga clic sobre la caja de iconos en miniatura (Thumbnail) para pegarla en su lugar.

Para el resto de tamaños, puede optar por re-dibujar cada uno de ellos, pero será mucho más fácil si genera el resto simplemente mediante arrastrar la imagen anterior sobre los diferentes tamaños. En primer lugar, haga clic sobre la imagen “Thumbnail” y arrástrela sobre la caja “Huge (48x48)” (Enorme). Luego haga clic sobre el icono anterior (Huge) y arrastrarlo sobre la caja “Large (32x32)” (Grande). Por último, haga clic en el icono “Grande” y arrástrelo sobre la caja “Small (16x16)” (Pequeño). Esto le permitirá crear el conjunto de iconos y sus diferentes tamaños con el mínimo esfuerzo.

 

Paso 7 - Añadir los códigos de Creador y Tipo (opcional)


Si ha registrado el tipo y el creador de la aplicación en Apple, tendrá que modificar el archivo denominado “PkgInfo”. Si no ha efectuado dicho registro, puede omitir este paso.

Si usa el editor BBEdit podrá abrir este archivo y ver los códigos de creador y tipo en una sola línea. Por ejemplo el código de creador de Omnis es “OO$$”, por lo que la cadena del “PkgInfo” es “APPLOO$$”. Esto le indicará al Finder que el paquete es una aplicación (APPL) firmada por “OO$$”. Si usted tiene su propio código de creador, deberá modificar el atributo “CFBundleSignature” de los archivos “Info.plist” e “InfoPlist.strings” ya que también deberán contener su código de creador.

 

Paso 8 – El final


Cierre la ventana del Finder que muestra el contenido de la careta “Contents”. Si aún no puede ver el icono modificado para su aplicación, abra el cuadro de diálogo “Obtener información”, después, haga clic el icono de Omnis en la esquina superior izquierda y pulse la tecla de borrar. Esto provocará que el Finder deba leer de nuevo el contenido del paquete y actualizar su icono. Si además de esto, reiniciamos el equipo, provocaremos la actualización completa la información sobre nuestra aplicación.

¡Ya hemos terminado! Preparados para entregar nuestra aplicación Mac OS a los usuarios finales.