Mostrando las entradas con la etiqueta Delphi. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Delphi. Mostrar todas las entradas

julio 31, 2008

¿Sabes lo que es un hashmap?

Para los programadores de Java este concepto tal vez no sea tan extraño pues el uso de hashmaps es común, pero para los programadores de Delphi puede sonarles a nuevo.
Un hashmap es una estructura de datos que permite crear un mapa en memoria para la rápida identificación de elementos a partir de un dato usado como llave. Puedes decir: ok si conozco muchas estructuras de datos que permiten hacer eso, ¿cual es la diferencia con los hashmaps?; bien, la principal es que los hashmaps son verdaderamente rápidos.
La librería JCL incluye varias clases para la implementación de diferentes tipos de hashmaps, aquí mostraré una de estas para poder encontrar una cadena a partir de el valor de otra:

Y una vez hecho esto, encontrar una aguja dentro de ese gran pajar se reduce a una simple instrucción:
ShowMessage (Map.GetValue ('Llave5670'));
En este caso hemos ejemplificado usando cadenas (que incluso usando hashmaps se gana mucha velocidad respecto a utilizar los clásicos derivados de TStrings, TStringList), pero las posibilidades se multiplican si te das cuenta de que puedes mapear grandes cantidades de objetos usando esta técnica. Estos pequeños grandes tips hacen la diferencia entre lo que puede parecer un lento cacharro, o un veloz jet a la hora de trabajar con cantidades de datos muy considerables.

junio 29, 2008

Instalar Zeos 6.6.2 rc en Delphi 2007

Hay algunos detallitos para instalar este paquete de componentes particularmente en Delphi 2007 pero te comparto como puedes instalarlos sin problemas ajustando solo una línea de código.

En primera se debe abrir el archivo ZeosDbo.groupproj de la carpeta Delphi11 que se encuentra en la carpeta packages y compilar uno a uno los paquetes que aparecen en el Project Manager.

De estos, el paquete a instalar es el que se llama ZComponentDesign.dproj, pero al instalarlo así nada mas solo da el mensaje de que el paquete ha instalado pero no registra ningún componente, para corregir esto solo hay que editar el código fuente del paquete, esto es dar click con el botón derecho del ratón sobre este paquete y seleccionar la opción View Source desde el Project Manager, y agregar la siguiente línea de código justo antes del end. final:

contains
  ZComponentReg in '..\..\src\component\ZComponentReg.pas';

Una vez hecho esto es solo Guardar los cambios y volver a seleccionar Install y esta vez si estarán todos los componentes registrados.

mayo 29, 2008

¿Porque Delphi 2007?

Cuando me preguntan si he cambiado a Delphi 2007 solo por seguir la moda geek o cuales son mis razones para haber dejado Delphi 6, les contesto:

Bueno!!... son tantas cosas, que es difícil enumerarlas en orden de importancia, pero para muestra unos cuantos ejemplos:

mayo 27, 2008

Delphi Latino BlogRoll

Seguramente muchos aquí conocen el sitio www.delphifeeds.com, un estupendo compendio de bitácoras acerca de Delphi y los productos de CodeGear, donde la comunidad angloparlante comparte muy interesantes artículos con el mundo.

A decir verdad en español también hay una buena cantidad de sitios de bitácoras que ofrecen estupendos artículos, y la cantidad de estas crece día con día; y la gran mayoría realmente merece que se le haga una reseña completa.

Por esta razón he incluido en mi Blog una sección de las llamadas BlogRoll, donde aparecen automáticamente los últimos artículos de las Bitácoras que leo sobre Delphi en Español, para que todos aquellos que me hacen el honor de visitarme puedan también visitar alguna de estas fabulosas páginas, y así potenciarlas. Y también esto es con el afán de incentivar a los brillantes autores a seguirnos deleitando con contenido de gran calidad como nos tienen acostumbrados.

Hasta el momento están incluidas en este BlogRoll bitácoras de renombrados programadores como: Ian Marteens, Nico Aragon, Al Gonzalez, Juan Antonio Castillo, Salvador Jover, Jose Castillo, Jhonny Suarez, y muchos, muchos mas.

