8 de diciembre de 2013
Los tesoros de Tamar
Quienes conocen a Tamar E. Granor, seguramente la conocen por sus amplios conocimientos y experiencia como desarrolladora, conferenciante y autora de libros y artículos sobre Visual FoxPro. Ella tiene en su sitio web un gran tesoro para cualquier desarrollador VFP: Cientos de artículos y documentos técnicos de sesiones de conferencias y charlas, con ejemplos incluídos, para descargar libremente!!!
Para quienes no la conocen, Tamar E. Granor es propietaria de Tomorrow's Solutions, LLC, una consultora y desarrolladora de numerosas aplicaciones para grandes y pequeñas empresas, y también para organizaciones sin ánimo de lucro, ubicada en Pensilvania, Estados Unidos de América.
Ella trabaja desde 1988 con FoxBase, FoxPro y principalmente con Visual FoxPro. Tamar es autora y co-autora de muchos libros (entre los mas destacados: Hacker’s Guide to Visual FoxPro, Microsoft Office Automation with Visual FoxPro y Taming Visual FoxPro’s SQL) y cientos de artículos acerca de Visual FoxPro. También es habitual oradora en numerosas conferencias y grupos de usuarios. FueMicrosoft Visual FoxPro Most Valuable Professional (Profesional Mas Valioso de Microsoft Visual FoxPro) desde el año 1993 hasta el año 2010. En 2007 recibió el Visual FoxPro Community Lifetime Achievement Award (Premio a la Trayectoria de Comunidad Visual FoxPro). Tamar es también socia de Geek Gatherings patrocinadora de las conferencias anuales Southwest Fox y Southwest Xbase++.
Los Tesoros de Tamar se encuentran en el sitio Web de su empresa, en el ítem Publications.
Los enlaces directos para descargar libremente sus publicaciones son:
Todas las publicaciones están en Inglés, pero si aun no dominan este idioma, es una buena excusa para aprender, al menos los términos técnicos, y aprovechar toda la información que fue escribiendo Tamar en su larga carrera. Aparte también estan para descargar los ejemplos en código VFP de las distintas sesiones publicadas.
Gracias Tamar por tu gran generosidad con la comunidad de Visual FoxPro.
A aprovechar este tesoro para nuestro Zorro.!!!
6 de diciembre de 2013
Control separador para Visual FoxPro
Artículo original: Splitter Class for Visual FoxPro
http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,cbfe9ce7-8b19-4374-8c52-132a853ef7b3.aspx
Autor: Craig Boyd
Traducido por: Ana María Bisbé York
Muchos lenguajes tienen algún tipo de control separador (splitter), ¿porqué Visual FoxPro no? Para ser justos, he visto algunas clases dando vueltas de tiempo en tiempo; pero pensé que podría intentar echar una mano en esto. Estaba convencido en que no sería muy difícil y Visual FoxPro no me ha defraudado. Más abajo aparece el enlace para la descarga de la biblioteca de clases en la que he colocado mi separador (basada en shape) y un formulario de ejemplo que muestra cómo se utiliza la clase (he tomado una imagen de la pantalla para que pueda ver el aspecto que tiene). Ahora, si desea intentar utilizar esta clase fuera puede que tenga algunos problemas para descargarla. He creado además un ejemplo de ejecución cortar y pegar que podrá encontrar justo a continuación de la imagen de la pantalla. Este control separador está diseñado para trabajar con Visual FoxPro 9.0. Si está utilizando versiones previas entonces, necesitará modificar / eliminar algunas cosas.
Descarga de Splitter.vcx y formulario de ejemplo (8 KB aprox.): http://www.sweetpotatosoftware.com/files/splitter.zip
http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,cbfe9ce7-8b19-4374-8c52-132a853ef7b3.aspx
Autor: Craig Boyd
Traducido por: Ana María Bisbé York
Muchos lenguajes tienen algún tipo de control separador (splitter), ¿porqué Visual FoxPro no? Para ser justos, he visto algunas clases dando vueltas de tiempo en tiempo; pero pensé que podría intentar echar una mano en esto. Estaba convencido en que no sería muy difícil y Visual FoxPro no me ha defraudado. Más abajo aparece el enlace para la descarga de la biblioteca de clases en la que he colocado mi separador (basada en shape) y un formulario de ejemplo que muestra cómo se utiliza la clase (he tomado una imagen de la pantalla para que pueda ver el aspecto que tiene). Ahora, si desea intentar utilizar esta clase fuera puede que tenga algunos problemas para descargarla. He creado además un ejemplo de ejecución cortar y pegar que podrá encontrar justo a continuación de la imagen de la pantalla. Este control separador está diseñado para trabajar con Visual FoxPro 9.0. Si está utilizando versiones previas entonces, necesitará modificar / eliminar algunas cosas.
Descarga de Splitter.vcx y formulario de ejemplo (8 KB aprox.): http://www.sweetpotatosoftware.com/files/splitter.zip
*!* Corte y pegue este código a un archivo prg y ejecútelo para ver *!* y tratar de trabajar con un ejemplo de la clase splitter PUBLIC oform1 oform1=NEWOBJECT("form1") oform1.SHOW RETURN ************************************ DEFINE CLASS form1 AS FORM ************************************ DOCREATE = .T. CAPTION = "Ejemplo de Separador" NAME = "Form1" MDIFORM = .T. AUTOCENTER = .T. ADD OBJECT text1 AS TEXTBOX WITH ; Anchor = 11, ; HEIGHT = 29, ; LEFT = 0, ; TOP = 0, ; WIDTH = 375, ; NAME = "Text1" ADD OBJECT edit1 AS EDITBOX WITH ; Anchor = 7, ; HEIGHT = 217, ; LEFT = 0, ; TOP = 33, ; WIDTH = 184, ; NAME = "Edit1" ADD OBJECT edit2 AS EDITBOX WITH ; Anchor = 15, ; HEIGHT = 217, ; LEFT = 188, ; TOP = 33, ; WIDTH = 187, ; NAME = "Edit2" ADD OBJECT splitter1 AS splitter WITH ; TOP = 32, ; LEFT = 183, ; HEIGHT = 219, ; WIDTH = 6, ; Anchor = 7, ; NAME = "Splitter1" ADD OBJECT splitter2 AS splitter WITH ; TOP = 28, ; LEFT = 0, ; HEIGHT = 6, ; WIDTH = 376, ; Anchor = 10, ; vertical = .F., ; minimumsize = 29, ; NAME = "Splitter2" PROCEDURE INIT THIS.text1.VALUE = "Visual FoxPro Rocks!" THIS.Edit1.VALUE = "Visual FoxPro es una herramienta de desarrollo extremadamente " + ; "versátil. No sólo le permite al desarrollador crear buenas aplicaciones centradas " + ; "en datos, permite además, extender el lenguaje actual con nuevas clases, bibliotecas " + ; "de código, y ganchos. Si es un desarrollador Visual FoxPro tan ávido como yo " + ; "esto es bueno para usted. Y si no, entonces le invito a que tome Visual FoxPro " + ; "y lo intente. No se arrepentirá" THIS.Edit2.VALUE = "Este es un ejemplo de una clase de control separador para " + ; "utilizar en formularios Visual FoxPro 9.0. " + ; "Esto es Visual FoxPro puro, no hay ActiveX adicionales o dependencias a DLL " + ; "que le preocupen durante la distribución de su aplicación. Para verlo en " + ; "acción, mueva los separadores horizontal y vertical de un lado a otro dentro " + ; "de este formulario. Además, al redimensionar el formulario puede ver que va " + ; "a funcionar la nueva propiedad Anchors de Visual FoxPro 9.0." ENDPROC ENDDEFINE ************************************ DEFINE CLASS splitter AS SHAPE ************************************ HEIGHT = 182 WIDTH = 8 MOUSEPOINTER = 9 SPECIALEFFECT = 0 STYLE = 0 NAME = "splitter" mousedownat = 0 && Hace seguimiento de los movimientos del ratón && y permite que la clase ignore los movimientos && causados al redimensionar el formulario vertical = .T. && Hacer = .F. para splitter horizontal minimumsize = 40 && Esto es cuán pequeño (en pixels) pueden && ser los paneles cuando se mueve el splitter PROCEDURE MOUSELEAVE LPARAMETERS nButton, nShift, nXCoord, nYCoord THIS.mousedownat = 0 ENDPROC PROCEDURE MOVE LPARAMETERS nLeft, nTop, nWidth, nHeight *!* Si desea mover el splitter en tiempo de ejecución y hacer que mueva los otros controles *!* entonces haga que mousedownat != 0 y llame al método move del spiltter *!* recuerde restablecer mousedownat = 0 cuando ha terminado de mover el splitter LOCAL loControl, llLockScreenWas, lnMovement, llIsSplitter, lcUniqueTag, lnMarginOfError, lnAnchorWas IF THIS.MouseDownAt == 0 DODEFAULT(m.nLeft, m.nTop, m.nWidth, m.nHeight) RETURN ENDIF m.loControl = NULL *!* La siguiente etiqueta puede ser colocada en controles que no desea MOVER m.lcUniqueTag = "DoN't_MoVe_SpLiT" && Es algo que garantiza muy bien de que sea único THIS.TAG = m.lcUniqueTag m.llLockScreenWas = THISFORM.LOCKSCREEN && En este caso la pantalla está bloqueada THISFORM.LOCKSCREEN = .T. m.lnMovementLeft = m.nLeft - THIS.LEFT m.lnMovementTop = m.nTop - THIS.TOP FOR EACH m.loControl IN THIS.PARENT.CONTROLS IF m.loControl.TAG = lcUniqueTag && Es el control splitter, entonces regresamos al inicio del lazo LOOP ENDIF IF PEMSTATUS(m.loControl,"Anchor",5) m.lnAnchorWas = m.loControl.Anchor m.loControl.Anchor = 0 m.llIsSplitter = m.loControl.CLASS = "Splitter" IF THIS.vertical && Vertical Splitter lnMarginOfError = INT(THIS.WIDTH/2) && En este caso el desarrollador lleva el splitter demasiado cerca IF m.loControl.LEFT <= THIS.LEFT && El control está a la izquierda del splitter IF (m.loControl.LEFT + m.loControl.WIDTH) <= (THIS.LEFT + lnMarginOfError) AND !m.llIsSplitter m.loControl.WIDTH = MAX(m.loControl.WIDTH + m.lnMovementLeft, 0) ENDIF ELSE && El control está a la derecha del splitter IF !m.llIsSplitter m.loControl.WIDTH = MAX(m.loControl.WIDTH - m.lnMovementLeft, 0) ENDIF m.loControl.LEFT = m.loControl.LEFT + m.lnMovementLeft ENDIF ELSE && Horizontal Splitter lnMarginOfError = INT(THIS.TOP/2) && En este caso el desarrollador lleva el splitter demasiado cerca IF m.loControl.TOP <= THIS.TOP && El control está encima del splitter IF (m.loControl.TOP + m.loControl.HEIGHT) <= (THIS.TOP + lnMarginOfError) AND !m.llIsSplitter m.loControl.HEIGHT = MAX(m.loControl.HEIGHT + m.lnMovementTop, 0) ENDIF ELSE && El control está debajo del splitter IF !m.llIsSplitter m.loControl.HEIGHT = MAX(m.loControl.HEIGHT - m.lnMovementTop, 0) ENDIF m.loControl.TOP = m.loControl.TOP + m.lnMovementTop ENDIF ENDIF m.loControl.Anchor = m.lnAnchorWas ENDIF NEXT m.lnAnchorWas = THIS.Anchor THIS.Anchor = 0 DODEFAULT(m.nLeft, m.nTop, m.nWidth, m.nHeight) && Finalmente mueve el splitter THIS.Anchor = m.lnAnchorWas THISFORM.LOCKSCREEN = m.llLockScreenWas THIS.TAG = "" ENDPROC PROCEDURE MOUSEMOVE LPARAMETERS nButton, nShift, nXCoord, nYCoord LOCAL lnMovement IF m.nButton = 1 AND !(THIS.mousedownat == 0) IF THIS.vertical IF m.nXCoord != THIS.mousedownat m.lnMovement = m.nXCoord - THIS.mousedownat IF BETWEEN(THIS.LEFT + m.lnMovement, THIS.minimumsize, THIS.PARENT.WIDTH - THIS.WIDTH - THIS.minimumsize) THIS.MOVE(THIS.LEFT + m.lnMovement, THIS.TOP, THIS.WIDTH, THIS.HEIGHT) THIS.mousedownat = m.nXCoord ENDIF ENDIF ELSE && Horizontal IF m.nYCoord != THIS.mousedownat m.lnMovement = m.nYCoord - THIS.mousedownat IF BETWEEN(THIS.TOP + m.lnMovement, THIS.minimumsize, THIS.PARENT.HEIGHT - THIS.HEIGHT - THIS.minimumsize) THIS.MOVE(THIS.LEFT, THIS.TOP + m.lnMovement, THIS.WIDTH, THIS.HEIGHT) THIS.mousedownat = m.nYCoord ENDIF ENDIF ENDIF ENDIF ENDPROC PROCEDURE MOUSEDOWN LPARAMETERS nButton, nShift, nXCoord, nYCoord IF THIS.vertical THIS.mousedownat = nXCoord ELSE THIS.mousedownat = nYCoord ENDIF ENDPROC PROCEDURE INIT IF !THIS.vertical THIS.MOUSEPOINTER = 7 && NS ENDIF ENDPROC PROCEDURE MOUSEUP LPARAMETERS nButton, nShift, nXCoord, nYCoord THIS.mousedownat = 0 ENDPROC ENDDEFINE
24 de noviembre de 2013
Enumerar las voces instaladas en la PC
Con el siguiente código se pueden enumerar y escuchar las distintas voces instaladas en la PC a traves de la API de Microsoft Speech (SAPI).
LOCAL lnVoces, lcVoz, ln, lc LOCAL loVoz AS "SAPI.SpVoice" m.loVoz = CREATEOBJECT("SAPI.SpVoice") m.lnVoces = m.loVoz.GetVoices().COUNT FOR m.ln = 1 TO m.lnVoces m.lcVoz = m.loVoz.GetVoices().ITEM(ln-1).GetDescription m.loVoz.Voice = m.loVoz.GetVoices().ITEM(ln-1) m.lc = "Voz número " + TRANSFORM(m.ln) + " de " + TRANSFORM(m.lnVoces) + ": " + m.lcVoz ? m.lc m.loVoz.Speak(m.lc) ENDFOR
4 de noviembre de 2013
Copias de seguridad de bases de datos MySQL / MariaDB con VFP
Autor: Antonio L. Montagut
www.ontarioxb.es
El tema de las copias de seguridad se ha comentado bastante, e incluso he visto varias soluciones muy funcionales creando archivos (.BAT). Y ejecutarlos a una hora determinada con el programador de tareas de Windows.
La solución que aquí voy a proponer, es el poder realizar las copias de seguridad bajo entorno de desarrollo de VFPx. Que nuestros ejecutables tengan esa posible opción de menú.
Para este propósito necesitamos dos archivos ejecutables que van a hacer posible este hecho:
Haremos que nuestro programa cree un archivo (.BAT), que se ejecute, e incluso vaya marcando el tiempo que dura la copia de seguridad. Para eso utilizaremos la técnica del switch con dos ficheros de texto que también crearemos nosotros a nuestra conveniencia. Serán los archivos NO.sw y Si.sw.
Daremos por sentado algunos parámetros:
- Primer paso: Eliminar los archivos de switch SI.sw y No.sw y crear el archivo NO.sw.
Creamos un archivo (.BAT), pasamos unos parámetros que podemos capturar de un formulario.
Lo lanzamos con el ShellExecute pero sin espera, eso quiere decir que nuestra aplicación VFPx se sigue ejecutando, pero la "encerramos" dentro de un DO ... ENDDO, donde cada segundo va marcando el tiempo transcurrido hasta que existe el archivo SI.sw , y provocamos la salida del bucle. Esto solo se va a producir cuando se llegue a la última orden del fichero (.BAT).
Quería utilizar el 7za.exe como compresor de copia, pero no admite recibir órdenes en "tubería |". Como si ocurre con el gzip.exe
Recomiendo encarecidamente leer tanto la ayuda del mysqldump.exe así como la ayuda del gzip.exe.
Así es como quedaría sustituyendo el WAIT WINDOW por un label en el _SCREEN:
Antonio L. Montagut
www.ontarioxb.es
El tema de las copias de seguridad se ha comentado bastante, e incluso he visto varias soluciones muy funcionales creando archivos (.BAT). Y ejecutarlos a una hora determinada con el programador de tareas de Windows.
La solución que aquí voy a proponer, es el poder realizar las copias de seguridad bajo entorno de desarrollo de VFPx. Que nuestros ejecutables tengan esa posible opción de menú.
Para este propósito necesitamos dos archivos ejecutables que van a hacer posible este hecho:
- mysqldump.exe Este ejecutable va incluido en la subcarpeta (bin) de la instalación de nuestro servidor de base de datos MySQL / MariaDB
- gzip.exe Un compresor tipo 7zip, winrar, que proviene del mundo Linux, pero que existe una versión para Windows y se puede descargar del siguiente link:http://gnuwin32.sourceforge.net/downlinks/gzip-bin-zip.php
Haremos que nuestro programa cree un archivo (.BAT), que se ejecute, e incluso vaya marcando el tiempo que dura la copia de seguridad. Para eso utilizaremos la técnica del switch con dos ficheros de texto que también crearemos nosotros a nuestra conveniencia. Serán los archivos NO.sw y Si.sw.
Daremos por sentado algunos parámetros:
- C:\ - Es la unidad donde tenemos instalada nuestra aplicación.
- C:\MIAPP - El directorio donde está instalada nuestra aplicación
- C:\MIAPP\MYSQL - El Directorio donde tenemos copiados los archivos: mysqldump.exe y gzip.exe
- Primer paso: Eliminar los archivos de switch SI.sw y No.sw y crear el archivo NO.sw.
DELETE FILE C:\MIAPP\SI.sw DELETE FILE C:\MIAPP\NO.sw STRTOFILE("000","C:\MIAPP\NO.sw")- Segundo Paso: Crear nuestro archivo (.BAT) con macro sustitución:
RELEASE chost, cuser,cpass, cport, cbasedat, cdirdest, cfiledest, ccadena LOCAL chost, cuser, cpass, cport, cbasedat, cdirdest, cfiledest LOCAL ccadena as MEMO chost="127.0.0.1" && local cuser="usuario" && Usuario de MySQL con los privilegios adecuados cpass="password" && Password del Usuario de MySQL. cport="3306" && Puerto por defecto del servidor MySQL cbasedat="mibd" && Nombre de la base de datos MySQL que vamos a realizar backup cdirdest="C:\DIRBKP\" && Directorio de destino del Backup cfiledest="BKP_"+DTOS(DATE()) && Nombre del archivo de destino TEXT TO ccadena TEXTMERGE NOSHOW C: CD\MIAPP\MYSQL mysqldump -h <<chost>> -u <<cuser>> –p<<cpass>> -P <<cport>> -F -f -B --order-by-primary --opt <<cbasedat>> | gzip -v -9 > <<cdirdest>><<cfiledest>>.sql.gz C:: CD\MIAPP COPY NO.sw SI.sw ENDTEXT STRTOFILE(ALLTRIM(ccadena),"C:\MIAPP\BKP.BAT") DECLARE INTEGER ShellExecute IN Shell32.dll ; INTEGER hndWin, STRING cAaction, STRING cFileName, STRING cParams, STRING cDir, INTEGER nShowWin ShellExecute(0,"","C:\MIAPP\BKP.BAT","","",0) nSEG=SECONDS() DO WHILE .T. WAIT WINDOW "Transcurridos : "+ALLTRIM(STR(SECONDS()-nSEG,06,00))+" Segundos" TIMEOUT 01 IF FILE("C:\MIAPP\SI.sw")=.T. EXIT ENDIF ENDDO WAIT WINDOW "Transcurridos : "+ALLTRIM(STR(SECONDS()-NSECONDS,06,00))+" Segundos" NOWAITEl truco es el siguiente:
Creamos un archivo (.BAT), pasamos unos parámetros que podemos capturar de un formulario.
Lo lanzamos con el ShellExecute pero sin espera, eso quiere decir que nuestra aplicación VFPx se sigue ejecutando, pero la "encerramos" dentro de un DO ... ENDDO, donde cada segundo va marcando el tiempo transcurrido hasta que existe el archivo SI.sw , y provocamos la salida del bucle. Esto solo se va a producir cuando se llegue a la última orden del fichero (.BAT).
Quería utilizar el 7za.exe como compresor de copia, pero no admite recibir órdenes en "tubería |". Como si ocurre con el gzip.exe
Recomiendo encarecidamente leer tanto la ayuda del mysqldump.exe así como la ayuda del gzip.exe.
Así es como quedaría sustituyendo el WAIT WINDOW por un label en el _SCREEN:
Antonio L. Montagut
28 de octubre de 2013
Ventajas y desventajas del uso de formularios basados en VCX o SCX
Autor: Drew Speedie
Traducido por: Ana María Bisbé York
Formularios basados en VCX: VENTAJAS
Espero que les haya resultado de utilidad.
Saludos,
Ana María Bisbé York
Traducido por: Ana María Bisbé York
Fragmento de la sesión VFP Tips and Tricks presentada por el autor en la Conferencia DevEssentials Kansas, 2004Existen ventajas y desventajas para crear/guardar formularios VFP en .SCXs o .VCXs. He aquí algunas de ellas:
Formularios basados en VCX: VENTAJAS
- Fácilmente subclaseable
- Muchos formularios pueden estar contenidos en un fichero VCX/.VCT (desventaja para desarrollo en grupos)
- Posibilidad de utilizar propiedades y métodos protegidos (Protected) y ocultos (Hidden)
- Puede sustituir una subclase DataEnvironment definida por el usuario (programa .PRG) en tiempo de ejecución.
- Control completo sobre la apertura de tablas/vistas
- No puede utilizar DataEnvironment visual nativo
- Como no puede utilizar DataEnvironment visual nativo, debe llenar manualmente las propiedades ControlSources y RecordSources
- Más dificultad para ejecutar/probar, son necesarios 2 ó 3 comandos
- No existe una vía directa para devolver un valor de un formulario modal
- No tiene disponible el Asistente de formulario (de todas formas no recomendamos utilizar asistentes nativos...)
- Si varios formularios están contenidos en una librería .VCX/.VCT, el desarrollo en equipo se hace más difícil, debido a que es más complicado que más de un desarrollador trabajen con formularios diferentes guardados en el mismo archivo .VCX
- Puede utilizar DataEnvironment visual nativo
- Si se utiliza DataEnvironment, puede llenar ControlSources y RecordSources a través de los cuadros desplegables
- Es fácil de ejecutar/probar, con un comando o con la opción Ejecutar en la barra de herramientas estándar.
- Una vía simple, directa para devolver un valor de un formulario modal.
- Puede sustituir una subclase DataEnvironment definida por el usuario (programa .PRG) en tiempo de ejecución.
- Tiene disponible el Asistente de formulario (de todas formas no recomendamos utilizar asistentes nativos...)
- El desarrollo en equipo es menos problemático porque cada formulario está siempre guardado en su propio archivo .SCX/.SCT
- Un poco más difíciles de subclasear; la intención es utilizarlo en el nivel instanciado.
- Sólo un formulario por archivo .SCX/.SCT (muchos archivos individuales), pero puede ser una ventaja en el desarrollo de proyectos en equipo (vea arriba)
- No se pueden utilizar propiedades y métodos protegidos (Protected) y ocultos (Hidden)
- No existe control real sobre la apertura de tablas/vistas en el DataEnvironment (aunque, si lo desea, lo puede realizar en el Form.Load(); pero perderá los beneficios de utilizar un DataEnvironment nativo, mientras tiene otros ventajas de formularios basados en SCX)
- Crea un formulario basado en .SCX
- Agregue cursores al DataEnvironment – estos cursores nunca serán abiertos en tiempo de ejecución, así sean tablas/vistas cuando estás utilizando objetos de negocio o DataEnvironment de usuario.
- Establecer la propiedad DataEnvironment.AutoCloseTables a .F.
- Establecer la propiedad DataEnvironment.AutoOpenTables a .F.
- Establecer manualmente el entorno de datos:
- Agregar código manual en el Form.Load()
- Agregar código en el Form.Load() para el lazo entre el DataEnvironment (ignorado en tiempo de ejecución) y ejecutar el código equivalente al objeto Cursor y sus propiedades en los objetos Relation.
- Implementar su objeto DataEnvironment sustituto/de usuario
- Liberar el control de los datos a su objeto de negocio
Espero que les haya resultado de utilidad.
Saludos,
Ana María Bisbé York
7 de octubre de 2013
Visual FoxPro y la optimización Rushmore
Articulo original: Visual FoxPro y la optimización Rushmore
Publicado en: UTMag/Rapozine http://www.UniversalThread.com/Magazine
Autor: Carlos Alejandro Pérez (Resistencia, Chaco, Argentina) QEPD - 26/07/1965 - 30/06/2021
Publicado en: UTMag/Rapozine http://www.UniversalThread.com/Magazine
Autor: Carlos Alejandro Pérez (Resistencia, Chaco, Argentina) QEPD - 26/07/1965 - 30/06/2021
La optimización
Mucho se ha escrito de la optimización Rushmore, característica inconfundible de FoxPro. Muchos programadores, incluso sin conocer profundamente a FoxPro, intuyen que es algo que tiene que ver con los índices, algo que acelera las consultas.
Pues entonces ¿qué es precisamente la optimización Rushmore? Podríamos decir, por ahora, que es la utilización de los índices para acelerar la recuperación de datos. Dicho así, nos quedamos con gran cantidad de preguntas sin respuestas.
Para entender un poco cómo funciona esto, demos un poco de base teórica la que seguramente no nos vendrá mal. Quizás algunas partes sean un poco difíciles de entender, pero por lo menos los conceptos al final de cada punto serán igualmente útiles para el lector. Tampoco espere el lector que se toquen todos los aspectos de Rushmore, debido a que Microsoft - como haría cualquier otro fabricante - no da mayores detalles de su arquitectura interna.
Jerarquía de almacenamiento
La jerarquía de almacenamiento se refiere a las distintas capas que tiene una computadora para almacenar información. En base de datos, la jerarquía es:
- Memoria RAM física. Poca capacidad (menor que 2 GB), gran velocidad (10ns). Volátil.
- Medio magnético de acceso aleatorio. Normalmente es un disco rígido. Capacidad intermedia (unos 50 GB), velocidad media (7 ms). No volátil.
- Medio magnético de acceso secuencial. Normalmente es una unidad de cinta DLT, DAT, etc. Gran capacidad (centenares de gigabytes) velocidad lenta (del orden de segundos a minutos). No volátil.
Por lo tanto, decimos lo siguiente: las bases de datos operan en la jerarquía 1 y 2. En la 1 se efectúa el PROCESO, en la 2 el ALMACENAMIENTO. De esto se deduce fácilmente que para que exista el PROCESO, debe transferirse información desde la jerarquía 2 a la 1, y viceversa. Volveremos sobre estos conceptos más adelante.
Modelo relacional
Como los sistemas de información hasta comienzos de los 70s eran propietarios, y sus datos se almacenaban en formatos también propietarios, se consumían muchas horas-hombre en alterar la funcionalidad de un sistema, ya que no existía una separación clara entre el programa y los datos.
Se necesitaba lo que se conoce como "independencia de datos", es decir, el programa debía estar protegido de los cambios que pudiesen haber en los datos. Para ello era claro que además del programa se necesitaba algo que estuviese separado del mismo: una base de datos. La base de datos provee independencia física, porque no importa cómo esté almacenada la información, ni el tamaño de las páginas, ni sobre qué soporte , el programa sigue viendo de la misma forma a los datos. También provee cierta independencia lógica, ya que el hecho de agregar columnas o procedimientos almacenados no debe influir sobre el programa preexistente (esto no es cierto, obviamente, si quitamos columnas, etc.).
Hasta esa época, los procesos en COBOL actuaban sobre archivos parecidos a los de texto, pero algunos usaban delimitadores especiales entre campos, otros utilizaban mecanismos de direccionamiento para saber dónde comenzaba y finalizaba cada campo, etc. Cada uno de estos mecanismos tenía limitaciones.
Ahora bien ¿qué es un modelo? Es un conjunto de conceptos utilizados para describir datos. ¿Y por qué relacional? Porque está basado en la teoría de conjuntos, donde el término "relación" se aplica a una asociación entre dos o más elementos de un conjunto. O sea una tabla.
El modelo relacional está basado en "tablas", las cuales son "relaciones". Esto debe quedar bien claro: las tablas son las relaciones. Cada tabla está compuesta de filas y columnas. Repitamos mentalmente: las tablas son relaciones. "Tabla" y "relación" son sinónimos.
La famosa "relationship" entre dos o más tablas NO es la relación que da el nombre al modelo relacional. Para eso, se utilizará el término vínculo, porque en español la traducción de "relation" y "relationship" conduce desafortunadamente a la misma palabra "relación". Por ello, la comunidad de habla hispana adoptó otros términos para referirse a "relationship", el más aceptado es "vínculo". Recordemos, pues, que el "modelo relacional" se llama así porque las tablas son relaciones.
El modelo exige que cada tabla debe necesariamente tener una clave. ¿Qué es una clave? Es el conjunto mínimo de columnas de la tabla que definen unívocamente la existencia de una fila. Por ejemplo, en una tabla PADRON la clave sería DNI, en una tabla ARTICULOS la clave sería (codigo_rubro,codigo_articulo), y así sucesivamente. Nótese que debe el conjunto "mínimo". En nuestra tabla PADRON, las columnas DNI y NOMBRE también definirían unívocamente la existencia de una fila, pero no sería un conjunto mínimo. Por esto se dice que DNI y NOMBRE no son una clave, sino una "superclave". En modelo relacional, las superclaves deben ser evitadas.
Las claves primarias, las candidatas, todas son claves. De esto se desprende que no pueden existir en el modelo relacional claves que sean repetidas, porque la definición prohibe esto. La clave primaria sería nuestro índice principal en VFP, la candidata nuestro índice candidato en VFP.
Esto deriva en una consecuencia insospechada: como dijimos recién, en el modelo relacional no es posible que los campos que conforman la clave se repitan. Si lo pensamos un poquito, esto da como corolario que que ninguna tabla puede tener dos filas idénticas.
Pero nosotros, viejos programadores de FoxPro, sabemos que esto no es así, que muchos de nuestros sistemas tienen filas duplicadas, y que muchas tablas tienen los campos clave duplicados. ¿Qué estará pasando? Lo vemos un poco más adelante.
El álgebra relacional
¿Por qué tanto alboroto con el modelo relacional? Porque era la primera vez que se describía una estructura de datos basándose en modelos matemáticos precisos. Como las tablas son "relaciones", las operaciones entre esas relaciones formó el llamado "álgebra relacional".
A ver si entendemos: así como existe una operación de suma para los números en el álgebra común, existe una operación de unión de tablas para el álgebra relacional. El álgebra común opera con números, el álgebra relacional opera con tablas. Así como el álgebra relacional devuelve resultados que son otros números, el álgebra relacional devuelve resultados que son otras tablas. Este es un concepto fundamental: los resultados del álgebra relacional son siempre tablas.
Entonces, hacia 1973 el modelo estaba completo. Se definieron cinco operaciones básicas para operar con las tablas, que formaron la base del álgebra relacional: selección, proyección, renombrado, reunión y unión. Cada operación actuaba sobre tablas, y devolvía necesariamente otras tablas.
Incluso para que el álgebra tuviese todas la operaciones, se derivó la operación de división entre dos tablas, un tanto exótica porque es la secuencia de varios operadores simples, y se la incluyó para que el modelo del álgebra fuese cerrado y completo (es decir, hubiera siempre una forma de recorrer el camino inverso en una cadena de operaciones, por lo tanto, para una multiplicación entre tablas - producto cartesiano - debería por lo tanto existir la división, etc.)
Si nos fijamos bien, no existe la operación de borrado. En efecto, la operación de borrado no se contempla en el álgebra relacional. Tampoco se contempla el "ordenado". ¿Y entonces?
8 de septiembre de 2013
Documentación de FoxBarcode
FoxBarcode es una clase 100% Visual FoxPro que ofrece una herramienta para la generación de imágenes con distintas simbologías de códigos de barras, para ser usadas en informes y formularios de VFP, o exportadas a otras aplicaciones. Su uso y distribución es libre para toda la Comunidad de Visual FoxPro.
Sitio oficial de FoxBarcode: https://github.com/VFPX/FoxBarCode
Nuevo -> Última versión: 1.19 lanzada el 21/05/2019
Sitio de Descarga: https://github.com/VFPX/FoxBarCode
Características
FoxBarcode soporta las siguientes 18 simbologías lineales de códigos de barras: Código 128, Código 39, Código 39 Extendido (Full ASCII), Código 93, Código 93 Extendido (Full ASCII), Standard 2 de 5, Interleaved 2 de 5, EAN-8, EAN-13, UPC-A, UPC-E (EAN y UPC con suplementos de 2 y 5 dígitos), ITF-14, GS1/EAN/UCC-128, Codabar, Código 11, MSI / Plessey, Telepen, PostNet, RM4SCC, KIX-Code, One Track Pharmacode y Two Track Pharmacode.
FoxBarcode soporta los siguientes tipos de imagenes: JPG, BMP, GIF, PNG y TIFF
FoxBarcode genera las imágenes con la clase gpImage2 (http://sites.google.com/site/gpimage2) de Alexander Golovlev (Rusia) y Cesar Ch. (Brasil), basada en GDI+ y requiere gdiplus.dll.
FoxBarcode permite un gran control en la generación de la imagen del código de barras al poder personalizar las siguientes propiedades:
Ahora se puede validar previamente la cadena a codificar con el método BarcodeTest()
FoxBarcode es compatible con todas las versiones de Visual FoxPro a partir de la versión 6.0
Lenguajes
Gracias a la Comunidad Mundial de VFP, se tradujeron los mensajes de FoxBarcode a los siguientes lenguajes:
El siguiente es un ejemplo de código para generar una imagen tipo "PNG" del código de barras "Código 128 C" con una altura de "100" pixeles y un factor de magnificación de "2":
La imagen generada se muestra a continuación
Otras imágenes de ejemplo cambiando solo algunas propiedades de la clase FoxBarcode
Ahora FoxBarcode soporta el código EAN/UCC/GS1 128
Para incluir un código de barras en un formulario, se debe insertar un objeto Image. Como la imagen del código de barras no existe en tiempo de diseño, la propiedad Picture tomará el nombre de la imagen cuando se llame al método BarcodeImage(), por ejemplo desde el método Refresh de Formulario, como se muestra en la siguiente figura:
Para incluir un código de barras en un Informe, se debe insertar un objeto Image y configurar la propiedad ControlSource con un llamado al método BarcodeImage() y se recomienda configurar "Scale contents, retain shape" si la imagen difiere de tamaño con el cuadro.
NOTA: Antes de ejecutar el informe y crear el objeto FoxBarcode, se debe declarar la variable como PRIVATE para que ésta tenga alcance en el informe, como se muestra a continuación:
Los únicos archivos necesarios que se deben distribuir para que FoxBarcode funcione correctamente son:
Antes de instanciar la clase FoxBarcode, se deben ejecutar las siguientes sentencias:
Demo
En los archivos de la descarga, está incluido un proyecto completo de una aplicación Demo que utiliza FoxBarcode. La siguiente es una captura de pantalla de la aplicación.
La aplicación permite:
Puede leer mas sobre este demo en: Generando códigos de barras con FoxBarcode
¿Quiénes somos?
VFPEncoding es un grupo de desarrolladores pertenecientes a la Comunidad Hispana de Visual FoxPro que creo FoxBarcode. Los miembros de VFPEncoding son:
Sitio oficial de FoxBarcode: https://github.com/VFPX/FoxBarCode
Nuevo -> Última versión: 1.19 lanzada el 21/05/2019
Sitio de Descarga: https://github.com/VFPX/FoxBarCode
Características
FoxBarcode soporta las siguientes 18 simbologías lineales de códigos de barras: Código 128, Código 39, Código 39 Extendido (Full ASCII), Código 93, Código 93 Extendido (Full ASCII), Standard 2 de 5, Interleaved 2 de 5, EAN-8, EAN-13, UPC-A, UPC-E (EAN y UPC con suplementos de 2 y 5 dígitos), ITF-14, GS1/EAN/UCC-128, Codabar, Código 11, MSI / Plessey, Telepen, PostNet, RM4SCC, KIX-Code, One Track Pharmacode y Two Track Pharmacode.
FoxBarcode soporta los siguientes tipos de imagenes: JPG, BMP, GIF, PNG y TIFF
FoxBarcode genera las imágenes con la clase gpImage2 (http://sites.google.com/site/gpimage2) de Alexander Golovlev (Rusia) y Cesar Ch. (Brasil), basada en GDI+ y requiere gdiplus.dll.
FoxBarcode permite un gran control en la generación de la imagen del código de barras al poder personalizar las siguientes propiedades:
- nImageHeight: Altura en pixeles de la imagen.
- nImageWidth: Ancho en pixeles de la imagen. Ahora se puede configurar el ancho
- nAlignBarcode: Alineación del código de barra con respecto a la imagen. [0=Izquierda, 1=Centro y 2=Derecha]
- nResolution: Resolución de la imagén en DPI.
- nRotation: Rotación de la imagen. [0=0°, 1=90°, 2=180°, 3=270°]
- cImageType: Tipo de la imagen generada ["JPG", "GIF", "PNG", "BMP", "TIF"]
- cImageFile: Nombre del archivo de imagen generado. Si no se especifica, se genera un nombre de archivo aleatorio en la carpeta de archivos temporales de Windows.
- cText: Texto a codificar.
- nAlignText: Alineación del texto de la lectura humana. [0=Izquierda, 1=Centro, 2=Derecha]
- lShowHumanReadableText: .T. si se muestra la lectura humana.
- lShowCheckDigit: .T. si se muestra el dígito de control en la lectura humana.
- lShowStartStopChars: .T. si se muestra los caracteres de inicio y final en la lectura humana.
- cFontName: Nombre de la fuente de la lectura humana.
- lFontBold: .T. si la fuente de la lectura humana es Negrita.
- lFontItalic: .T. si la fuente de la lectura humana es Cursiva.
- nFontSize: Tamaño de la letra de la lectura humana. [Recomendado = 8 ó 9]
- nFontColor: Color de la fuente de la lectura humana. [Recomendado = Negro = RGB(0,0,0)].
- nBackColor: Color de fondo de la imagen [Recomendado = Blanco = RGB(255,255,255)].
- nBarsColor: Color de las barras [Recomendado = Negro = RGB(0,0,0)].
- nBarcodeType: Tipo de la simbología de código de barra. Vea la lista de codigos de barra soportados y su Id.
- cSet128 Set: Juego del Código 128. ["A", "B", "C" y "*" (Auto)]
- cSupplementalText: Texto suplementario en códigos EAN y UPC.
- lAddCheckDigit: .T. si se calcula el dígito de control. En las simbologías en donde el dígito de control es obligatorio, no se tiene en cuenta esta propiedad.
- nBearerBar: Tipo del marco portante, solo en la simbología ITF-14. [0=Ninguno, 1=Rectángulo, 2=Superior e inferior]
- lUseAppId: .T. para que FoxBarcode interprete en el código GS1/EAN/UCC-128 a los Identificadores de Aplicación (encerrados entre paréntesis).
- nFactor: Factor de magnificación del código de barras. [1..9]
- nMargin: Margen alrededor del código de barras.
- nRatio: Relación entre las barras angostas y las barras anchas en las simbologías que lo permiten.
- lDeleteTempFiles: Permite elegir si borra o no la carpeta temporal con las imágenes temporales.
Ahora se puede validar previamente la cadena a codificar con el método BarcodeTest()
FoxBarcode es compatible con todas las versiones de Visual FoxPro a partir de la versión 6.0
Lenguajes
Gracias a la Comunidad Mundial de VFP, se tradujeron los mensajes de FoxBarcode a los siguientes lenguajes:
- Inglés
- Español por VFPEncoding
- Checo por Martin Krivka
- Holandés por Koen Piller
- Alemán por Stefan Wuebbe
- Indonesio por Samir H.
- Portugués por Cesar Ch.
- Turco por Ugur Yilmaz
- Filipino por Glenn Gevero
- Francés por Samir H.
- Serbio por Michael Kopljan
- Italiano por Roberto Saccomanno
El siguiente es un ejemplo de código para generar una imagen tipo "PNG" del código de barras "Código 128 C" con una altura de "100" pixeles y un factor de magnificación de "2":
*-- Crear el objeto loFbc = CREATEOBJECT("FoxBarcode") *-- Configurar las propiedades WITH loFBC .cImageType = "PNG" .nBarcodeType = 110 && Code 128 .cSet128 = "C" && Set 128 C .nImageHeight = 100 .nFactor = 2 ENDWITH *-- Generar la imagen lcImagen = loFbc.BarcodeImage("123456789012")Desde la versión 0.11 se agregó un 3er. parámetro al método BarcodeImage() que permite configurar varias propiedades, separadas por comas. El mismo ejemplo de arriba, con el uso del 3er. parámetro.
*-- Creo el objeto loFbc = CREATEOBJECT("FoxBarcode") *-- Genero la imagen con sus propiedades lcImagen = loFbc.BarcodeImage("","",[cText="123456789012", cImageType="PNG", ; nBarcodeType=110, cSet128="C", nImageHeight=100, nFactor=2])
La imagen generada se muestra a continuación
Otras imágenes de ejemplo cambiando solo algunas propiedades de la clase FoxBarcode
Ahora FoxBarcode soporta el código EAN/UCC/GS1 128
Para incluir un código de barras en un formulario, se debe insertar un objeto Image. Como la imagen del código de barras no existe en tiempo de diseño, la propiedad Picture tomará el nombre de la imagen cuando se llame al método BarcodeImage(), por ejemplo desde el método Refresh de Formulario, como se muestra en la siguiente figura:
Para incluir un código de barras en un Informe, se debe insertar un objeto Image y configurar la propiedad ControlSource con un llamado al método BarcodeImage() y se recomienda configurar "Scale contents, retain shape" si la imagen difiere de tamaño con el cuadro.
NOTA: Antes de ejecutar el informe y crear el objeto FoxBarcode, se debe declarar la variable como PRIVATE para que ésta tenga alcance en el informe, como se muestra a continuación:
PRIVATE poFbc poFbc = CREATEOBJECT("FoxBarcode") ... REPORT FORM MyReportDistribución
Los únicos archivos necesarios que se deben distribuir para que FoxBarcode funcione correctamente son:
FoxBarcode.prg
gpImage2.prg
Antes de instanciar la clase FoxBarcode, se deben ejecutar las siguientes sentencias:
SET PROCEDURE TO LOCFILE("FoxBarcode.prg"), LOCFILE("gpImage2.prg") ADDITIVE
Demo
En los archivos de la descarga, está incluido un proyecto completo de una aplicación Demo que utiliza FoxBarcode. La siguiente es una captura de pantalla de la aplicación.
La aplicación permite:
- Configurar todas las propiedades de la clase FoxBarcode y muestrar la imagen generada automáticamente.
- Copiar al portapapeles la imagen generada.
- Guardar en un archivo la imagen.
- Imprimir el código de barras.
- Ejecutar diversos informes y formularios de ejemplo.
- Construir un Script con el código en Visual FoxPro.
Puede leer mas sobre este demo en: Generando códigos de barras con FoxBarcode
¿Quiénes somos?
VFPEncoding es un grupo de desarrolladores pertenecientes a la Comunidad Hispana de Visual FoxPro que creo FoxBarcode. Los miembros de VFPEncoding son:
- Guillermo Carrero [QEPD] (Barcelona, España)
- Luis María Guayán (Tucumán, Argentina)
- A nuestras familias.
- A Cesar Ch. por sus continuas ideas y colaboraciones con sus clases gpImage2 y FoxyPreviewer.
2 de septiembre de 2013
Cómo evitar el mensaje: No puede salir de Visual FoxPro
Artículo original: How to avoid the Cannot Quit Visual FoxPro message
http://www.ml-consult.co.uk/foxst-07.htm
Autor: Mike Lewis
Traducido por: Esparta Palma
Ha desarrollado su aplicación y la ha enviado a su usario. Todo está bien. Entonces recibe una llamada telefónica. El usuario ha intentado cerrar la aplicación, pero todo lo que ha pasado fué que apareció un mensaje: "No puede salir de Visual FoxPro" o "Cannot Quit Visual FoxPro" (vea figura 1). Por qué la aplicación se encuentra aún en un ciclo de eventos.
Figura 1: El temido Mensaje No puede salir de Visual FoxPro.
En algún lugar de la aplicación, ha puesto un código como el siguiente:
Una vez que el programa ha sido puesto en un ciclo de eventos (que es lo que READ EVENTS hace), no podrá cerrar la ventana hasta que salga del ciclo de eventos. Esto lo realiza con el comando CLEAR EVENTS. Normalmente ejecuta CLEAR EVENTS en cualquier momento en que el usuario desea cerrar la aplicación -en el comando "Salir" desde el menú "Archivo por ejemplo.
Pero, ¿ que pasa si el usuario trata de cerrar la aplicación haciendo click en el botón cerrar de la barra de título? O al apagar la máquina windows (con Inicio -> Apagar Equipo) mientras la aplicación continúa ejecutándose? En estos casos, el programa no tiene la oportunidad de ejecutar el CLEAR EVENT. El ciclo de eventos continúa activo, es por ello que el mensaje "No puede salir.." aparece.
Para evitar esto, use el comando ON SHUTDOWN. Éste trabaja de la misma manera que cualquier otro comando "ON", tales como ON ERROR, en los que se especifica una acción a tomar cuando cierto evento ocurre. En este caso, el evento es cualquier intento de cerrar la aplicación, de la modo que fuere.
Así pues, todo lo que tiene que hacer es ejecutar ON SHUTDOWN CLEAR EVENTS. Puede hacerlo cerca del inicio del programa - en cualquier caso antos de READ EVENTS. Una vez que haya hecho esto, el usuario nunca volverá a ver el mensaje "No puede salir..." . Cuando el usuario toca el botón de Cerrar en la barra de título, el programa ejecutará el código de ON SHUTDOWN, el cual hará que se salga del ciclo de eventos y pasa el control a el código que se encuentra después de READ EVENTS. Fin del problema.
No pasa nada
Bueno, no en absoluto. Ahora trate de ejecutar la aplicación en en entorno de desarrollo de VFP. Cierre la aplicación. Entonces trate de salir de Visual FoxPro. Esto no tiene mucha diferencia si utiliza el comando Archivo -> Salir, hacer click en el botón cerrar o escribir QUIT en la Ventana de Comandos. El resultado es el mismo: No pasa nada.
¿Por qué? Debido a que el comando ON SHUTDOWN todavía está en efecto. En vez de cerrer, VFP está ejecutándo únicamente un CLEAR EVENTS, esto no tiene efecto si està en el ambiente de desarrollo y no hay ningun programa corriendo.
Para evitar esto, regrese a su aplicación, y agregue una vez más el comando ON SHUTDOWN. Esta vez, sólo ponga ON SHUTDOWN. Ponga esto en el código de limpieza, esto es, en algún lugar después de READ EVENTS. Su efecto será el de cancelar el primer ON SHUTDOWN.
Este par de comando -- ON SHUTDOWN CLEAR EVENTS y ON SHUTDOWN (sin nada mas) -- son lo mínimo que necesita para cerrar la aplicación con éxito. Pero, dependiendo en cómo la aplicación está estructurada, debería hacer algunas cosas más.
Limpiando
In sus aplicaciones, el comando Archivo -> Salir realiza ciera cantidad de limpieza antes de ejecutar el CLEAR EVENTS. Específicamente, iterar a través de la colección de formularios abiertos (esto es, la colección de Forms en _SCREEN), cerrando cada formulario en turno. Al hacer esto, avisar a el usuario para que trate con las ediciones de datos sin guardar. Hasta este punto, el usuario puede decidir si cancelar el cierre de la aplicación, en cualquier caso la rutina de salida dejará el formulario relevante abierto y regresará para limpiar el ciclo de eventos.
La aplicación necesita necesita ir a través de este mismo procedimiento sin importar cómo el usuario trata de cerrar. Para lograr esto, pondremos lo arriba descrito en un procedimiento, que llamaremos en la llamada de salida. El comando de salida en el menú Archivo llama a éste procedimiento con una simple llamada DO. Y entonces ejecutar el comando ON SHUTDOWN. En otras palabras, en vez de ejecutar ON SHUTDOWN CLEAR EVENTS, ejecutaremos ON SHUTDOW DO FileExit. De este modo, el procedimiento de cerrado es siempre el mismo, sin importar como el usuario lo haya iniciado.
http://www.ml-consult.co.uk/foxst-07.htm
Autor: Mike Lewis
Traducido por: Esparta Palma
Ha desarrollado su aplicación y la ha enviado a su usario. Todo está bien. Entonces recibe una llamada telefónica. El usuario ha intentado cerrar la aplicación, pero todo lo que ha pasado fué que apareció un mensaje: "No puede salir de Visual FoxPro" o "Cannot Quit Visual FoxPro" (vea figura 1). Por qué la aplicación se encuentra aún en un ciclo de eventos.
Figura 1: El temido Mensaje No puede salir de Visual FoxPro.
En algún lugar de la aplicación, ha puesto un código como el siguiente:
DO MainMenu.MPR READ EVENTS
Una vez que el programa ha sido puesto en un ciclo de eventos (que es lo que READ EVENTS hace), no podrá cerrar la ventana hasta que salga del ciclo de eventos. Esto lo realiza con el comando CLEAR EVENTS. Normalmente ejecuta CLEAR EVENTS en cualquier momento en que el usuario desea cerrar la aplicación -en el comando "Salir" desde el menú "Archivo por ejemplo.
Pero, ¿ que pasa si el usuario trata de cerrar la aplicación haciendo click en el botón cerrar de la barra de título? O al apagar la máquina windows (con Inicio -> Apagar Equipo) mientras la aplicación continúa ejecutándose? En estos casos, el programa no tiene la oportunidad de ejecutar el CLEAR EVENT. El ciclo de eventos continúa activo, es por ello que el mensaje "No puede salir.." aparece.
Para evitar esto, use el comando ON SHUTDOWN. Éste trabaja de la misma manera que cualquier otro comando "ON", tales como ON ERROR, en los que se especifica una acción a tomar cuando cierto evento ocurre. En este caso, el evento es cualquier intento de cerrar la aplicación, de la modo que fuere.
Así pues, todo lo que tiene que hacer es ejecutar ON SHUTDOWN CLEAR EVENTS. Puede hacerlo cerca del inicio del programa - en cualquier caso antos de READ EVENTS. Una vez que haya hecho esto, el usuario nunca volverá a ver el mensaje "No puede salir..." . Cuando el usuario toca el botón de Cerrar en la barra de título, el programa ejecutará el código de ON SHUTDOWN, el cual hará que se salga del ciclo de eventos y pasa el control a el código que se encuentra después de READ EVENTS. Fin del problema.
No pasa nada
Bueno, no en absoluto. Ahora trate de ejecutar la aplicación en en entorno de desarrollo de VFP. Cierre la aplicación. Entonces trate de salir de Visual FoxPro. Esto no tiene mucha diferencia si utiliza el comando Archivo -> Salir, hacer click en el botón cerrar o escribir QUIT en la Ventana de Comandos. El resultado es el mismo: No pasa nada.
¿Por qué? Debido a que el comando ON SHUTDOWN todavía está en efecto. En vez de cerrer, VFP está ejecutándo únicamente un CLEAR EVENTS, esto no tiene efecto si està en el ambiente de desarrollo y no hay ningun programa corriendo.
Para evitar esto, regrese a su aplicación, y agregue una vez más el comando ON SHUTDOWN. Esta vez, sólo ponga ON SHUTDOWN. Ponga esto en el código de limpieza, esto es, en algún lugar después de READ EVENTS. Su efecto será el de cancelar el primer ON SHUTDOWN.
Este par de comando -- ON SHUTDOWN CLEAR EVENTS y ON SHUTDOWN (sin nada mas) -- son lo mínimo que necesita para cerrar la aplicación con éxito. Pero, dependiendo en cómo la aplicación está estructurada, debería hacer algunas cosas más.
Limpiando
In sus aplicaciones, el comando Archivo -> Salir realiza ciera cantidad de limpieza antes de ejecutar el CLEAR EVENTS. Específicamente, iterar a través de la colección de formularios abiertos (esto es, la colección de Forms en _SCREEN), cerrando cada formulario en turno. Al hacer esto, avisar a el usuario para que trate con las ediciones de datos sin guardar. Hasta este punto, el usuario puede decidir si cancelar el cierre de la aplicación, en cualquier caso la rutina de salida dejará el formulario relevante abierto y regresará para limpiar el ciclo de eventos.
La aplicación necesita necesita ir a través de este mismo procedimiento sin importar cómo el usuario trata de cerrar. Para lograr esto, pondremos lo arriba descrito en un procedimiento, que llamaremos en la llamada de salida. El comando de salida en el menú Archivo llama a éste procedimiento con una simple llamada DO. Y entonces ejecutar el comando ON SHUTDOWN. En otras palabras, en vez de ejecutar ON SHUTDOWN CLEAR EVENTS, ejecutaremos ON SHUTDOW DO FileExit. De este modo, el procedimiento de cerrado es siempre el mismo, sin importar como el usuario lo haya iniciado.
20 de julio de 2013
Navegación en Formularios ABM en entornos Cliente / Servidor
Autor: Antonio L. Montagut
www.ontarioxb.es
Mucho se ha hablado en los foros, sobre la conveniencia o no, de utilizar botones de navegación en formularios de mantenimiento o ABM. Nos referimos a los botones de navegación (Primero, Anterior, Siguiente, Último).
En mi opinión, si es aconsejable. Y además la velocidad de respuesta es inmediata. Os voy ha mostrar un ejemplo de su utilización en entornos MySQL / MariaDB, para lo cual hay que tener algunas consideraciones que comentaremos más adelante.
De momento vamos a comenzar por el principio. A través del Shell o línea de comandos de MySQL / MariaDB vamos a crear una base de datos y una pequeña tabla de clientes.
Antonio L. Montagut
www.ontarioxb.es
Mucho se ha hablado en los foros, sobre la conveniencia o no, de utilizar botones de navegación en formularios de mantenimiento o ABM. Nos referimos a los botones de navegación (Primero, Anterior, Siguiente, Último).
En mi opinión, si es aconsejable. Y además la velocidad de respuesta es inmediata. Os voy ha mostrar un ejemplo de su utilización en entornos MySQL / MariaDB, para lo cual hay que tener algunas consideraciones que comentaremos más adelante.
De momento vamos a comenzar por el principio. A través del Shell o línea de comandos de MySQL / MariaDB vamos a crear una base de datos y una pequeña tabla de clientes.
DROP DATABASE IF EXISTS mybd; CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARACTER SET utf8 COLLATE utf8_spanish_ci ; USE mydb; DROP TABLE IF EXISTS clientes; CREATE TABLE IF NOT EXISTS clientes ( CODIGO varchar(6) COLLATE utf8_spanish_ci NOT NULL DEFAULT '000000', NOMBRE varchar(50) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', DOMICILIO varchar(50) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', POBLACION varchar(50) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', CP varchar(7) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', PROVINCIA varchar(50) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', NIF varchar(15) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', TLF1 varchar(15) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', TLF2 varchar(15) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', FAX varchar(15) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', WEB varchar(40) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', EMAIL varchar(50) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', PRIMARY KEY (CODIGO)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci ROW_FORMAT=DYNAMIC;Una vez creada la Base de Datos con la tabla Clientes. Y tener instalado el Driver ODBC 5.1x para MySQL / MariaDB ya podemos crear en VFP la conexión a la misma mediante la técnica del SQL Pass-Through.
RELEASE NH PUBLIC NH AS Number NH = 0 cSQL = "DRIVER={MySQL ODBC 5.1 Driver};" + ; "SERVER=localhost;" + ; "PORT=3306;" + ; "UID=usuario;" + ; "PWD=password;" + ; "DATABASE=mybd;" + ; "OPTION=" + ALLTRIM(STR(1+2+2048+16384+131072,08,00)) NH = SQLSTRINGCONNECT("" + cSQL, .T.) IF NH < 0 MESSAGEBOX("Error de Conexión: " + ALLTRIM(STR(NH,10,00)), 48, "Atencion") ENDIFUna vez se ha producido la conexión satisfactoriamente, vamos a explicar la navegación a través de los diferentes "botones". La variable "cKEY" nos va a indicar el código del registro donde estamos posicionados actualmente, y a partir del cual vamos a proceder a la navegación.
RELEASE cKEY PUBLIC cKEY cKEY = '000777' && Codigo inicial• Primer Registro:
TEXT TO cSQL TEXTMERGE NOSHOW SELECT * FROM clientes FORCE INDEX(PRIMARY) ORDER BY CODIGO LIMIT 1 ENDTEXT SQLPREPARE(NH, "" + cSQL, "tcursor") DO WHILE SQLEXEC(NH) = 0 ENDDO SELECT tcursor If recno() > 0 cKEY = tcursor.CODIGO ELSE cKEY = '000000' ENDIF USE• Anterior Registro:
TEXT TO cSQL TEXTMERGE NOSHOW SELECT * FROM clientes FORCE INDEX(PRIMARY) WHERE CODIGO < ?cKEY ORDER BY CODIGO DESC LIMIT 1 ENDTEXT SQLPREPARE(NH, "" + cSQL, "tcursor") DO WHILE SQLEXEC(NH) = 0 ENDDO SELECT tcursor If recno() > 0 cKEY = tcursor.CODIGO ELSE cKEY = '000000' ENDIF USE• Siguiente Registro
TEXT TO cSQL TEXTMERGE NOSHOW SELECT * FROM clientes FORCE INDEX(PRIMARY) WHERE CODIGO > ?cKEY ORDER BY CODIGO LIMIT 1 ENDTEXT SQLPREPARE(NH, "" + cSQL, "tcursor") DO WHILE SQLEXEC(NH) = 0 ENDDO SELECT tcursor If recno() > 0 cKEY = tcursor.CODIGO ELSE cKEY = '000000' ENDIF USE• Último Registro:
TEXT TO cSQL TEXTMERGE NOSHOW SELECT * FROM clientes FORCE INDEX(PRIMARY) ORDER BY CODIGO DESC LIMIT 1 ENDTEXT SQLPREPARE(NH, "" + cSQL, "tcursor") DO WHILE SQLEXEC(NH) = 0 ENDDO SELECT tcursor If recno() > 0 cKEY = tcursor.CODIGO ELSE cKEY = '000000' ENDIF USELas consideraciones a tener en cuenta son las siguientes:
- Utilizar la clave primaria de la tabla, esa es la explicación de la instrucción FORCE INDEX (PRIMARY). Acelera las consultas de una manera increíble.
- Traer solo un solo registro y solo uno cada vez, esa es la explicación de la instrucción LIMIT 1.
- No utilizar SELECT * . Esto conlleva traer todos los campos del registro de la tabla. Yo lo he puesto para simplificar el ejemplo pero no es muy aconsejable.
Antonio L. Montagut
14 de julio de 2013
Colocar los procesos de Windows en una Tabla Temporal
Saber que procesos se ejecutan en Windows aveces es necesario saberlo en FoxPro y pienso que con este codigo les ayudaria mucho.
Es simple, este solo intruduce todos los procesos en una tabla temporal en fox... y si nuestra aplicacion depende de otro programita para su funcionamiento estaria genial para verificarlo...
Es simple, este solo intruduce todos los procesos en una tabla temporal en fox... y si nuestra aplicacion depende de otro programita para su funcionamiento estaria genial para verificarlo...
FUNCTION VerProcesos() loService = Getobject("winmgmts:{impersonationLevel=impersonate}!\\.root\cimv2") loProcesses = loService.ExecQuery("SELECT * FROM Win32_Process") CREATE CURSOR procesos (Descripcion c(60)) For Each loProcess In loProcesses Servicio = loProcess.Name INSERT INTO procesos (Descripcion) VALUES (Servicio) Next Return ENDFUNC
30 de mayo de 2013
Google Text to Speech
Autor: Mauricio R. Molinero
Código para traducir texto a voz en español, ya que el Microsoft Speech 5.1 no tiene voces en español.
Utilizando esta simple funcion podemos oir la famosa frase. Aquí el código
Código para traducir texto a voz en español, ya que el Microsoft Speech 5.1 no tiene voces en español.
Utilizando esta simple funcion podemos oir la famosa frase. Aquí el código
=tts("Nada corre como un zorro") FUNCTION tts() LPARAMETERS tctext *// Mauricio R. Molinero ** m.http_get = "http://translate.google.com/translate_tts?tl=es&q="+urlencode(m.tctext) LOCAL ohttp AS winhttp.winhttprequest.5.1 m.ohttp = CREATEOBJECT("WinHTTP.WinHTTPRequest.5.1") m.ohttp.OPEN("GET", m.http_get) m.ohttp.setrequestheader("Host","translate.google.com") m.ohttp.setrequestheader("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729) ") m.ohttp.setrequestheader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") m.ohttp.setrequestheader("Accept-Language","en-us,en;q=0.5") m.ohttp.setrequestheader("Accept-Encoding","gzip,deflate") m.ohttp.setrequestheader("Accept-Charset","ISO-8859-1,utf-8;q=0.7,*;q=0.7") m.ohttp.setrequestheader("Keep-Alive","115") m.ohttp.setrequestheader("Connection","keep-alive") m.ohttp.SEND() TRY DELETE FILE (ADDBS(SYS(2023)) + "trans*.mp3") CATCH TO m.loErr ENDTRY m.lcFileName = ADDBS(SYS(2023)) + "trans" + FORCEEXT(SYS(2015),"MP3") SET SAFETY OFF STRTOFILE(CAST(m.ohttp.responsebody AS MEMO),m.lcFileName) IF VARTYPE(m.oMCI) # "O" PUBLIC oMCI m.oMCI = CREATEOBJECT("MCI.MMcontrol") ENDIF m.omci.COMMAND = "Close" *// m.omci.FileName = m.lcFileName m.omci.AutoEnable=1 m.omci.COMMAND = "Open" m.omci.COMMAND = "Play" RETURN ENDFUNC FUNCTION urlencode PARAMETERS tcvalue, llnoplus LOCAL lcresult, lcchar, lnsize, lnx *** Do it in VFP Code m.lcresult = "" FOR m.lnx = 1 TO LEN(m.tcvalue) m.lcchar = SUBSTR(m.tcvalue,m.lnx,1) IF ATC(m.lcchar,"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") > 0 m.lcresult = m.lcresult + m.lcchar LOOP ENDIF IF m.lcchar = " " AND !m.llnoplus m.lcresult = m.lcresult + "+" LOOP ENDIF *** Convert others to Hex equivalents m.lcresult = m.lcresult + "%" + RIGHT(TRANSFORM(ASC(m.lcchar),"@0"),2) ENDFOR RETURN m.lcresult ENDFUNC
9 de mayo de 2013
Funciones para convertir colores RGB, HTML y Pantone
Este ejemplo incluye varias funciones en FoxPro para convertir colores. También incluye una función básica para manejo de Pantones.
Código
Puede descargar el código al final del artículo
Descargar
Descargue el programa este enlace
Fuentes
Jose Guillermo Ortiz Hernandez
Código
Puede descargar el código al final del artículo
LOCAL lnRojo, lnVerde, lnAzul, lnPantone, lcColor lnRojo=110 lnVerde=141 lnAzul=130 lnPantone=INT((814-100 + 1) * RAND() + 100) DEFINE WINDOW wExampleFunctions ; FROM 1,1 TO 20,30 ; TITLE "wExampleColors" ; FONT "MS Sans Serif"; SYSTEM CLOSE FLOAT MOVE WINDOW wExampleFunctions CENTER ACTIVATE WINDOW wExampleFunctions @ 1,2 SAY "COLORES" FONT "Arial",18 STYLE "B" @ 3,2 SAY "Función GetRgbToColor" FONT "Arial",10 STYLE "B" @ 4,2 SAY TRANSFORM(GetRgbToColor(lnRojo,lnVerde,lnAzul)) @ 6,2 SAY "Función GetColorToRgb" FONT "Arial",10 STYLE "B" @ 7,2 SAY GetColorToRgb(GetRgbToColor(lnRojo,lnVerde,lnAzul)) @ 9,2 SAY "Función GetRgbToHex" FONT "Arial",10 STYLE "B" @10,2 SAY GetRgbToHex(lnRojo,lnVerde,lnAzul) @12,2 SAY "Función GetHexToColor(#6E8D82)" FONT "Arial",10 STYLE "B" @13,2 SAY TRANSFORM(GetHexToColor("#6E8D82")) @15,2 SAY "PANTONE" FONT "Arial",18 STYLE "B" @17,2 SAY "Función GetColorOfPantone, No."+TRANSFORM(lnPantone) FONT "Arial",10 STYLE "B" @18,2 SAY GetColorOfPantone(lnPantone) @19,2 SAY GetColorOfPantone(lnPantone,"RGB") @21,2 SAY "Nota: Este es un ejemplo usando las respectivas funciones" FONT "Arial",7 @22,2 SAY "Nota: Los pantones no definidos se mostraran en blanco" FONT "Arial",7 lcColor=GetColorOfPantone(lnPantone,"RGB") _screen.BackColor=&lcColor. *************************************************************************************************************** *-- Funcion: GetRgbToColor, Retorna un entero con el valor correspondiente al color en RGB *-- Parametros: tnRed, tnGreen, tnBlue (Colores Rojo, Verde y Azul) *-- Retorna: Numero entero *-- Time Stamp: 07/05/2013 *-- Creo Jose Guillermo Ortiz *************************************************************************************************************** FUNCTION GetRgbToColor LPARAMETERS tnRed, tnGreen, tnBlue tnRed=IIF(VARTYPE(tnRed)=='N',IIF(BETWEEN(tnRed,0,255),tnRed,0),0) tnGreen=IIF(VARTYPE(tnGreen)=='N',IIF(BETWEEN(tnGreen,0,255),tnGreen,0),0) tnBlue=IIF(VARTYPE(tnBlue)=='N',IIF(BETWEEN(tnBlue,0,255),tnBlue,0),0) RETURN INT(tnRed+(tnGreen*256)+(tnBlue*(256^2))) ENDFUNC *************************************************************************************************************** *-- Funcion: GetColorToRgb, Retorna un string con los colores en formato RGB, ej: RGB(192,192,192) *-- Parametros: tnColor, Color a convertir en RGB *-- Retorna: Caracter *-- Time Stamp: 07/05/2013 *-- Creo Jose Guillermo Ortiz *************************************************************************************************************** FUNCTION GetColorToRgb LPARAMETERS tnColor LOCAL lcRGB, lnIndice lcRGB=[] FOR lnIndice=1 TO 3 lcRGB=lcRGB+TRAN(tnColor%256,"999")+IIF(lnIndice=3,"",",") tnColor=INT(tnColor/256) ENDFOR RETURN [RGB(]+lcRGB+[)] ENDFUNC *************************************************************************************************************** *-- Funcion: GetRgbToHex, Retorna el color en formato RGB en Hexagesimal ej: #FFFFFF *-- Parametros: tnRed, tnGreen, tnBlue (Colores Rojo, Verde y Azul) *-- Retorna: Caracter *-- Time Stamp: 07/05/2013 *-- Creo Jose Guillermo Ortiz *************************************************************************************************************** FUNCTION GetRgbToHex LPARAMETERS tnRed, tnGreen, tnBlue tnRed=IIF(VARTYPE(tnRed)=='N',IIF(BETWEEN(tnRed,0,255),tnRed,0),0) tnGreen=IIF(VARTYPE(tnGreen)=='N',IIF(BETWEEN(tnGreen,0,255),tnGreen,0),0) tnBlue=IIF(VARTYPE(tnBlue)=='N',IIF(BETWEEN(tnBlue,0,255),tnBlue,0),0) RETURN "#"+RIGHT(TRANSFORM(tnRed%256,";@0"),2)+RIGHT(TRANSFORM(tnGreen%256,";@0"),2)+RIGHT(TRANSFORM(tnBlue%256,";@0"),2) ENDFUNC *************************************************************************************************************** *-- Funcion: GetHexToColor, Retorna el color como entero del Hexagesimal, Necesita la funcion GetRgbToColor *-- Parametros: tcHex, Color en formato hexagesimal *-- Retorna: Entero *-- Time Stamp: 07/05/2013 *-- Creo Jose Guillermo Ortiz *************************************************************************************************************** FUNCTION GetHexToColor LPARAMETERS tcHex tcHex=CHRTRAN(IIF(VARTYPE(tcHex)=='C',ALLTRIM(tcHex),[000000]),[#],[]) tcHex=IIF(LEN(tcHex)==6,tcHex,PADL(SUBSTR(tcHex,1,6),6,[0])) RETURN GetRgbToColor(VAL([0x]+SUBSTR(tcHex,1,2)),VAL([0x]+SUBSTR(tcHex,3,2)),VAL([0x]+SUBSTR(tcHex,5,2))) ENDFUNC *************************************************************************************************************** *-- Funcion: GetColorOfPantone, Retorna el color RGB o hexagesimal de un panton *-- Parametros: tnPanton, Nuero del panton (Entero) *-- tcType, Tipo de formato, RGB o HEX *-- Retorna: Caracter *-- Time Stamp: 07/05/2013 *-- Creo Jose Guillermo Ortiz *************************************************************************************************************** FUNCTION GetColorOfPantone LPARAMETERS tnPanton, tcType LOCAL laPanton[5875] tnPanton=IIF(VARTYPE(tnPanton)=='N',IIF(BETWEEN(tnPanton,1,ALEN(laPanton,1)),tnPanton,1),1) tcType=IIF(VARTYPE(tcType)=='C',ALLTRIM(UPPER(tcType)),[]) tcType=IIF(INLIST(tcType,'RGB','HEX'),tcType,'HEX') laPanton=[RGB(255,255,255);#FFFFFF] laPanton[100]=[RGB(243,237,134);#F3ED86] laPanton[101]=[RGB(245,236,98);#F5EC62] laPanton[102]=[RGB(250,230,0);#FAE600] laPanton[103]=[RGB(202,173,0);#CAAD00] laPanton[104]=[RGB(172,150,0);#AC9600] laPanton[105]=[RGB(129,114,20);#817214] laPanton[106]=[RGB(246,231,97);#F6E761] laPanton[107]=[RGB(250,226,47);#FAE22F] laPanton[108]=[RGB(254,219,0);#FEDB00] laPanton[109]=[RGB(255,209,0);#FFD100] laPanton[110]=[RGB(219,174,0);#DBAE00] laPanton[111]=[RGB(175,143,0);#AF8F00] laPanton[112]=[RGB(153,128,0);#998000] laPanton[113]=[RGB(250,225,90);#FAE15A] laPanton[114]=[RGB(250,224,81);#FAE051] laPanton[115]=[RGB(251,222,74);#FBDE4A] laPanton[116]=[RGB(255,206,0);#FFCE00] laPanton[117]=[RGB(206,157,0);#CE9D00] laPanton[118]=[RGB(179,138,0);#B38A00] laPanton[119]=[RGB(138,118,26);#8A761A] laPanton[120]=[RGB(249,223,121);#F9DF79] laPanton[121]=[RGB(251,219,110);#FBDB6E] laPanton[122]=[RGB(253,212,79);#FDD44F] laPanton[123]=[RGB(255,199,38);#FFC726] laPanton[124]=[RGB(235,171,0);#EBAB00] laPanton[125]=[RGB(187,137,0);#BB8900] laPanton[126]=[RGB(161,124,0);#A17C00] laPanton[127]=[RGB(239,223,133);#EFDF85] laPanton[128]=[RGB(242,214,94);#F2D65E] laPanton[129]=[RGB(241,205,68);#F1CD44] laPanton[130]=[RGB(241,171,0);#F1AB00] laPanton[131]=[RGB(212,145,0);#D49100] laPanton[132]=[RGB(166,122,0);#A67A00] laPanton[133]=[RGB(133,89,19);#715913] laPanton[134]=[RGB(248,213,131);#F8D583] laPanton[135]=[RGB(254,200,90);#FEC85A] laPanton[136]=[RGB(255,188,58);#FFBC3A] laPanton[137]=[RGB(255,159,0);#FF9F00] laPanton[138]=[RGB(228,127,0);#E47F00] laPanton[139]=[RGB(182,113,0);#B67100] laPanton[140]=[RGB(122,86,15);#7A560F] laPanton[141]=[RGB(239,200,104);#EFC868] laPanton[142]=[RGB(241,187,70);#F1BB46] laPanton[143]=[RGB(239,170,35);#EFAA23] laPanton[144]=[RGB(237,128,0);#ED8000] laPanton[145]=[RGB(207,118,0);#CF7600] laPanton[146]=[RGB(159,96,0);#9F6000] laPanton[147]=[RGB(113,88,33);#715821] laPanton[148]=[RGB(251,208,157);#FBD09D] laPanton[149]=[RGB(254,198,136);#FEC688] laPanton[150]=[RGB(255,169,79);#FFA94F] laPanton[151]=[RGB(255,115,0);#FF7300] laPanton[152]=[RGB(231,111,0);#E76F00] laPanton[153]=[RGB(192,102,0);#C06600] laPanton[154]=[RGB(153,84,9);#995409] laPanton[155]=[RGB(236,214,175);#ECD6AF] laPanton[156]=[RGB(239,193,138);#EFC18A] laPanton[157]=[RGB(237,155,79);#ED9B4F] laPanton[158]=[RGB(233,107,16);#E96B10] laPanton[159]=[RGB(205,88,6);#CD5806] laPanton[160]=[RGB(162,78,18);#A24E12] laPanton[161]=[RGB(97,53,23);#613517] laPanton[162]=[RGB(253,195,170);#FDC3AA] laPanton[163]=[RGB(255,156,113);#FF9C71] laPanton[164]=[RGB(255,126,67);#FF7E43] laPanton[165]=[RGB(255,95,0);#FF5F00] laPanton[166]=[RGB(229,83,0);#E55300] laPanton[167]=[RGB(194,81,15);#C2510F] laPanton[168]=[RGB(111,48,20);#6F3014] laPanton[169]=[RGB(255,182,177);#FFB6B1] laPanton[170]=[RGB(255,137,123);#FF897B] laPanton[171]=[RGB(255,97,65);#FF6141] laPanton[172]=[RGB(253,71,3);#FD4703] laPanton[173]=[RGB(216,69,25);#D84519] laPanton[174]=[RGB(154,52,22);#9A3416] laPanton[175]=[RGB(112,50,34);#703222] laPanton[176]=[RGB(255,172,185);#FFACB9] laPanton[177]=[RGB(255,129,140);#FF818C] laPanton[178]=[RGB(255,91,96);#FF5B60] laPanton[179]=[RGB(226,56,40);#E23828] laPanton[180]=[RGB(192,54,44);#C0362C] laPanton[181]=[RGB(121,39,32);#792720] laPanton[182]=[RGB(248,184,203);#F8B8CB] laPanton[183]=[RGB(252,141,169);#FC8DA9] laPanton[184]=[RGB(248,93,129);#F85D7E] laPanton[185]=[RGB(234,4,55);#EA0437] laPanton[186]=[RGB(210,16,52);#D21034] laPanton[187]=[RGB(179,27,52);#B31B34] laPanton[188]=[RGB(124,34,48);#7C2230] laPanton[189]=[RGB(248,161,190);#F8A1BE] laPanton[190]=[RGB(248,119,158);#F8779E] laPanton[191]=[RGB(242,63,114);#F23F72] laPanton[192]=[RGB(233,6,73);#E90649] laPanton[193]=[RGB(195,12,62);#C30C3E] laPanton[194]=[RGB(156,30,61);#9C1E3D] laPanton[196]=[RGB(235,198,211);#EBC6D3] laPanton[197]=[RGB(235,155,178);#EB9BB2] laPanton[198]=[RGB(228,77,11);#E44D6F] laPanton[199]=[RGB(219,12,65);#DB0C41] laPanton[200]=[RGB(193,4,53);#C10435] laPanton[201]=[RGB(158,27,52);#9E1B34] laPanton[202]=[RGB(137,32,52);#892034] laPanton[203]=[RGB(235,173,205);#EBADCD] laPanton[204]=[RGB(232,123,172);#E87BAC] laPanton[205]=[RGB(227,69,133);#E34585] laPanton[206]=[RGB(215,0,77);#D7004D] laPanton[207]=[RGB(177,0,66);#B10042] laPanton[208]=[RGB(144,33,71);#902147] laPanton[209]=[RGB(117,38,65);#752641] laPanton[210]=[RGB(250,159,204);#FA9FCC] laPanton[211]=[RGB(249,125,184);#F97DB8] laPanton[212]=[RGB(243,78,154);#F34E9A] laPanton[213]=[RGB(230,21,119);#E61577] laPanton[214]=[RGB(208,0,99);#D00063] laPanton[215]=[RGB(170,16,84);#AA1054] laPanton[216]=[RGB(122,29,66);#7A1D42] laPanton[217]=[RGB(236,187,221);#ECBBDD] laPanton[218]=[RGB(232,111,184);#E86FB8] laPanton[219]=[RGB(224,33,138);#E0218A] laPanton[220]=[RGB(174,0,85);#AE0055] laPanton[221]=[RGB(150,0,75);#96004B] laPanton[222]=[RGB(108,25,63);#6C193F] laPanton[223]=[RGB(242,147,209);#F293D1] laPanton[224]=[RGB(239,106,191);#EF6ABF] laPanton[225]=[RGB(229,35,157);#E5239D] laPanton[226]=[RGB(214,0,119);#D60077] laPanton[227]=[RGB(174,0,95);#AE005F] laPanton[228]=[RGB(138,7,83);#8A0753] laPanton[229]=[RGB(106,29,68);#6A1D44] laPanton[230]=[RGB(247,167,219);#F7A7DB] laPanton[231]=[RGB(245,117,201);#F575C9] laPanton[232]=[RGB(239,64,176);#EF40B0] laPanton[233]=[RGB(201,0,129);#C90081] laPanton[234]=[RGB(166,0,107);#A6006B] laPanton[235]=[RGB(137,8,87);#890857] laPanton[236]=[RGB(242,176,223);#F2B0DF] laPanton[237]=[RGB(238,134,211);#EE86D3] laPanton[238]=[RGB(230,83,188);#E653BC] laPanton[239]=[RGB(224,50,175);#E032AF] laPanton[240]=[RGB(196,30,153);#C41E99] laPanton[241]=[RGB(172,4,129);#AC0481] laPanton[242]=[RGB(122,26,87);#7A1A57] laPanton[243]=[RGB(232,183,229);#E8B7E5] laPanton[244]=[RGB(230,162,224);#E6A2E0] laPanton[245]=[RGB(223,129,214);#DF81D6] laPanton[246]=[RGB(199,11,172);#C70BAC] laPanton[247]=[RGB(183,0,157);#B3009D] laPanton[248]=[RGB(158,3,137);#9E0389] laPanton[249]=[RGB(123,34,102);#7B2266] laPanton[250]=[RGB(227,192,230);#E3C0E6] laPanton[251]=[RGB(217,156,225);#D99CE1] laPanton[252]=[RGB(202,101,209);#CA65D1] laPanton[253]=[RGB(169,27,176);#A91BB0] laPanton[254]=[RGB(150,35,153);#962399] laPanton[255]=[RGB(112,38,108);#70266C] laPanton[256]=[RGB(217,191,224);#D9BFE0] laPanton[257]=[RGB(203,164,212);#CBA4D4] laPanton[258]=[RGB(146,73,158);#92499E] laPanton[259]=[RGB(108,27,114);#6C1B72] laPanton[260]=[RGB(95,29,95);#5F1D5F] laPanton[261]=[RGB(89,30,85);#591E55] laPanton[262]=[RGB(79,34,72);#4F2248] laPanton[263]=[RGB(216,203,235);#D8CBEB] laPanton[264]=[RGB(188,168,230);#BCA8E6] laPanton[265]=[RGB(141,101,210);#8D65D2] laPanton[266]=[RGB(103,50,186);#6732BA] laPanton[267]=[RGB(79,31,145);#4F1F91] laPanton[268]=[RGB(74,33,126);#4A217E] laPanton[269]=[RGB(69,38,99);#452663] laPanton[270]=[RGB(173,172,220);#ADACDC] laPanton[271]=[RGB(148,144,210);#9490D2] laPanton[272]=[RGB(121,115,194);#7973C2] laPanton[273]=[RGB(37,23,122);#25177A] laPanton[274]=[RGB(33,18,101);#211265] laPanton[275]=[RGB(29,17,87);#1D1157] laPanton[276]=[RGB(36,26,68);#241A44] laPanton[277]=[RGB(169,199,236);#9C7EC] laPanton[278]=[RGB(140,180,232);#8CB4E8] laPanton[279]=[RGB(65,137,221);#4189DD] laPanton[280]=[RGB(0,38,127);#00267F] laPanton[281]=[RGB(0,37,105);#002569] laPanton[282]=[RGB(0,32,78);#00204E] laPanton[283]=[RGB(147,191,235);#93BFEB] laPanton[284]=[RGB(108,171,231);#6CABE7] laPanton[285]=[RGB(0,119,212);#0077D4] laPanton[286]=[RGB(0,53,173);#0035AD] laPanton[287]=[RGB(0,53,152);#003798] laPanton[288]=[RGB(0,48,130);#003082] laPanton[289]=[RGB(0,35,76);#00234C] laPanton[290]=[RGB(190,217,237);#BED9ED] laPanton[291]=[RGB(164,206,236);#A4CEEC] laPanton[292]=[RGB(106,178,231);#6AB2E7] laPanton[293]=[RGB(0,71,182);#0047B6] laPanton[294]=[RGB(0,53,128);#003580] laPanton[295]=[RGB(0,45,98);#002D62] laPanton[296]=[RGB(0,39,64);#002740] laPanton[297]=[RGB(120,199,235);#78C7EB] laPanton[298]=[RGB(66,180,230);#42B4E6] laPanton[299]=[RGB(0,160,226);#00A0E2] laPanton[300]=[RGB(0,103,198);#0067C6] laPanton[301]=[RGB(0,82,155);#00529B] laPanton[302]=[RGB(0,67,110);#00436E] laPanton[303]=[RGB(0,52,77);#00344D] laPanton[304]=[RGB(162,219,235);#A2DBEB] laPanton[305]=[RGB(83,202,235);#53CAEB] laPanton[306]=[RGB(0,181,230);#00B5E6] laPanton[307]=[RGB(0,112,178);#0070B2] laPanton[308]=[RGB(0,88,131);#005883] laPanton[309]=[RGB(0,57,71);#003947] laPanton[310]=[RGB(102,207,230);#66CFE6] laPanton[311]=[RGB(0,194,227);#00C2E3] laPanton[312]=[RGB(0,167,212);#00A7D4] laPanton[313]=[RGB(0,146,199);#0092C7] laPanton[314]=[RGB(0,127,172);#007FAC] laPanton[315]=[RGB(0,102,133);#006685] laPanton[316]=[RGB(0,70,80);#004650] laPanton[317]=[RGB(191,229,234);#BFE5EA] laPanton[318]=[RGB(142,219,229);#8EDBE5] laPanton[319]=[RGB(54,204,218);#36CCDA] laPanton[320]=[RGB(0,151,172);#0097AC] laPanton[321]=[RGB(0,129,147);#008193] laPanton[322]=[RGB(0,111,122);#006F7A] laPanton[323]=[RGB(0,96,104);#006068] laPanton[324]=[RGB(152,217,219);#98D9DB] laPanton[325]=[RGB(71,199,199);#47C7C7] laPanton[326]=[RGB(0,175,173);#00AFAD] laPanton[327]=[RGB(0,133,121);#008579] laPanton[328]=[RGB(0,113,104);#007168] laPanton[329]=[RGB(0,98,90);#00625A] laPanton[330]=[RGB(0,82,77);#00524D] laPanton[331]=[RGB(178,231,223);#B2E7DF] laPanton[332]=[RGB(159,228,219);#9FE4DB] laPanton[333]=[RGB(67,217,199);#43D9C7] laPanton[334]=[RGB(0,152,120);#009878] laPanton[335]=[RGB(0,123,99);#007B63] laPanton[336]=[RGB(0,102,81);#006651] laPanton[337]=[RGB(148,216,200);#94D8C8] laPanton[338]=[RGB(118,209,189);#76D1BD] laPanton[339]=[RGB(0,176,139);#00B08B] laPanton[340]=[RGB(0,148,96);#009460] laPanton[341]=[RGB(0,120,86);#007856] laPanton[342]=[RGB(0,106,78);#006A4E] laPanton[343]=[RGB(0,83,62);#00533E] laPanton[344]=[RGB(166,222,193);#A6DEC1] laPanton[345]=[RGB(137,213,175);#89D5AF] laPanton[346]=[RGB(94,201,152);#5EC998] laPanton[347]=[RGB(0,149,67);#009543] laPanton[348]=[RGB(0,126,58);#007E3A] laPanton[349]=[RGB(0,98,51);#006233] laPanton[350]=[RGB(24,71,44);#18472C] laPanton[351]=[RGB(167,230,196);#A7E6C4] laPanton[352]=[RGB(135,224,176);#87E0B0] laPanton[353]=[RGB(106,220,162);#6ADCA2] laPanton[354]=[RGB(0,171,57);#00AB39] laPanton[355]=[RGB(0,149,48);#009530] laPanton[356]=[RGB(0,114,41);#007229] laPanton[357]=[RGB(15,77,42);#0F4D2A] laPanton[358]=[RGB(165,219,146);#A5DB92] laPanton[359]=[RGB(159,217,139);#9FD98B] laPanton[360]=[RGB(85,190,71);#55BE47] laPanton[361]=[RGB(18,173,43);#12AD2B] laPanton[362]=[RGB(40,151,40);#289728] laPanton[363]=[RGB(47,137,39);#2F8927] laPanton[364]=[RGB(49,112,35);#317023] laPanton[365]=[RGB(204,229,162);#CCE5A2] laPanton[366]=[RGB(188,225,141);#BCE18D] laPanton[367]=[RGB(164,216,103);#A4D867] laPanton[368]=[RGB(98,189,25);#62BD19] laPanton[369]=[RGB(79,166,0);#4FA600] laPanton[370]=[RGB(79,138,16);#4F8A10] laPanton[371]=[RGB(74,96,28);#4A601C] laPanton[372]=[RGB(215,233,161);#D7E9A1] laPanton[373]=[RGB(205,233,133);#CDE985] laPanton[374]=[RGB(186,229,95);#BAE55F] laPanton[375]=[RGB(135,211,0);#87D300] laPanton[376]=[RGB(118,185,0);#76B900] laPanton[377]=[RGB(103,144,0);#679000] laPanton[378]=[RGB(77,90,18);#4D5A12] laPanton[379]=[RGB(221,229,108);#DDE56C] laPanton[380]=[RGB(211,225,60);#D3E13C] laPanton[381]=[RGB(200,219,0);#C8DB00] laPanton[382]=[RGB(182,211,0);#B9D300] laPanton[383]=[RGB(159,170,0);#9FAA00] laPanton[384]=[RGB(139,144,0);#8B9000] laPanton[385]=[RGB(110,106,18);#6E6A12] laPanton[386]=[RGB(229,233,110);#E5E96E] laPanton[387]=[RGB(222,230,58);#DEE63A] laPanton[388]=[RGB(215,227,0);#D7E300] laPanton[389]=[RGB(198,219,0);#C6DB00] laPanton[390]=[RGB(178,188,0);#B2BC00] laPanton[391]=[RGB(149,146,0);#959200] laPanton[392]=[RGB(127,120,0);#7F7800] laPanton[393]=[RGB(237,235,143);#EDEB8F] laPanton[394]=[RGB(233,231,63);#E9E73F] laPanton[395]=[RGB(228,228,0);#E4E400] laPanton[396]=[RGB(221,223,0);#DDDF00] laPanton[397]=[RGB(190,184,0);#BEB800] laPanton[398]=[RGB(171,162,0);#ABA200] laPanton[399]=[RGB(153,141,0);#998D00] laPanton[400]=[RGB(205,201,196);#CDC9C4] laPanton[401]=[RGB(189,184,177);#BDB8B1] laPanton[402]=[RGB(173,165,157);#ADA59D] laPanton[403]=[RGB(152,143,134);#988F86] laPanton[404]=[RGB(124,115,105);#7C7369] laPanton[405]=[RGB(100,90,80);#645A50] laPanton[406]=[RGB(202,196,194);#CAC4C2] laPanton[408]=[RGB(165,153,151);#A59997] laPanton[409]=[RGB(148,134,131);#948683] laPanton[410]=[RGB(123,110,106);#7B6E6A] laPanton[411]=[RGB(98,82,72);#62524E] laPanton[412]=[RGB(55,43,39);#372B27] laPanton[413]=[RGB(200,201,195);#C8C9C3] laPanton[414]=[RGB(181,182,176);#B5B6B0] laPanton[415]=[RGB(157,157,150);#9D9D96] laPanton[416]=[RGB(135,136,127);#87887F] laPanton[417]=[RGB(110,111,100);#6E6F64] laPanton[418]=[RGB(90,91,81);#5A5B51] laPanton[419]=[RGB(31,33,28);#1F211C] laPanton[420]=[RGB(204,204,204);#CCCCCC] laPanton[421]=[RGB(186,187,188);#BABBBC] laPanton[422]=[RGB(169,170,171);#A9AAAB] laPanton[423]=[RGB(147,148,149);#939495] laPanton[424]=[RGB(118,122,125);#767A7D] laPanton[425]=[RGB(86,89,92);#56595C] laPanton[426]=[RGB(33,36,36);#212424] laPanton[427]=[RGB(210,214,217);#D2D6D9] laPanton[428]=[RGB(195,200,205);#C3C8CD] laPanton[429]=[RGB(168,173,180);#A8ADB4] laPanton[430]=[RGB(134,143,152);#868F98] laPanton[431]=[RGB(97,106,116);#616A74] laPanton[432]=[RGB(65,75,86);#414B56] laPanton[433]=[RGB(33,41,48);#212930] laPanton[434]=[RGB(211,201,206);#D3C9CE] laPanton[435]=[RGB(200,186,192);#C8BAC0] laPanton[436]=[RGB(183,166,173);#B7A6AD] laPanton[437]=[RGB(132,110,116);#846E74] laPanton[438]=[RGB(81,62,62);#513E3E] laPanton[439]=[RGB(68,53,53);#443535] laPanton[440]=[RGB(57,46,44);#392E2C] laPanton[441]=[RGB(203,209,212);#CBD1D4] laPanton[442]=[RGB(179,188,192);#B3BCC0] laPanton[443]=[RGB(153,163,166);#99A3A6] laPanton[444]=[RGB(123,133,138);#7B858A] laPanton[445]=[RGB(79,85,89);#4F5559] laPanton[446]=[RGB(61,66,66);#3D4242] laPanton[447]=[RGB(50,53,50);#323532] laPanton[448]=[RGB(71,62,38);#473E26] laPanton[449]=[RGB(77,67,37);#4D4325] laPanton[450]=[RGB(81,72,38);#514826] laPanton[451]=[RGB(159,155,116);#9F9B74] laPanton[452]=[RGB(181,178,146);#B5B292] laPanton[453]=[RGB(200,197,172);#C8C5AC] laPanton[454]=[RGB(213,211,191);#D5D3BF] laPanton[455]=[RGB(101,84,21);#655415] laPanton[456]=[RGB(151,127,9);#977F09] laPanton[457]=[RGB(178,146,0);#B29200] laPanton[458]=[RGB(219,202,103);#DBCA67] laPanton[459]=[RGB(223,210,124);#DFD27C] laPanton[460]=[RGB(229,219,151);#E5DB97] laPanton[461]=[RGB(231,227,181);#E7E3B5] laPanton[462]=[RGB(86,63,35);#563F23] laPanton[463]=[RGB(109,73,33);#6D4921] laPanton[464]=[RGB(133,87,35);#855723] laPanton[465]=[RGB(185,156,107);#B99C6B] laPanton[466]=[RGB(202,179,136);#CAB388] laPanton[467]=[RGB(213,196,161);#D5C4A1] laPanton[468]=[RGB(224,212,187);#E0D4BB] laPanton[469]=[RGB(97,52,24);#613418] laPanton[470]=[RGB(155,77,27);#9B4D1B] laPanton[471]=[RGB(183,83,18);#B75312] laPanton[472]=[RGB(228,153,105);#E49969] laPanton[473]=[RGB(237,185,150);#EDB996] laPanton[474]=[RGB(238,197,169);#EEC5A9] laPanton[475]=[RGB(240,208,187);#F0D0BB] laPanton[476]=[RGB(81,49,39);#513127] laPanton[477]=[RGB(94,47,36);#5E2F24] laPanton[478]=[RGB(114,54,41);#723629] laPanton[479]=[RGB(173,128,108);#AD806C] laPanton[480]=[RGB(200,169,154);#C8A99A] laPanton[481]=[RGB(213,189,176);#D5BDB0] laPanton[482]=[RGB(221,206,196);#DDCEC4] laPanton[483]=[RGB(106,46,34);#6A2E22] laPanton[484]=[RGB(159,45,32);#9F2D20] laPanton[485]=[RGB(220,36,31);#DC241F] laPanton[486]=[RGB(236,147,132);#EC9384] laPanton[487]=[RGB(236,171,157);#ECAB9D] laPanton[488]=[RGB(236,187,175);#ECBBAF] laPanton[489]=[RGB(235,205,195);#EBCDC3] laPanton[490]=[RGB(90,39,42);#5A272A] laPanton[491]=[RGB(119,43,47);#772B2F] laPanton[492]=[RGB(145,53,59);#91353B] laPanton[494]=[RGB(231,167,182);#E7A7B6] laPanton[495]=[RGB(237,184,197);#EDB8C5] laPanton[496]=[RGB(239,196,206);#EFC4CE] laPanton[497]=[RGB(78,42,40);#4E2A28] laPanton[498]=[RGB(104,50,46);#68322E] laPanton[499]=[RGB(118,57,49);#763931] laPanton[500]=[RGB(200,134,145);#C88691] laPanton[501]=[RGB(222,172,183);#DEACB7] laPanton[502]=[RGB(229,191,199);#E5BFC7] laPanton[503]=[RGB(233,204,210);#E9CCD2] laPanton[504]=[RGB(78,32,41);#4E2029] laPanton[505]=[RGB(110,38,57);#6E2639] laPanton[506]=[RGB(126,43,66);#7E2B42] laPanton[507]=[RGB(211,141,166);#D38DA6] laPanton[508]=[RGB(226,171,191);#E2ABBF] laPanton[509]=[RGB(231,185,202);#E7B9CA] laPanton[510]=[RGB(233,194,209);#E9C2D1] laPanton[511]=[RGB(96,36,78);#60244E] laPanton[512]=[RGB(126,34,113);#7E2271] laPanton[513]=[RGB(149,40,143);#95288F] laPanton[514]=[RGB(211,133,200);#D385C8] laPanton[515]=[RGB(223,165,214);#DFA5D6] laPanton[516]=[RGB(231,186,223);#E7BADF] laPanton[517]=[RGB(235,202,227);#EBCAE3] laPanton[518]=[RGB(75,42,70);#4B2A46] laPanton[519]=[RGB(90,45,95);#5A2D5F] laPanton[520]=[RGB(104,47,115);#682F73] laPanton[521]=[RGB(173,133,186);#AD85BA] laPanton[522]=[RGB(189,158,202);#BD9ECA] laPanton[523]=[RGB(203,178,213);#CBB2D5] laPanton[524]=[RGB(218,204,225);#DACCE1] laPanton[525]=[RGB(81,38,90);#51265A] laPanton[526]=[RGB(97,32,127);#61207F] laPanton[527]=[RGB(110,32,160);#6E20A0] laPanton[528]=[RGB(167,116,205);#A774CD] laPanton[529]=[RGB(198,164,225);#C6A4E1] laPanton[530]=[RGB(207,177,227);#CFB1E3] laPanton[531]=[RGB(215,196,231);#D7C4E7] laPanton[532]=[RGB(38,42,57);#262A39] laPanton[533]=[RGB(37,51,85);#253355] laPanton[534]=[RGB(41,63,111);#293F6F] laPanton[535]=[RGB(149,161,195);#95A1C3] laPanton[536]=[RGB(164,177,205);#A4B1CD] laPanton[537]=[RGB(189,198,218);#BDC6DA] laPanton[538]=[RGB(210,215,228);#D2D7E4] laPanton[539]=[RGB(0,42,70);#002A46] laPanton[540]=[RGB(0,47,93);#002F5D] laPanton[541]=[RGB(0,60,121);#003C79] laPanton[542]=[RGB(89,152,201);#5998C9] laPanton[543]=[RGB(147,185,220);#93B9DC] laPanton[544]=[RGB(177,203,229);#B1CBE5] laPanton[545]=[RGB(191,211,230);#BFD3E6] laPanton[546]=[RGB(0,52,64);#003440] laPanton[547]=[RGB(0,62,81);#003E51] laPanton[548]=[RGB(0,65,89);#004159] laPanton[549]=[RGB(91,151,177);#5B97B1] laPanton[550]=[RGB(133,176,198);#85B0C6] laPanton[551]=[RGB(159,193,211);#9FC1D3] laPanton[552]=[RGB(185,208,220);#B9D0DC] laPanton[553]=[RGB(33,66,50);#214232] laPanton[554]=[RGB(36,96,74);#24604A] laPanton[555]=[RGB(19,105,78);#13694E] laPanton[556]=[RGB(116,161,142);#74A18E] laPanton[557]=[RGB(152,186,172);#98BAAC] laPanton[558]=[RGB(172,199,189);#ACC7BD] laPanton[559]=[RGB(192,212,205);#C0D4CD] laPanton[560]=[RGB(34,72,63);#22483F] laPanton[561]=[RGB(15,98,89);#0F6259] laPanton[562]=[RGB(0,119,112);#007770] laPanton[563]=[RGB(114,184,180);#72B8B4] laPanton[564]=[RGB(152,204,201);#98CCC9] laPanton[565]=[RGB(185,220,218);#B9DCDA] laPanton[566]=[RGB(205,227,226);#CDE3E2] laPanton[567]=[RGB(24,69,59);#18453B] laPanton[569]=[RGB(0,132,120);#008478] laPanton[570]=[RGB(118,193,190);#76C6BE] laPanton[571]=[RGB(157,214,207);#9DD6CF] laPanton[572]=[RGB(180,222,219);#B4DEDB] laPanton[573]=[RGB(193,226,222);#C1E2DE] laPanton[574]=[RGB(64,79,36);#404F24] laPanton[575]=[RGB(86,115,46);#56732E] laPanton[576]=[RGB(102,142,60);#668E3C] laPanton[577]=[RGB(178,200,145);#B2C891] laPanton[578]=[RGB(189,208,160);#BDD0A0] laPanton[579]=[RGB(197,213,169);#C5D5A9] laPanton[580]=[RGB(207,221,187);#CFDDBB] laPanton[581]=[RGB(96,90,18);#605A12] laPanton[582]=[RGB(136,134,0);#888600] laPanton[583]=[RGB(171,180,0);#ABB400] laPanton[584]=[RGB(203,211,76);#CBD34C] laPanton[585]=[RGB(216,219,111);#D8DB6F] laPanton[586]=[RGB(221,225,138);#DDE18A] laPanton[587]=[RGB(226,229,157);#E2E59F] laPanton[600]=[RGB(238,235,182);#EEEBB6] laPanton[601]=[RGB(238,234,165);#EEEAA5] laPanton[602]=[RGB(238,232,141);#EEE88D] laPanton[603]=[RGB(237,226,94);#EDE25E] laPanton[604]=[RGB(234,219,27);#EADB1B] laPanton[605]=[RGB(224,202,0);#E0CA00] laPanton[606]=[RGB(216,189,0);#D8BD00] laPanton[607]=[RGB(235,233,195);#EBE9C3] laPanton[608]=[RGB(223,230,180);#E9E6B4] laPanton[609]=[RGB(231,226,154);#E7E29A] laPanton[610]=[RGB(226,217,115);#E2D973] laPanton[611]=[RGB(216,204,70);#D8CC46] laPanton[612]=[RGB(196,179,0);#C4B300] laPanton[613]=[RGB(179,157,0);#B39D00] laPanton[614]=[RGB(227,225,193);#E3E1C1] laPanton[615]=[RGB(221,219,177);#DDDBB1] laPanton[616]=[RGB(215,210,157);#D7D29D] laPanton[617]=[RGB(201,195,127);#C9C37F] laPanton[618]=[RGB(180,168,81);#B4A851] laPanton[619]=[RGB(156,142,42);#9C8E2A] laPanton[620]=[RGB(136,120,17);#887811] laPanton[621]=[RGB(210,223,220);#D2DFDC] laPanton[622]=[RGB(189,210,204);#BDD2CC] laPanton[623]=[RGB(158,188,179);#9EBCB3] laPanton[624]=[RGB(120,160,149);#78A095] laPanton[625]=[RGB(81,130,116);#518274] laPanton[626]=[RGB(31,86,71);#1F5647] laPanton[627]=[RGB(3,45,35);#032D23] laPanton[628]=[RGB(200,226,232);#C8E2E8] laPanton[629]=[RGB(170,218,229);#AADAE5] laPanton[630]=[RGB(130,203,221);#82CBDD] laPanton[631]=[RGB(72,184,210);#48B8D2] laPanton[632]=[RGB(0,158,192);#009EC0] laPanton[633]=[RGB(0,124,164);#007CA4] laPanton[634]=[RGB(0,98,140);#00628C] laPanton[635]=[RGB(173,221,235);#ADDDEB] laPanton[636]=[RGB(141,212,233);#8DD4E9] laPanton[637]=[RGB(91,200,231);#5BC8E7] laPanton[638]=[RGB(0,178,222);#00B2DE] laPanton[639]=[RGB(0,154,207);#009ACF] laPanton[640]=[RGB(0,133,194);#0085C2] laPanton[641]=[RGB(0,112,178);#0070B2] laPanton[642]=[RGB(206,217,231);#CED9E7] laPanton[643]=[RGB(197,210,227);#C5D2E3] laPanton[644]=[RGB(151,177,208);#97B1D0] laPanton[645]=[RGB(116,152,192);#7498C0] laPanton[646]=[RGB(87,129,174);#5781AE] laPanton[647]=[RGB(17,86,140);#11568C] laPanton[648]=[RGB(0,43,95);#002B5F] laPanton[649]=[RGB(212,220,232);#D4DCE8] laPanton[650]=[RGB(194,205,224);#C2CDE0] laPanton[651]=[RGB(153,174,206);#99AECE] laPanton[652]=[RGB(111,141,185);#6F8DB9] laPanton[653]=[RGB(42,86,143);#2A568F] laPanton[654]=[RGB(0,48,102);#003066] laPanton[655]=[RGB(0,34,82);#002252] laPanton[656]=[RGB(212,221,237);#D4DDED] laPanton[657]=[RGB(191,208,234);#BFD0EA] laPanton[658]=[RGB(161,187,228);#A1BBE4] laPanton[659]=[RGB(110,150,213);#6E96D5] laPanton[660]=[RGB(41,109,193);#296DC1] laPanton[661]=[RGB(0,53,150);#003596] laPanton[662]=[RGB(0,34,128);#002280] laPanton[663]=[RGB(222,216,230);#DED8E6] laPanton[664]=[RGB(215,208,224);#D7D0E0] laPanton[665]=[RGB(197,187,211);#C5BBD3] laPanton[666]=[RGB(163,146,183);#A392B7] laPanton[667]=[RGB(124,100,149);#7C6495] laPanton[668]=[RGB(98,74,126);#624A7E] laPanton[669]=[RGB(67,44,95);#432C5F] laPanton[670]=[RGB(234,212,228);#EAD4E4] laPanton[671]=[RGB(230,193,219);#E6C1DB] laPanton[672]=[RGB(225,167,207);#E1A7CF] laPanton[673]=[RGB(218,137,190);#DA89BE] laPanton[674]=[RGB(206,98,164);#CE62A4] laPanton[675]=[RGB(182,42,121);#B62A79] laPanton[676]=[RGB(163,0,89);#A30059] laPanton[677]=[RGB(229,209,223);#E5D1DF] laPanton[678]=[RGB(226,201,218);#E2C9DA] laPanton[679]=[RGB(222,189,212);#DEBDD4] laPanton[680]=[RGB(203,151,183);#CB97B7] laPanton[681]=[RGB(184,116,158);#B8749E] laPanton[682]=[RGB(156,72,120);#9C4878] laPanton[683]=[RGB(124,34,80);#7C2250] laPanton[684]=[RGB(229,202,217);#E5CAD9] laPanton[685]=[RGB(225,188,208);#E1BCD0] laPanton[686]=[RGB(219,174,198);#DBAEC6] laPanton[687]=[RGB(198,134,169);#C686A9] laPanton[688]=[RGB(180,107,147);#B46B93] laPanton[689]=[RGB(149,64,111);#95416F] laPanton[690]=[RGB(109,35,72);#6D2348] laPanton[691]=[RGB(231,205,210);#E7CDD2] laPanton[692]=[RGB(226,193,200);#E2C1C8] laPanton[693]=[RGB(217,167,177);#D9A7B1] laPanton[694]=[RGB(202,144,156);#CA909C] laPanton[695]=[RGB(176,104,118);#B06876] laPanton[696]=[RGB(148,69,84);#944554] laPanton[697]=[RGB(129,51,61);#81333D] laPanton[698]=[RGB(237,207,215);#EDCFD7] laPanton[699]=[RGB(240,194,205);#F0C2CD] laPanton[700]=[RGB(236,169,185);#ECA9B9] laPanton[701]=[RGB(229,141,162);#E58DA2] laPanton[702]=[RGB(213,100,124);#D5647C] laPanton[703]=[RGB(186,57,78);#BA394E] laPanton[704]=[RGB(162,38,48);#A22630] laPanton[705]=[RGB(242,214,222);#F2D6DE] laPanton[706]=[RGB(245,199,212);#F5C7D4] laPanton[707]=[RGB(245,176,193);#F5B0C1] laPanton[708]=[RGB(245,144,166);#F590A6] laPanton[709]=[RGB(239,103,130);#EF6782] laPanton[710]=[RGB(229,70,97);#E54661] laPanton[711]=[RGB(211,41,57);#D32939] laPanton[712]=[RGB(250,205,174);#FACDAE] laPanton[713]=[RGB(251,195,153);#FBC399] laPanton[714]=[RGB(253,177,121);#FDB179] laPanton[715]=[RGB(249,150,74);#F9964A] laPanton[716]=[RGB(241,124,14);#F17C0E] laPanton[717]=[RGB(222,97,0);#DE6100] laPanton[718]=[RGB(207,82,0);#CF5200] laPanton[719]=[RGB(239,207,184);#EFCFB8] laPanton[720]=[RGB(236,195,165);#ECC3A5] laPanton[721]=[RGB(229,174,134);#E5AE86] laPanton[722]=[RGB(213,143,89);#D58F59] laPanton[723]=[RGB(192,114,47);#C0722F] laPanton[724]=[RGB(154,75,0);#9A4B00] laPanton[725]=[RGB(132,59,0);#843B00] laPanton[726]=[RGB(232,206,187);#E8CEBB] laPanton[727]=[RGB(225,190,164);#E1BEA4] laPanton[728]=[RGB(213,170,136);#D5AA88] laPanton[729]=[RGB(195,142,99);#C38E63] laPanton[730]=[RGB(172,112,61);#AC703D] laPanton[731]=[RGB(121,63,13);#793F0D] laPanton[732]=[RGB(100,48,10);#64300A] laPanton[801]=[RGB(0,167,216);#00A7D8] laPanton[802]=[RGB(91,221,69);#5BDD45] laPanton[803]=[RGB(225,232,5);#FFE805] laPanton[804]=[RGB(255,162,67);#FFA243] laPanton[805]=[RGB(255,88,94);#FF585E] laPanton[806]=[RGB(255,28,172);#FF1CAC] laPanton[807]=[RGB(215,8,178);#D708B2] laPanton[808]=[RGB(0,174,151);#00AE97] laPanton[809]=[RGB(225,228,0);#E1E400] laPanton[810]=[RGB(225,206,9);#FFCE09] laPanton[811]=[RGB(255,119,80);#FF7750] laPanton[812]=[RGB(255,52,133);#FF3485] laPanton[813]=[RGB(234,18,175);#EA12AF] laPanton[814]=[RGB(126,96,206);#7E60CE] laPanton[1205]=[RGB(243,226,167);#F3E2A7] laPanton[1215]=[RGB(245,221,146);#F5DD92] laPanton[1225]=[RGB(253,199,69);#FDC745] laPanton[1235]=[RGB(255,179,0);#FFB300] laPanton[1245]=[RGB(198,146,0);#C69200] laPanton[1255]=[RGB(170,128,14);#AA800E] laPanton[1265]=[RGB(131,101,20);#836514] laPanton[1345]=[RGB(251,207,141);#FBCF8D] laPanton[1355]=[RGB(253,200,125);#FDC87D] laPanton[1365]=[RGB(255,183,84);#FFB754] laPanton[1375]=[RGB(255,154,0);#FF9A00] laPanton[1385]=[RGB(214,117,0);#D67500] laPanton[1395]=[RGB(158,96,9);#9E6209] laPanton[1405]=[RGB(108,71,19);#6C4713] laPanton[1485]=[RGB(255,181,123);#FFB57B] laPanton[1495]=[RGB(255,150,59);#FF963B] laPanton[1505]=[RGB(255,114,0);#FF7200] laPanton[1525]=[RGB(202,78,0);#CA4E00] laPanton[1535]=[RGB(147,63,0);#933F00] laPanton[1545]=[RGB(81,38,11);#51260B] laPanton[1555]=[RGB(255,191,160);#FFBFA0] laPanton[1565]=[RGB(255,169,125);#FFA97D] laPanton[1575]=[RGB(255,134,66);#FF8642] laPanton[1585]=[RGB(255,105,0);#FF6900] laPanton[1595]=[RGB(218,92,5);#DA5C05] laPanton[1605]=[RGB(162,74,19);#A24A13] laPanton[1615]=[RGB(133,60,16);#853C10] laPanton[1625]=[RGB(255,162,139);#FFA28B] laPanton[1635]=[RGB(255,142,112);#FF8E70] laPanton[1645]=[RGB(255,108,59);#FF6C3B] laPanton[1655]=[RGB(255,82,0);#FF5200] laPanton[1665]=[RGB(229,72,0);#E54800] laPanton[1675]=[RGB(168,60,15);#A83C0F] laPanton[1685]=[RGB(134,53,20);#863514] laPanton[1765]=[RGB(254,157,176);#FE9DB0] laPanton[1767]=[RGB(250,175,194);#FAAFC2] laPanton[1775]=[RGB(255,133,154);#FF859A] laPanton[1777]=[RGB(251,101,129);#FB6581] laPanton[1785]=[RGB(249,69,91);#F9455B] laPanton[1787]=[RGB(249,66,95);#F9425F] laPanton[1788]=[RGB(240,34,51);#F02233] laPanton[1795]=[RGB(216,31,42);#D81F2A] laPanton[1797]=[RGB(208,36,51);#D02433] laPanton[1805]=[RGB(176,35,42);#B0232A] laPanton[1807]=[RGB(161,40,48);#A12830] laPanton[1815]=[RGB(124,33,30);#7C211E] laPanton[1817]=[RGB(94,39,40);#5E2728] laPanton[1895]=[RGB(243,188,212);#F3BCD4] laPanton[1905]=[RGB(245,155,189);#F59BBD] laPanton[1915]=[RGB(242,85,138);#F2558A] laPanton[1925]=[RGB(228,0,80);#E40050] laPanton[1935]=[RGB(203,4,71);#CB0447] laPanton[1945]=[RGB(170,17,63);#AA113F] laPanton[1955]=[RGB(147,23,59);#93173B] laPanton[2365]=[RGB(239,195,228);#EFC3E4] laPanton[2375]=[RGB(226,112,205);#E270CD] laPanton[2385]=[RGB(215,51,180);#D733B4] laPanton[2395]=[RGB(196,0,152);#C40098] laPanton[2405]=[RGB(167,0,132);#A70084] laPanton[2415]=[RGB(151,0,118);#970076] laPanton[2425]=[RGB(130,0,99);#820063] laPanton[2562]=[RGB(207,165,228);#CFA5E4] laPanton[2563]=[RGB(199,157,216);#C79DD8] laPanton[2567]=[RGB(187,153,218);#BB99DA] laPanton[2572]=[RGB(192,132,220);#C084DC] laPanton[2573]=[RGB(178,121,200);#B279C8] laPanton[2577]=[RGB(162,118,204);#A276CC] laPanton[2582]=[RGB(162,76,200);#A24CC8] laPanton[2583]=[RGB(153,80,178);#9950B2] laPanton[2587]=[RGB(131,72,181);#8348B5] laPanton[2592]=[RGB(144,22,178);#9016B2] laPanton[2593]=[RGB(126,43,151);#7E2B97] laPanton[2597]=[RGB(89,5,141);#59058D] laPanton[2602]=[RGB(125,9,150);#7D0996] laPanton[2603]=[RGB(104,23,127);#68177F] laPanton[2607]=[RGB(79,2,124);#4F027C] laPanton[2612]=[RGB(106,26,122);#6A1A7A] laPanton[2613]=[RGB(97,23,116);#611774] laPanton[2617]=[RGB(75,11,113);#4B0B71] laPanton[2622]=[RGB(87,36,88);#572458] laPanton[2623]=[RGB(88,25,99);#581963] laPanton[2627]=[RGB(67,18,95);#43125F] laPanton[2635]=[RGB(191,175,228);#BFAFE4] laPanton[2645]=[RGB(170,148,222);#AA94DE] laPanton[2655]=[RGB(145,115,211);#9173D3] laPanton[2665]=[RGB(122,82,199);#7A52C7] laPanton[2685]=[RGB(59,0,132);#3B0084] laPanton[2695]=[RGB(59,29,89);#381D59] laPanton[2705]=[RGB(162,159,224);#A29FE0] laPanton[2706]=[RGB(196,203,234);#C4CBEA] laPanton[2707]=[RGB(186,208,238);#BDD0EE] laPanton[2708]=[RGB(177,197,234);#B1C5EA] laPanton[2715]=[RGB(133,128,216);#8580D8] laPanton[2716]=[RGB(148,161,226);#94A1E2] laPanton[2717]=[RGB(161,189,234);#A1BDEA] laPanton[2718]=[RGB(84,126,217);#547ED9] laPanton[2725]=[RGB(94,83,199);#5E53C7] laPanton[2726]=[RGB(69,85,199);#4555C7] laPanton[2727]=[RGB(56,120,219);#3878DB] laPanton[2728]=[RGB(0,71,190);#0047BE] laPanton[2735]=[RGB(40,0,146);#280092] laPanton[2736]=[RGB(30,34,174);#1E22AE] laPanton[2738]=[RGB(0,18,157);#00129D] laPanton[2745]=[RGB(34,0,122);#22007A] laPanton[2746]=[RGB(26,28,150);#1A1C96] laPanton[2747]=[RGB(0,35,126);#00237E] laPanton[2748]=[RGB(0,26,123);#001A7B] laPanton[2755]=[RGB(27,0,105);#1B0069] laPanton[2756]=[RGB(21,29,113);#151D71] laPanton[2757]=[RGB(0,32,101);#002065] laPanton[2758]=[RGB(0,29,104);#001D68] laPanton[2765]=[RGB(27,12,85);#1B0C55] laPanton[2766]=[RGB(21,28,85);#151C55] laPanton[2767]=[RGB(11,35,69);#0B2345] laPanton[2768]=[RGB(3,30,81);#,1E+052] laPanton[2905]=[RGB(146,201,235);#92C9EB] laPanton[2915]=[RGB(98,180,232);#62B4E8] laPanton[2925]=[RGB(0,146,221);#0092DD] laPanton[2935]=[RGB(0,91,195);#005BC3] laPanton[2945]=[RGB(0,83,165);#0053A5] laPanton[2955]=[RGB(0,59,111);#003B6F] laPanton[2965]=[RGB(0,49,81);#003151] laPanton[2975]=[RGB(165,217,236);#A5D9EC] laPanton[2985]=[RGB(64,189,232);#40BDE8] laPanton[2995]=[RGB(0,162,225);#00A2E1] laPanton[3005]=[RGB(0,118,204);#0076CC] laPanton[3015]=[RGB(0,96,161);#0060A1] laPanton[3025]=[RGB(0,73,110);#00496E] laPanton[3035]=[RGB(0,58,79);#003A4F] laPanton[3105]=[RGB(111,210,228);#6FD2E4] laPanton[3115]=[RGB(0,196,220);#00C4DC] laPanton[3125]=[RGB(0,174,206);#00AECE] laPanton[3135]=[RGB(0,146,189);#0092BA] laPanton[3145]=[RGB(0,122,151);#007A97] laPanton[3155]=[RGB(0,102,124);#00667C] laPanton[3165]=[RGB(0,79,93);#004F5D] laPanton[3242]=[RGB(117,217,216);#75D9D8] laPanton[3245]=[RGB(123,221,216);#7BDDD8] laPanton[3248]=[RGB(123,210,200);#7BD2C8] laPanton[3252]=[RGB(65,210,210);#41D2D2] laPanton[3255]=[RGB(50,212,203);#32D4CB] laPanton[3258]=[RGB(67,196,183);#43C4B7] laPanton[3262]=[RGB(0,186,185);#00BAB9] laPanton[3265]=[RGB(0,194,182);#00C2B6] laPanton[3268]=[RGB(0,169,148);#00A994] laPanton[3272]=[RGB(0,161,156);#00A19C] laPanton[3275]=[RGB(0,176,157);#00B09D] laPanton[3278]=[RGB(0,153,122);#00997A] laPanton[3282]=[RGB(0,132,128);#008480] laPanton[3285]=[RGB(0,147,132);#009384] laPanton[3288]=[RGB(0,126,100);#007E64] laPanton[3292]=[RGB(0,90,83);#005A53] laPanton[3295]=[RGB(0,124,111);#007C6F] laPanton[3298]=[RGB(0,103,82);#006752] laPanton[3302]=[RGB(0,66,60);#00423C] laPanton[3305]=[RGB(0,74,65);#004A41] laPanton[3308]=[RGB(0,66,54);#004236] laPanton[3375]=[RGB(129,224,199);#81E0C7] laPanton[3385]=[RGB(59,214,178);#3BD6B2] laPanton[3395]=[RGB(0,197,144);#00C590] laPanton[3405]=[RGB(0,174,104);#00AE68] laPanton[3415]=[RGB(0,119,75);#00774B] laPanton[3425]=[RGB(0,102,68);#006644] laPanton[3435]=[RGB(0,71,49);#004731] laPanton[3935]=[RGB(240,235,122);#F0EB7A] laPanton[3945]=[RGB(239,230,0);#EFE600] laPanton[3955]=[RGB(236,225,0);#ECE100] laPanton[3965]=[RGB(233,220,0);#E9DC00] laPanton[3975]=[RGB(187,168,0);#BBA800] laPanton[3985]=[RGB(155,137,0);#9B8900] laPanton[3995]=[RGB(106,91,7);#6A5B07] laPanton[4485]=[RGB(93,71,24);#5D4718] laPanton[4495]=[RGB(131,110,44);#836E2C] laPanton[4505]=[RGB(155,137,72);#9B8948] laPanton[4515]=[RGB(181,165,112);#B5A570] laPanton[4525]=[RGB(197,186,142);#C5BA8E] laPanton[4535]=[RGB(212,204,170);#D4CCAA] laPanton[4545]=[RGB(222,217,194);#DED9C2] laPanton[4625]=[RGB(78,38,20);#4E2614] laPanton[4635]=[RGB(144,90,51);#905A33] laPanton[4645]=[RGB(177,127,92);#B17F5C] laPanton[4655]=[RGB(192,148,119);#C09477] laPanton[4665]=[RGB(209,174,151);#D1AE97] laPanton[4675]=[RGB(221,194,176);#DDC2B0] laPanton[4685]=[RGB(228,210,197);#E4D2C5] laPanton[4695]=[RGB(83,40,33);#532821] laPanton[4705]=[RGB(127,76,62);#7F4C3E] laPanton[4715]=[RGB(155,110,95);#9B6E5F] laPanton[4725]=[RGB(178,141,127);#B28D7F] laPanton[4735]=[RGB(197,170,160);#C5AAA0] laPanton[4745]=[RGB(212,190,182);#D4BEB6] laPanton[4755]=[RGB(221,205,199);#DDCDC7] laPanton[4975]=[RGB(68,30,31);#441E1F] laPanton[4985]=[RGB(133,74,80);#854A50] laPanton[4995]=[RGB(161,105,113);#A16971] laPanton[5005]=[RGB(183,132,140);#B7848C] laPanton[5015]=[RGB(209,169,176);#D1A9B0] laPanton[5025]=[RGB(219,188,193);#DBBCC1] laPanton[5035]=[RGB(227,203,208);#E3CBD0] laPanton[5115]=[RGB(75,37,62);#4B253E] laPanton[5125]=[RGB(112,65,101);#704165] laPanton[5135]=[RGB(136,94,128);#885E80] laPanton[5145]=[RGB(161,126,154);#A17E9A] laPanton[5155]=[RGB(192,166,189);#C0A6BD] laPanton[5165]=[RGB(214,197,211);#D6C5D3] laPanton[5175]=[RGB(225,213,222);#E0D5DE] laPanton[5185]=[RGB(69,41,59);#45293B] laPanton[5195]=[RGB(94,58,81);#5E3A51] laPanton[5205]=[RGB(139,104,125);#8B687D] laPanton[5215]=[RGB(177,149,166);#B195A6] laPanton[5225]=[RGB(198,176,190);#C6B0BE] laPanton[5235]=[RGB(212,196,206);#D4C4CE] laPanton[5245]=[RGB(223,212,219);#DFD4DB] laPanton[5255]=[RGB(42,37,75);#2A254B] laPanton[5265]=[RGB(67,59,103);#433B67] laPanton[5275]=[RGB(87,82,126);#57527E] laPanton[5285]=[RGB(133,129,164);#8581A4] laPanton[5295]=[RGB(170,167,193);#AAA7C1] laPanton[5305]=[RGB(193,190,209);#C1BED1] laPanton[5315]=[RGB(212,212,224);#D4D4E0] laPanton[5395]=[RGB(2,37,58);#02253A] laPanton[5405]=[RGB(62,100,126);#3E647E] laPanton[5415]=[RGB(88,121,147);#587993] laPanton[5425]=[RGB(124,152,174);#7C98AE] laPanton[5435]=[RGB(165,184,201);#A5B8C9] laPanton[5445]=[RGB(188,202,214);#BCCAD6] laPanton[5455]=[RGB(204,214,224);#CCD6E0] laPanton[5463]=[RGB(0,40,48);#002830] laPanton[5467]=[RGB(24,53,51);#183533] laPanton[5473]=[RGB(0,98,110);#00626E] laPanton[5477]=[RGB(60,91,89);#3C5B59] laPanton[5483]=[RGB(79,141,151);#4F8D97] laPanton[5487]=[RGB(98,125,124);#627D7C] laPanton[5493]=[RGB(129,173,181);#81ADB5] laPanton[5497]=[RGB(141,160,159);#8DA09F] laPanton[5503]=[RGB(161,195,201);#A1C3C9] laPanton[5507]=[RGB(170,184,185);#AAB8B9] laPanton[5513]=[RGB(190,213,217);#BED5D9] laPanton[5517]=[RGB(191,203,204);#BFCBCC] laPanton[5523]=[RGB(207,222,225);#CFDEE1] laPanton[5527]=[RGB(204,212,212);#CCD4D4] laPanton[5535]=[RGB(27,57,48);#1B3930] laPanton[5545]=[RGB(74,109,98);#4A6D62] laPanton[5555]=[RGB(110,141,130);#6E8D82] laPanton[5565]=[RGB(143,168,160);#8FA8A0] laPanton[5575]=[RGB(169,189,182);#A9BDB6] laPanton[5585]=[RGB(192,207,203);#C0CFCB] laPanton[5595]=[RGB(211,222,219);#D3DEDB] laPanton[5605]=[RGB(25,48,37);#193025] laPanton[5615]=[RGB(90,112,96);#5A7060] laPanton[5625]=[RGB(108,128,114);#6C8072] laPanton[5635]=[RGB(151,166,155);#97A69B] laPanton[5645]=[RGB(177,188,181);#B1BCB5] laPanton[5655]=[RGB(189,197,191);#BDC5BF] laPanton[5665]=[RGB(205,211,205);#CDD3CD] laPanton[5743]=[RGB(62,71,35);#3E4723] laPanton[5747]=[RGB(64,70,22);#404616] laPanton[5753]=[RGB(94,102,57);#5E6639] laPanton[5757]=[RGB(111,115,45);#6F732D] laPanton[5763]=[RGB(110,118,73);#6E7649] laPanton[5767]=[RGB(141,145,80);#8D9150] laPanton[5773]=[RGB(147,152,113);#939871] laPanton[5777]=[RGB(167,171,116);#A7AB74] laPanton[5783]=[RGB(173,178,145);#ADB291] laPanton[5787]=[RGB(193,196,154);#C1C49A] laPanton[5793]=[RGB(189,194,169);#BDC2A9] laPanton[5797]=[RGB(206,209,179);#CED1B3] laPanton[5803]=[RGB(206,210,191);#CED2BF] laPanton[5807]=[RGB(217,220,197);#D9DCC5] laPanton[5815]=[RGB(75,69,22);#4B4516] laPanton[5825]=[RGB(125,118,47);#7D762F] laPanton[5835]=[RGB(157,151,84);#9D9754] laPanton[5845]=[RGB(173,168,107);#ADA86B] laPanton[5855]=[RGB(199,195,151);#C7C397] laPanton[5865]=[RGB(211,207,172);#D3CFAC] laPanton[5875]=[RGB(217,215,185);#D9D7B9] RETURN GETWORDNUM(laPanton[tnPanton],IIF(tcType=='RGB',1,2),';') ENDFUNC
Descargar
Descargue el programa este enlace
Fuentes
Jose Guillermo Ortiz Hernandez
Suscribirse a:
Entradas
(
Atom
)