AsfComponents 1.03

 

Paleta de Componentes ASF para Aplicaciones Delphi 6

 

Historia

 

1.00: 03/01/2002: Primer producto AsfLocalize.

1.01: 03/06/2002: Resuelto un problema en Win NT "Access Violation in Ntdll.dll".

1.02: 03/18/2002: Se removieron variables no usadas en 1.01; Se agregó Notification para resolver un access violation al hacer destroy con la referencia al server; El Destroy del componente producía un access violation ahora resuelto.

1.03: 05/18/2002: Se creó AsfComponents donde se ha incluido AsfLocalize. 

 

Componentes

 

  1. TAsfLocalizeClient y TAsfLocalizeServer.

 

El objetivo de estos componentes es permitir de forma sencilla la internacionalización, globalización o localización de aplicaciones realizadas con Delphi.

Permite la traducción de los “Caption”, Textos, etc. según un lenguaje elegido y que puede producir el desarrollador como el usuario final.

Incluye un editor de lenguajes y permite el cambio de lenguaje en runtime (on fly).

Se basa en los string y no en los componentes individuales por lo que requiere muy poco trabajo para definir nuevos valores para cada lenguaje a usar.

Trabaja con Forms, QuickReport y FastReport.

Traduce mensajes, listas, columnas en grillas, reportes, etc..

Los recursos propios de Delphi no son traducidos, pero para ello Delphi cuenta con las herramientas necesarias.

 

2.    TAsfTimer.

 

AsfTimer es un thread timer de múltiples propósitos.

 

3.    TAsfKeyPad.

 

AsfKeyPad permite crear un teclado visible con diferentes Layouts (Teléfono, Calculadora Normal, Calculadora Administrativa, PC KeyBoard). AsfKeyPad genera un evento cuando una tecla es presionada, devolviendo los datos necesarios como para identificar la misma.

 

4.    TAsfDigit.

 

AsfDigit es un componente visual que muestra un dígito de leds.

 

5.    TAsfDigitPanel.

 

AsfDigitPanel es un componente visual que muestra un panel de dígitos (TAsfDigit) con características especiales que permiten enviarle datos directos a mostrar.

 

6.    TAsfTapeDisplay.

 

AsfTapeDisplay representa una pequeña impresora de tira de papel (del tipo utilizado en calculadoras administrativas).

 

7.    TAsfCalcUnit.

 

AsfCalcUnit es un componente no visual que se ocupa de resolver operaciones de acuerdo al modo elegido. Fue pensado principalmente para resolver operaciones matemáticas a partir de la entrada de caracteres sueltos. Posee salidas para diferentes tipos de componentes.

 

8.    TAsfCalculator.

 

AsfCalculator es un componente no visual que al llamar al método Execute, levanta una calculadora que puede ser administrativa o normal (de acuerdo a una propiedad). Este componente devuelve el valor final que se muestra en el display.

 

Probado con:

 

Delphi 6 Enterprise Update 2.

 

Modo de Funcionamiento

 

Este sistema está basado en dos componentes no visuales AsfLocalizeServer y AsfLocalizeClient.

 

Un único Server bastará para toda una aplicación que trabaje íntegra bajo un mismo lenguaje, sin embargo, es posible utilizar varios de ellos si se pretendiera trabajar con diferentes lenguajes según la parte de la aplicación.

 

Lo primero que hay que hacer es pegar un Server en un Form o DataModule de la aplicación (preferentemente el main).

 

Luego, se pegará un Client en cada Form, DataModule, etc que se utilice en la aplicación. No importa si el Form, por ejemplo, se crea en forma automática o mediante código.

 

A cada Client se le define la propiedad LocalizeServer apuntando al Server antes colocado. Cuando un Client está en una unidad diferente que el Server, habrá que colocar la unidad principal en uses.

 

Cuando todo está listo y si el Server tiene la propiedad Active en True y Language en “Default”, entonces al llamar al método SetGetAllProperties en un Client se tomarán todos los string visuales de los componentes en el Form, por ejemplo, donde se encuentre pegado Client. Estos string se escribirán en sendos archivos de diccionario del estilo ini pero con la extensión lng. Para cada tipo de string se utiliza una sección diferente del archivo (Caption, Text, Hint, etc). Inicialmente el sistema creará un Diccionario “Default”, pero con la ayuda del editor incluido, Usted podrá crear los diccionarios que desee. Cuando se agregue un nuevo componente en el Form se creará la entrada para sus string en forma automática en todos los diccionarios registrados.

 

Los lenguajes existentes se registran en Windows Registry y el editor incluido permite hacerlo. Además hay un método para ello.

 

El paso siguiente es que Usted defina que desea que aparezca como string para cada elemento visual (según el que antes tenía, no dependiendo del componente sino del string). Para ello utilice el editor de lenguajes incluido.

 

Importante:

 