Si tienes una página sobre Delphi con sindicación y deseas ser agregado a esta lista solo tienes que pedirlo y con gusto te agregamos. Así que si tienes algo que decirnos o enseñarnos, adelante! Seguro que entre todos podemos convertir el Embarcadero en un Majestuoso Puerto

abril 30, 2008

Ventana Virtual 3D con Delphi

¿Alguna vez pensaste en hacer una aplicación con Delphi a la que pudieras controlar de manera inalámbrica a distancia como la Wii o que la interfaz se ajustara automáticamente y en tiempo real a la posición de tu cuerpo con respecto a la pantalla?

El señor Paul van Dinther nos muestra que es bastante posible en el siguiente video usando Delphi y GLScene

This is a demonstration of a virtual window using OpenGL in GLScene (http://www.glscene.org) and Track IR (http://www.naturalpoint.com)

This technology is being developed by Dinther Product Design to be applied to a range of simulator systems we build. The idea is to allow drivers to lean in order to look around obstacles as we do in a car all the time to cover blind spots.

Cool... ¿no?,

abril 29, 2008

JediCodeFormat un "embellecedor" del código

Si, a todos nos gusta lo bonito; y pocas cosas dan tanto gusto como encontrarte código bien ordenadito e identado apropiadamente. Existen muchos embellecedores de código por ahí, algunos comerciales y otros libres; de entre todos yo prefiero el JediCodeFormat que pertenece al conjunto de maravillas del proyecto JEDI. ¿Porque?, simple, porque provee del código fuente y porque las opciones que maneja son las mejores que he visto, y deja el código chulo de bonito. Además puedes compilar el paquete con la librería RTLVCLOptimize y con las mejoras que esta unidad hace a las rutinas de tratamiento de cadenas, el proceso de formateo (de incluso un proyecto completo) es un tiro. Puedes configurar un botón en la barra de herramientas que automáticamente de formato a la unidad que estés editando en ese momento, y así hacerle el equivalente a un lifting facial instantáneo con un solo click.

Les comparto el archivo de configuración que yo utilizo, que me funciona perfectamente, y que hemos adoptado como un estándar de programación en mi departamento.

Y recuerden:

"Dios es real" (a menos que sea declarado integer o string). =:-)

noviembre 10, 2007

DelphiSpeedUp en tus propios programas

Ya antes he mencionado el plugin DelphiSpeedUp creado por Andreas Hausladen, y ciertamente es un agregado que hace ganar una muy buena velocidad al IDE.

Pues bien, ahora Andreas ha creado una unidad que al agregarla al uses de nuestros proyectos hace que nuestros propios programas se vean beneficiados de las optimizaciones que hace al nivel de la RTL y la VCL.

La unidad se puede descargar desde aqui, y la he probado con unos muy satisfactorios resultados, ciertamente si tienes algún proyecto en el que se realice algún proceso algo pesado, el uso de esta unidad hará que veas una mejora bastante sustancial.

Definitivamente es un gran acierto de Andreas.

julio 26, 2007

G Framework y CapableObjects

Hoy estuve presente en la "Hora Delphi" que regularmente organiza CodeGear, y esto porque hablarían de un tema que particularmente me interesa y es el de los Frameworks de Desarrollo.

Le hicieron una entrevista a Steve Kramer, quien desarrolló un framework para aplicaciones basadas en web llamado G. Este es un framework OpenSource, muy práctico, en el que solo se definen las clases del modelo con las reglas de validación y el framework se encarga del resto. Pueden ver de que va viendo las dos presentaciones que se encuentran disponibles y que muestran lo sencillo que resulta su uso.

Si, es un poco como Ruby on Rails; solo que en Rails hay que definir un controlador para cada clase, mientras que en G la aplicación es el controlador, y solo se ocupa uno del modelo y la vista. Se ha tratado de simplificar las reglas más comunes de validación, así como las formas más comunes de búsquedas en las entidades para dejar que lo simple siga siendo simple. También maneja un esquema de plantillas para poder presentar los datos a nuestro propio gusto, y se ve muy flexible.

Me parecio muy curioso que cuando le preguntan a Steve que cosas le gustaría que tuviera el lenguaje que le facilitarían el desarrollo de este framework, entre otras cosas mencionó las Variables de Clase y que objetos que fueran variables locales en los procedimientos se liberaran automáticamente cuando el procedimiento terminara, como lo hace algunas implementaciones de C++.  Buenas observaciones aunque tal vez yo hubiera agregado muchas cosas más.

Por si fuera poco, G usa Firebird como motor de Base de Datos, y tiene una muy particular manera de manejar la persistencia de los objetos, y la concurrencia en las operaciones de actualización, lo cual lo hace una muy buena opción a considerar. Sin lugar a dudas un excelente framework que esperemos crezca mucho, mucho mas. A mi me parecería fantástico poder ver en este framework un editor de clases como el que integra InstantObjects, estaría de lujo y entonces si sería un SuperWebRad!!

Y a proposito de Frameworks, tambien se dió a conocer la noticia de que el equipo que desarrollaba ECO, se ha separado de CodeGear para formar una nueva empresa llamada CapableObjects. Particularmente me parece una muy buena noticia, se abren las puertas para que la tecnología de ECO se pueda integrar en ambientes como Visual Studio donde auguro que podría tener una mejor acogida, siendo este ambiente el mas apropiado para el desarrollo en .Net; ECO es un gran framework, pero el estar atado a Delphi .Net era un lastre que no le permitia salir a donde realmente se le apreciara.

Y quien sabe tal vez en un futuro no muy lejano pudieran liberar una versión para Win32. Difícil, tal vez, pero uno nunca sabe.

junio 22, 2007

#E un escritorio hecho en Delphi

Muchas veces se ha dicho que con Delphi se puede hacer casi cualquier cosa, bueno este es un claro ejemplo de que tal aseveración es completamente cierta.

 #E (SharpE) es un Shell de escritorio para Windows hecho en Delphi completamente personalizable, puedes configurarlo a tu gusto con las opciones que más utilizas para hacer tu trabajo con Windows más accesible y cómodo.

Pero quizá la mejor parte de el asunto es que se puede descargar el código fuente de la aplicación y aprender enormidades de el. Sobre todo para los casos en que pretendes que tus aplicaciones se integren mas "naturalmente" al ambiente de Windows.

La URL svn para descargar el código fuente es:

"https://sharpe.svn.sourceforge.net/svnroot/sharpe"

Y si, si me ha pasado por la cabeza hacer una adecuación de este programa para basarlo en OpenGL y hacerlo un tanto más al estilo de las modernas interfaces 3D que están tan de moda últimamente; ya veremos que tal =:-)

noviembre 08, 2006

Distribuciones Estadísticas


En esta unidad de Delphi se encuentra la implementación como una jerarquia de clases para el manejo de una buena cantidad de distribuciones estadísticas.

El hecho de que sea una jerarquia de clases le agrega una gran versatilidad a lo que ya de por sí es una herramienta estadística muy poderosa, ya que se pueden extender sus funcionalidades tan solo agregando nuevas clases a la jerarquia o bien sobreescribiendo algunos métodos que aparecen en las clases ancestras como métodos virtuales.

Una distribución muy común es la Chi Cuadrada, ó Ji Cuadrada, muy útil para hacer pruebas de hipótesis, analisis de dependencias, correlaciones, entre otras cosas. El siguiente ejemplo muestra lo sencillo que es hacer cálculos sobre la distribución usando esta herramienta:



Pero esta es solo una de las muchas distribuciones disponibles, entre las distribuciones continuas se encuentran la Normal, Gamma, Beta, F, T de Student, Exponencial, y muchas otras, y además tambien ofrece distribuciones discretas como la hipergeométrica, Binomial, Poisson, etc.

Las posibilidades que ofrece esta herramienta son muchisimas, pues las distribuciones estadísticas tienen muchos usos en cuestiones de predictibilidad, analisis de relaciones y dependencias entre diferentes datos, definitivamente estar familiarizado con conceptos estadísticos te puede dar una gran ventaja sobre otros programadores pues puedes ofrecer productos que brinden mucha más información útil a tus clientes y con esto tener un excelente valor agregado en tus programas.

octubre 29, 2006

Encuesta 2006 sobre Delphi