Cuando se elige un lenguaje en el editor incluido y/o una carpeta de lenguajes se deja una marca en la Registry que luego el sistema utiliza para arrancar las aplicaciones con esos parámetros. Si Usted hace una aplicación que permite al usuario cambiar el lenguaje en forma dinámica, el último utilizado será el lenguaje de arranque.

Recuerde que estos datos, como así también los registros de lenguajes existentes serán válidos para todas las aplicaciones que corran en esa PC y utilicen los componentes ASFLocalize.

 

Propiedades, Métodos y Eventos (Server)

 

Propiedades

Descripción

Active: Boolean

Define si el Servidor de localización grabará y/o leerá datos en o de los diccionarios. Si Active = false aunque llame a métodos de traducción no tendrán efecto.

DicPath: String

Camino (Path) a la carpeta donde se encuentran los diccionarios de lenguajes. Sin la \ (slash) en el final. El Path utilizado queda grabado en la Registry por lo que no necesita cargarse cada vez. Puede cambiarse con el Editor Incluido.

Language: String

Aquí se elige entre los lenguajes registrados. Cuando se llame a un método de traducción se utilizará el lenguaje aquí seleccionado.

En la medida que Usted agregue más diccionarios al sistema, los correspondientes lenguajes estarán disponibles para ser elegidos.

Recuerde que para cargar automáticamente los datos iniciales en los diccionarios Language deberá estar en “Default” y Active en true.

Cuando se cambia el lenguaje, automáticamente se reflejarán los cambios en la aplicación.

Languages: TStringList

Propiedad no publicada (pero pública) que representa una lista de los lenguajes registrados.

 

 

Procedimientos

 

PutListProperty(List, ViewList: TStringList)

Es solo para uso interno.

RegisterClient(AClient: TComponent)

Es sólo para uso interno.

UnRegisterClient(AClient: TComponent)

Es sólo para uso interno.

CreateLanguageMenu(Item: TMenuItem; Default, BitMaps: Boolean)

En Item se pasa un TmenuItem que Usted creó, habitualmente dentro del menú principal, por ejemplo, “Idiomas”. Este procedimiento creará un sub menú con los lenguajes disponibles para permitir que el Usuario Final elija el que prefiera.

Si Default es true, implica que en el menú se podrá seleccionar Default como idioma.

Si BitMaps es true se verán los BitMaps en el menú, de lo contrario no serán visibles.

SetNewLanguage(Lang: String; Image: TBitMap)

Genera un nuevo conjunto de archivos de lenguaje *.lng y *.bmp. Lang será el nombre del lenguaje (automáticamente convierte a mayúscula la primera letra y a minúscula el resto). Image debe ser un bmp que se utilizará para crear por ejemplo banderas en el menú automático de lenguajes.

Los nombre de archivos creados son generados por un método especial para evitar problemas con el sistema operativo y ayudar a impedir que el usuario final edite los mismos.

El nuevo lenguaje se incorpora a la Registry.

RegisterLanguages

Registra en la Registry todos los lenguajes que encuentra en la carpeta indicada en DicPath.

DeleteLanguage(Lang: String)

Borra por completo un lenguaje dado, tanto los archivos como la entrada en la Registry.

SetItem(Section, Item, Value: String)

Coloca el valor para la Sección e ítem elegidos para el lenguaje actual.

SetImage(Image: TBitMap)

Coloca la imagen para el lenguaje actual Image. Esta imagen se utiliza en los menú de idiomas.

AddToDictionaries(Section, Item, Value: ShortString)

Agrega la sección, ítem y valor a todos los lenguajes. Si se define un ítem existente no se le cambiará el valor con este procedimiento. Use para ello SetItem(). Si la sección o el ítem ya existen no se agregan nuevamente.

Por defecto, un nuevo ítem tomará el valor igual al ítem.

DeleteDictionaryItem(Section, Item: String)

Borra un determinado ítem de la sección indicada para todos los lenguajes.

DeleteDictionarySection(Section: String)

Borra una determinada sección de todos los lenguajes.

SetGetAllProperties(Sender: Tobject; Lang: String; Write: Boolean; NoLocalize: TStrings)

Este procedimiento en realidad no debe utilizarse directamente. Es llamado internamente por el Client.

 

 

Funciones

 

Msg(Message: String; Values: Array of String): String

Esta función devuelve un string que se forma con Message y donde Message tiene variables serán reemplazadas por Values.

Ej. Mensaje := Msg(‘Today is “%1” at “%2” hours’, [DateToStr(Date), TimeToStr(Time)]);

Si Language fue preparado así: Ahora son las “%2” del “%1”, entonces la función devolverá el mensaje final con los parámetros invertidos.

GetLanguageFileName(Language: String): String

Esta función devuelve el nombre y Path del archivo del lenguaje indicado.

GetString(Section, Item: String): String

Devuelve el string que representa el valor de una propiedad para la sección e ítem indicados. Esto ocurre para el lenguaje actual.

GetClients: TStringList

Devuelve los Clients conectados a este Server.

GetSections(List: TStrings): Boolean