Nick Hodges ha publicado una encuesta con la idea de obtener retroalimentación de sus clientes y usuarios principalmente. Han habido muchos debates en los artículos que el señor Hodges ha publicado en su Blog, creo que el podría usar los resultados de esta encuesta como un verdadero argumento con la gente de Borland/DevCo para presentar lo que los programadores realmente buscamos en un producto como el suyo. Principalmente me gustó mucho que se haya incluido la pregunta acerca de en que lenguaje prefeririamos tener el IDE, obviamente muchos hispanoparlantes votaremos por el español y ojalá esto haga eco en los oidos de esta empresa.

Por cierto que ya empieza Noviembre y todavia no hay noticias de quien será el comprador de la linea de los IDEs... suspenso... suspenso...

octubre 24, 2006

EasyMVC

Es muy común en algunos entornos de programación como Java por ejemplo el uso de Frameworks o Plataformas de desarrollo, en Delphi no es tan común, los programadores de Delphi estamos muy viciados con todas las bondades que ofrece la VCL y en sí el ambiente RAD del IDE que permite crear muy rápidamente ventanas, modulos de datos, Objetos enlazados a Datos, etc...

Pero en realidad muchas veces desarrollar así de rápido trae como consecuencia de que si se hace sin orden el mantenimiento de una aplicación medianamente compleja muchas veces es insostenible, terminas haciendo lo mismo muchas veces, corregir errores es una tarea titánica que generalmente nunca terminas por hacer bien, y de pensar en dedicar un tiempo a optimizar código mejor ni hablamos.

EasyMVC es un framework de desarrollo para Delphi que pretende traer algo de orden a ese caos, está basado en el conocido modelo MVC Modelo-Vista-Controlador en el que el chiste es separar la forma en como se presentan los datos, de la manera en como se administran y de la manera en como se almacenan, este modelo ha probado su efectividad en diversos proyectos en otros lenguajes como PHP, Ruby, Java, Python, etc. En el ambiente de Delphi existen algunos Frameworks disponibles en sourceforge para su descarga, de entre estos EMvc destaca por la documentación que lo acompaña y la integración completa que tiene con el IDE.

Aún si no eres un asiduo a trabajar con Frameworks te recomiendo que le heches un ojo al código fuente de este proyecto, tiene buenos trucos que le puedes aprender, como el pesado uso que hace de las interfaces y la manera en como se integra con las diferentes versiones de Delphi.

septiembre 12, 2006

Programando a ciegas...literalmente...

Siempre había tenido la fatalista idea de que nadie tiene la vida ni la suerte comprada, y me había cuestionado a mi mismo que pasaría si algún infortunio me impidiera trabajar en lo que siempre he hecho, y en mis cavilaciones había llegado a la conclusión de que de llegar a perder la vista tendría que dejar la programación y dedicarme a alguna otra cosa, y es que no me imaginaba como poder hacer diseños de interfaces, revisar código, interactuar con diferentes aplicaciones para mantener un sistema de software sin contar con los benditos ojos.


Pues Marco me ha dejado ora si que con el ojo cuadrado, el es un programador de Delphi que es ciego, y tiene un gran sentido del humor respecto a su condición, en su blog ha publicado muy interesantes artículos sobre accesibilidad, nos enseña como es que el hace para hacer el diseño de los formularios, y como es que programa en general en el IDE.


Creo que el ejemplo de Marco nos debe de inspirar a muchos a hacer mejor las cosas, siempre las personas que tienen alguna discapacidad suelen sorprendernos con lo que es capaz de lograr la voluntad del ser humano; mis respetos y toda mi admiración para este ejemplar programador.


septiembre 08, 2006

nuevos turbos, nuevas versiones

Hacia ya mucho tiempo que no tocaba esta bitácora; mucho trabajo me ha mantenido un tanto al margen de lo que se ha suscitado en el ambiente.


Ahora resulta que en el poco tiempo de mi ausencia Borland  ha sacado a la luz sus nuevos Turbos, haciendonos a algunos remembrar los viejos tiempos del desarrollo sobre el otrora heroico Turbo Pascal. Yo no he tenido oportunidad de probarlos pero para los que si se han descargado mas de una de las personalidades de los Turbos y quieren poder instalar mas de uno a la vez (como decían los ingenieros de la DevCo que por cuestiones técnicas no sería posible) nuestro amigo Andy (Andreas) ha liberado una aplicación llamada TurboMerger que permite instalar mas de un Turbo en tu máquina, y lo mas curioso del caso es que Andy dice haber preguntado a Nick Hodges (quien ahora trabaja en la DevCo como director de mercadeo de Delphi) si es que era contra la licencia de los Turbos lo de instalar mas de una personalidad y este respondió que no, que al parecer era una dificultad técnica que ahora Andy ha subsanado elegantemente, recordemos que Andy también es el autor del DelphiSpeedUp del que ya habíamos hablado anteriormente en otro artículo. Y también tiene en su haber una paquete llamado DDevExtensions que permiten agregar en el BDS una paleta de componentes similar a la que traía Delphi 6-7 (para los nostálgicos y los que no terminan de acostumbrarse a la nueva barra de componentes), personalmente  ahora prefiero la nueva barra, una vez que te acostumbras te haces adicto, nunca había tardado menos para encontrar un componente específico como con esta nueva barra. También el hecho de que Andy no haya infringido la licencia de los turbos al crear este TurboMerger, nos lleva a pensar si también no infringiríamos la licencia si es que llegamos a poder instalar componentes con algún truco en las versiones Explorer de estos. En fin, en definitiva este chamaco Andy es un escapao' muy muy talentoso y supongo que este a un pelito de rana calva de que lo llamen a trabajar a la Devco.


También se ha liberado la versión 1.0 de GLScene, por fin!!! Felicidades a todo el equipo.


Y esta en la calle al momento el RC4 de Firebird 2.0, ya le he dado algunos catorrazos y hasta el momento funciona bien, tiene una enorme cantidad de mejoras al nivel del dialecto SQL; ahora es mucho más sencillo hacer muchas cosas para las que antes había que hacer maroma y media. Las posibilidades que se abren con cada funcionalidad que le agregan al lenguaje son muchisimas, todavia recuerdo cuando yo pensaba que el que se hubiera agregado la función coalesce no significaba la gran cosa para mi, y ahora la uso a diestra y siniestra, incluso me pregunto como es que antes podía sobrevivir sin tenerla en Interbase 6.0. ¡¡¡¡Como cambian las cosas!!!!


junio 12, 2006

El HotFix 5 de BDS 2006 es una maravilla

Desde la versión 2005 de Delphi me había quejado de la extremada e injustificada lentitud que presenta el IDE al cambiar entre el código y el formulario (la típica operación con el F12) cuando tienes muchos componentes instalados; particularmente uso mucho la librería JVCL que mantiene ahora las viejas librerías RxLib y RaLib, (y que recomiendo ampliamente, pues la versión en JVCL ha optimizado mucho las versiones originales) pero esta librería instala una buena cantidad de componentes, y eso hacia que fuera una verdadera tortura trabajar con Delphi 2005 y 2006.

Todavia de manera no totalmente oficial se ha dado a conocer un parchecillo que arregla esta contrariedad, y sobra decir que ha sido un logro de los mas aplaudidos en los foros de Borland por la comunidad de desarrolladores. Requiere tener instalado el UpdatePack 2, pero funciona mas que bien, ahora extraño menos a la versión 6 que es con la que trabajaba antes de migrar todo mi trabajo a Delphi 2006. Si sigue por ese camino le auguro un buen futuro a la nueva "DevCo", atendiendo a las necesidades reales y mas que tangibles de los usuarios es como haces que se hable bien de ti y de tus productos.

Provisionalmente se encuetra disponible en un servidor FTP, supongo que mas adelante se agregué a la sección de correcciones oficiales de Borland.

mayo 13, 2006

CVS Snapshot de GLScene al 10 de mayo

Eric Grange ha puesto a la disposición pública un Snapshot del estado del desarrollo de GLScene al dia 10 de mayo del 2006.

Como puntos destacables están el que en este snapshot viene el paquete de instalación tanto para Delphi 2006 como para Lazarus, cabe mencionar que se han hecho grandes avances en el desarrollo sobre Lazarus. Creo que esto va a potenciar bastante el uso de Lazarus para aplicaciones gráficas.