Trae en List todos los nombres de las secciones que forman un diccionario de lenguajes (Captions, Text, etc.). Devuelve true si pudo leer la lista y false si falló.

GetActualImage(Image: TBitMap): Boolean

Trae en Image la imagen bmp para el lenguaje actual. Si encuentra la imagen adecuada devuelve true. Si no hay una imagen definida o no la encuentra traerá una imagen vacía y devuelve false.

GetItem(Section, Item: String): String

Devuelve el valor (string) correspondiente a la Section e Item enviados. Si no es encontrado el valor devuelve un string vacío.

GetItems(Section: String; List: TStrings): Boolean

Trae en List todos los ítem para una sección dada. Devuelve True si lo logró o False si falló.

 

 

Eventos

 

OnLanguageChange: TNotifyEvent

Ocurre cuando se cambia de lenguaje durante la ejecución de la aplicación.

OnLanguageMenuClick: TNotifyEvent

Ocurre cuando el Usuario Final hace click en una opción del sub menú de idiomas. Para ello, debe haberse llamado a CreateLanguageMenu() con anterioridad, habitualmente en el comienzo de OnFormShow.

Si hace TmenuItem(Sender).Caption dentro de este evento obtendrá el lenguaje elegido por el Usuario.

 

Propiedades, Métodos y Eventos (Client)

 

Propiedad

Descripción

LocalizeServer

Elija aquí el Server al cual conectará el Client.

NoLocalize

Aquí se define una lista de componentes (nombres) en este Form cuyos string no deben ser traducidos (Excepciones).

 

 

Procedimientos

 

SetGetAllProperties

Escribe todos los string en los diccionarios si Server.Active es True y Server.Language es Default.

Lee y carga los string desde el Lenguaje seleccionado a los componentes (Traduce).

Este procedimiento habitualmente se coloca en OnShow para Forms, BeforePrint en el caso de QuickReport. No se suele usar en DataModules. Un DataModule no muestra nada pero puede utilizar la función msg para traducir mensajes.

Si se cambia el lenguaje utilizado “on fly” entonces no hará falta llamar a este método para los Forms ya creados. Al cambiar el lenguaje, automáticamente se produce un barrido de todos los Clients y se llama a este procedimiento en forma automática.

PutListProperty(List, ViewList: TStringList)

Este procedimiento permite traducir listas como en el caso de los memos de FastReport.

Por ejemplo, en el caso de FastReport se puede utilizar en OnBeforePrint donde List = Memo y ViewList = View.Memo.

 

 

Funciones

 

Msg(Message: String; Values: Array of String): String

Esta función devuelve un string que se forma con Message y donde Message tiene variables serán reemplazadas por Values.

Ej. Mensaje := Msg(‘Today is “%1” at “%2” hours’, [DateToStr(Date), TimeToStr(Time)]);

Si Language fue preparado así: Ahora son las “%2” del “%1”, entonces la función devolverá el mensaje final con los parámetros invertidos.

GetString(Section, Item: String): String

Dada una sección de los diccionarios (Caption, Text, etc) y un Ítem (Por ejemplo: Button1) devolverá la traducción para el lenguaje actual.

 

 

Instalación

 

Para instalar este paquete en Delphi 6, siga los siguientes pasos:

 

*  Descomprima el .zip del paquete en una carpeta.

*  Abra Delphi.

* Elija la opción del menú: Tools | Environment Options | Library y agregue en Library Path el Path a la carpeta que ha creado para Localize.

*  Haga File | Open y elija ASFLocalize.dpk.

*  Haga Click en Compile y luego en Install.

* Aparecerán dos advertencias. Esto es porque el paquete instala en forma implícita dos unidades. No se preocupe.

*  Ya puede comenzar a utilizar ASFLocalize.

* Recuerde que hay cinco carpetas que se han creado donde Usted instaló ASFLocalize que son de mucha ayuda. En Demo encontrará un proyecto que permite ver como trabaja ASFLocalize y en Editor encontrará un editor de lenguajes, que además de ayudar a entender como se utilizan los métodos y propiedades funciona para editar. En Help podrá acceder a toda la ayuda en inglés y español. En Languages encontrará que están los archivos de lenguaje para la demo. En Images encontrará algunas banderas para utilizar.

* Cuando tiene todo instalado, comience por llamar al editor y definir la carpeta de lenguajes a Languages para que luego pueda funcionar la demo. Haga luego Languages | Refresh Languages, esto registra los lenguajes encontrados. También puede seguir los tres pasos indicados en la demo (esto es lo más fácil para comenzar).

 

Nota: Esperamos que nos comunique cualquier tipo de problema que encuentre en AsfLocalizer. También esperamos ansiosos sus propuestas para mejorar nuestros componentes.

 

Licencia

 

Lea con cuidado el archivo Readme.txt que acompaña nuestro paquete.

 

 

Como contactarnos

 

Site:         http://www.asfcompu.com

Email:       Shareware@asfcompu.com