En lo particular yo aún encuentro un poco "molesto" el trabajo con Lazarus, el ide aún me parece un tanto inestable y de comportamientos erráticos... me ha pasado por la cabeza iniciar una aplicación real de gestión sobre este IDE pero hasta ahora lo que he visto que se ha hecho me parece muy modesto en comparación con las posibilidades que ofrece Delphi.

En fin, larga vida a Lazarus!! pero que sea una vida de verdadero aprovechamiento, ojalá no se quede como el hermanito "wanabe" de Delphi.

mayo 04, 2006

Extendiendo la VCL sin usar herencia ni registrando componentes nuevos

Es común que de repente estemos tentados a instalar fulano componente porque hace X monería, el problema con eso es que si nos viciamos en esa practica, llevar los fuentes de nuestro proyecto a otra máquina tiene el inconveniente de que hay que instalar todos estos componentes antes de poder compilar la primera línea de código.

Existen algunas practicas que permiten variar el comportamiento de los componentes que trae Delphi por defecto sin hacer derivaciones de las clases registradas, lo cual permite que sin instalar nada en el IDE tengamos el resultado que deseamos. Una de esas técnicas la describo un poco en el artículo Alternativas a los Skins y es la técnica de las clases sobrepuestas, pero en Delphi 2006 esta no es la única opción... existe una técnica mas estilizada y que se apega más a las buenas costumbres orientadas a objetos.

En BDS 2006 y desde Delphi 8 existe una extensión del lenguaje de Object Pascal llamada Class Helpers esta nueva característica nos permite definir nuevos comportamientos para alguna clase previamente definida de manera natural y su práctica nos ofrece muchos beneficios. Vamos a un ejemplo:

Muchos de nosotros usamos la funcion Trim() de Delphi que elimina los espacios en blanco al principio y al final de una cadena, y solemos usarla en controles como el caso del TEdit con código como este:

Edit1.Text := Trim(Edit1.Text);

Pero, ¿no sería mas claro y elegante que el control Edit1 tuviera un método Ajustar() que hicera eso directamente sobre el control?, veamos como implementariamos eso, primero definimos la clase que servira como ayudante de la clase TEdit.

TMiEdit = class helper for TEdit
public
procedure Ajusta;
end;

He llamado a la clase auxiliar TMiEdit ya que en esta técnica la clase auxiliar no tiene que llevar el mismo nombre de la clase a la que estamos ayudando, y ahora definimos el método nuevo:

procedure TMiEdit.Ajusta;
begin
Text := Trim(Text);
end;

Observen que como esta clase es una ayudante de TEdit puedo acceder a las propiedades de la misma clase TEdit, en este caso la propiedad Text, ahora para hacer uso del nuevo método no tengo que crear nuevas instancias solo usar un objeto común de la clase TEdit de este modo:

procedure TForm2.Button1Click(Sender: TObject);
begin
Edit1.Ajusta;
end;

Pero tambien se pueden modificar métodos de la clase afectada, por ejemplo si quisieramos hacer que al llamar al método Clear del TEdit este en vez de poner una cadena nula pusiera por defecto un cero, hariamos algo como esto:

TMiEdit = class helper for TEdit
public
procedure Clear; overload;
end;

procedure TMiEdit.Clear;
begin
Text := '0';
end;


begin
Edit1.Clear;
end;

En este caso estamos sobrecargando el método Clear pero al ser este un método re-definido en la clase ayudante se toma este último por defecto.

Esto suele sernos útil en casos donde por ejemplo tenemos que ajustar controles como el TDBGrid para que soporte la ruedita del ratón, o para que cambie de casilla con la tecla Enter, o para Editar campos Memo en las celdas, etc... usando el control TDBGrid de toda la vida.

Las limitaciones que tiene esta técnica son que desde las clases ayudantes no se puede tener acceso a propiedades o métodos declarados como estrictamente privados o estrictamente protegidos, asi como tampoco permite la definición de datos adicionales, es decir que no se pueden declarar variables de campos en estas clases auxiliares; lo único que se permite es que se púeden definir variables de clase (una nueva característica tambien), es decir variables que serán comunes a todas las instancias de la clase ayudada, esto es útil para por ejemplo poder llevar la cuenta de cuantas instancias de X clase se han creado y de alguna manera implementar variantes del patrón de diseño singleton sobrecargando el constructor de la clase.

abril 24, 2006

Delphi SpeedUp for BDS

Andreas Hausladen ha implementado un plugin que acelera el desempeño del IDE de Delphi, está disponible para su uso desde la versión 5 hasta la 10 (BDS2006) de Delphi.

Aqui está el instalador del plugin, pero creo que aún más interesante es el poder acceder al código fuente del que se pueden aprender enormidades, estos fuentes estan comprimidos en formato 7Zip.

Este plugin esta basado en las librerias FastCode y FastMove, echandoles un ojo puede uno ver el portento de trabajo en ensamblador que se le ha dedicado. Yo lo he instalado en BDS2006 y si he notado un incremento en el desempeño del IDE, ya me dirán si es un común en todas las configuraciones.

marzo 07, 2006

Alternativas a los skins

Existen muchos y muy variadas herramientas en el mercado que permiten hacer cosas bastante llamativas con las interfaces de los programas, VCLSkin, SuiSkin, entre otros con sus ventajas y desventajas entre ellos

Algunos usan sus propios componentes, es decir su propio TEditSkineado, TPanelEskineado, etc, el problema con eso es que obviamente cuando los usas te obligas a reescribir tu aplicacion o al menos pasarle un experto que cambie los nombres de las clases de los controles que ahora serán del nuevo tipo; y tambien con eso ya te estas jodiendo comprometiendo de alguna manera con ese proveedor de la herramienta, pues algunas características que ofrezcan estos componentes no se encontrarán en las clases genéricas.

Otros como VCLSkin son mas flexibles, con solo poner un simple componente en tu formulario principal te cambia la apariencia de la aplicación por completo, abarcando incluso cuadros de dialogo y demás chunches propios de windows

Aqui vamos a discutir una alternativa al uso de estas herramientas que son de pago (aunque algunas realmente valen lo que cuestan si la apariencia es tan importante para ti), y lo haremos usando una técnica ancestral que nos provee Delphi y a la que se le llama "Clases Sobrepuestas". Es increible cuanto mejora la apariencia de una ventana tan solo usando colores agradables y redondeando las esquinas de los componentes contenedores, aqui va el ejemplo vamos a estudiar como hacer que esto en diseño:

se vea en ejecución como esto:

Sin usar componentes de terceros y sin tener que cambiar los componentes que ahora estas usando en tu aplicación común y corriente de Delphi.

La idea es muy simple, vamos a hacer una unidad que será la que pongas al final de la sección uses de tu forma en la parte de la interfase; ahora, esto es importante, la unidad que contenga las clases sobrepuestas debe ser la última en la lista del uses, sino podria no funcionar el truco, por lo menos no para las clases que esten contenidas en las unidades que se encuentren despues de la nuestra.

Primero creamos una nueva unidad llamada GTPaneles.pas, y definamos algunos parámetros configurables al gusto de cada quien...

const
CnstArco = 35;
CnstBotonNormal = clMoneyGreen;
CnstBotonPress = clGray;
CnstTagDisable = 99;


la constante CnstArco definirá que tan pronunciados queremos que sean los arcos de las esquinas redondeadas, las siguientes dos constantes definen los colores que tendrán los botones en los estados normal y cuando estan presionados, y por último definimos un valor para diferenciar a aquellos componentes a los que no quisieramos que se les aplique el proceso de "embellecimiento", esta técnica la usa VCLSkin, donde si a algun panel no quisieras que se le aplique el Skin solo basta con poner el valor 99 en la propiedad Tag de dicho componente.

Yo suelo utilizar la propiedad Tag de los componentes para algunos trucos al nivel de la interface de las aplicaciones, si ese es tu caso tambien tendrías que hacer algunos malabares para que esto no te ocasione problemas


Para ejemplificar el trabajo lo haremos con la clase TPanel, y mostraremos la parte mas simple del asunto, aqui hacemos la sobreposición de la clase:


TPanel = class(ExtCtrls.TPanel)
protected
procedure Paint; override;
end;


Definamos un par de procedimientos genéricos que usaremos despues en la implementacion de los métodos de las clases sobrepuestas:

Este procedimiento borra el fondo donde se ha de dibujar el control y prepara el terreno para dibujar nuestra obra de arte.

procedure QuitarFondo(Control: TControl; Dest: TCanvas);
var
SaveIndex: Integer;
DC: HDC;
Position: TPoint;
begin
with Control do
begin
if Parent = nil then
Exit;
DC := Dest.Handle;
SaveIndex := SaveDC(DC);
{$IFDEF PDJ_2}
GetViewportOrgEx(DC, @Position);
{$ELSE}
GetViewportOrgEx(DC, Position);
{$ENDIF}
SetViewportOrgEx(DC, Position.X - Left,
Position.Y - Top, nil);
IntersectClipRect(DC, 0, 0, Parent.ClientWidth,
Parent.ClientHeight);
Parent.Perform(WM_ERASEBKGND, Integer(DC), Integer(0));
Parent.Perform(WM_PAINT, Integer(DC), Integer(0));
RestoreDC(DC, SaveIndex);
end;
end;


Este otro dibuja ya formalmente los rectangulos redondeados de modo que de la perspectiva 3D.

procedure DibujaRedondeado(const C: TCanvas; R1:
TRect; Color: TColor);
var R2: TRect;
begin
//Guardamos el Rectangulo original
R2 := R1;
with C do
begin
Pen.Width := 1;
//Dibujamos la sombra
inc(R1.left, Pen.Width);
inc(R1.top, Pen.Width);
pen.Color := clbtnhighlight;
Brush.Style := bsSolid;
Brush.Color := Color;
RoundRect(R1.Left, r1.top, r1.Right, r1.Bottom,
CnstArco, CnstArco);

pen.Color := color;
Brush.Style := bsclear;
inc(R1.left, Pen.Width);
inc(R1.top, Pen.Width);
RoundRect(R1.Left, r1.top, r1.Right, r1.Bottom,
CnstArco, CnstArco);

//Dibujamos la base...
pen.Color := clBlack;
Brush.Style := bsclear;
r1 := R2; //Recuperamos el rectangulo original...
RoundRect(R1.Left, r1.top, r1.Right, r1.Bottom,
CnstArco, CnstArco);
Brush.Style := bsSolid;
end;
end;


Despues de eso solo basta con codificar la nueva versión del método Paint del componente mandando a llamar a los dos métodos que ya vimos:

procedure TPanel.Paint;
begin
if (Tag <> CnstTagDisable) then
begin
QuitarFondo(Self, Canvas);
DibujaRedondeado(Canvas, GetClientRect, Color);
end else inherited;
end;


Para el caso de los botones y los TGroupBoxes el procedimiento es similar con la variante de desplegar el texto o el caption del componente en cuestión, e incluso se puede hacer una variante que dibuje tambien los Glyphs de los botones, pero yo por lo menos mi versión la he dejado hasta ahi; si alguien continua con este desarrollo hagamelo saber. También sobre BDS 2006 se pueden hacer uso de los nuevos eventos OnMouseEnter y OnMouseLeave para dar más efectos a los componentes.

En la sección de archivos de este blog esta disponible para descargar un demo completo de lo aqui explicado, seguro que con un poco mas de dedicación se puede ampliar la unidad para que soporte mas clases y con mejor apariencia.

febrero 14, 2006

Delphi guapachoso!!!

En estos dias de desavenencias, desorientación e incertidumbre, me encontré con este tema del grupo Comando ABM que narra las aventuras de un programador de Delphi en un ritmo bastante sabrosón!!

La letra del tema creo que sería solo para entendidos del Delphi, no me imagino que una ama de casa común que la llegue a escuchar en la radio sepa que quiere decir eso de :

...para que no tenga igual le exporte una interface, ya es un objeto COM y lo herede de otra clase...


pero tambien meditandolo creo que hay muchas canciones modernas a las que no se les entiende gran cosa y son super-exitos, asi que ojalá que a estos cuates les vaya de P.M. y que pronto hagan su primer millón como dicen los Bacilos.

La canción la pueden descargar aqui, y para quienes no esten tan familiarizados ABM son las iniciales de Altas-Bajas-Modificaciones algo que es lo común y de lo que muchos nos regodeamos con el slogan de la canción: "Mi ABM es el mejor"