La gran división…

abril 14, 2010 en Código, Delphi, Enlace interesante, Entrada Diario, framework, Taller práctico

Suena bien el título… :-)  y aunque a primera vista, podamos pensar que la entrada va a tratar del paradigma clásico “Divide y vencerás”, en este caso concreto, se nos vuelve a hablar de un tema recurrente y ya conocido en el blog, como lo es la separación del interfaz del usuario de las reglas de negocio. Como el autor de la entrada nos dice, Cobus Kruger, justo al empezar, en las primeras lineas:

One of the most important principles in building complex software systems, is detaching  the business logic from the screens that allow users to view and edit information.

Esta introducción pertenece al blog Source Code Adventures y concretamente al artículo:

Inducing The Great Divide

escrito en Noviembre del 2009. A él nos vamos a referir en esta ocasión.

Además, por la cantidad de comentarios y lo leído en otra entrada posterior de su blog, me dió la impresión de que tuvo mayor repercusión de lo que él hubiera esperado, cosa que no era de extrañar, la verdad, porque su contenido es bastante sugerente, como veremos más adelante, ya que se apoya en la RTTI (Informacion de tipos) para vincular los controles de edición con la capa que soporta las reglas de negocio.

Pero realmente, la idea de citar el artículo y profundizar en su contenido, ha sido bastante accidental, como casi todo lo que nos ocurre en el blog. ;-)   Uno se sienta a media tarde a buscar información sobre el último update, con la sana idea de compartirlo con vosotros, y tras una búsqueda inutil en el sitio de Embarcadero (yo esperaba encontrar mas información sobre las referencias 274215, 275149 y 275253 citadas como identificadores en el readme del Hotfix que publica Tim DelChiaro) caí como hoja del arbol, otoñal, hasta la entrada ID: 27468, MvFramework and Sample, escrita por Leonardo M. Ramé en el CodeCentralde Embarcadero. Me equivoqué… jajaja pulsando sobre CodeCentral en lugar de Quality Central… por eso de que los dos acaban en Central… :-D

Y de igual forma, fue también casual que diera un problema la descarga del código fuente… Y como sabueso, al ver una referencia citando el artículo motivo de estas lineas, decidí saciar la curiosidad y ver que contenía “eso” que aparentemente hablaba de frameworks. Pensaba para mi… ¡hombre! ¡si está publicado en Embarcadero posiblemente sea porque aporte algo que pueda ser de interés!  :-)   y con ese espiritú proseguí la cacería intelectual.

El siguiente paso vendría a ser inspeccionar el blog http://leonardorame.blogspot.com/ de Leonardo M. Ramé, de Argentina. Y ya para finalizar esa sesión, aterrizaba vía google sobre la entrada original que nos habla de “la gran división”, entrada que había servido como base para la respectiva de Leonardo. Por cierto, permitidme antes de proseguir en esa linea, que os recomiende la lectura del blog deLeonardo, ya que he visto bastante contenido que tiene muy buena pinta. Me lo apunto en la agenda para volver a él más adelante…

Seguimos y nos centramos en lo que hoy nos ocupa:

Inducing The Great Divide (by Cobus Kruger)

Como otros muchos artículos que hemos compartido, éste también está en inglés y quizás por eso el remarcarlo, porque fácilmente se nos podría pasar inadvertido y resulta muy interesante  el tratamiento que le da al uso de la información de tipos, vinculando a través del nombre del control la propiedad adecuada a la que va a estar enlazado. El ejemplo que pone Cobus es bastante claro. Aunque, como todos los ejemplos, es eso… un ejemplo, una sugerencia, un punto de partida.

La única pega, es que este tipo de ejemplos, tal y como está presentado, suelen desanimar a muchos compañeros que están empezando, pues no suelen incluir el código fuente, sino que uno va extrayendo de los bloques leídos y montando en el editor de código lo comentado en la entrada. Así que no tenéis que desanimaros.

Venga, ya que no lo disponemos traducido, os ayudo un poco en esa tarea, porque una vez que lo veais en funcionamiento vais a comprender mejor el sentido de un uso inteligente de la información de tipos:

Abrid un nuevo proyecto. Cambiad el tamaño del formulario para que quede similar al que muestra Cobus en su artículo.

image

Como se puede ver, tenéis que añadir 2 componentes de la clase TEdit, 1 TComboBox, 3 TLabel, uno para cada uno de los editores de texto y finalmente, 3 botones, para lo que os puede servir 3 componentes de la clase TButton.  Cambiar los captions de las etiquetas y de los botones con un texto similar al que se ve en la imagen.

Luego nos propone añadir una instancia de TPerson. Lo vamos a hacer: pero tenemos que declarar previamente la clase y para eso, podéis poner en la sección de tipos del formulario entre la palabra reservada type y  el encababezamiento de la declaración del formulario, el interfaz de dicha clase.  Haced un copia y pega del bloque que nos propone (el bloque de código en el que figura la declaración de la clase TPerson y que contiene los campos Nombre, Edad y Ocupacion, con sus respectivas propiedades de lectura/escritura). Finalmente, podéis añadir las variable que nos va a servir para instanciar la clase, en la sección privada del formulario.

Otro requisito es que el nombre de los dos componentes TEdit (la propiedad Name) y del componente TComboBox tiene que ser asignado con el mismo nombre que hemos declarado las propiedades publicadas en la clase TPerson. Cobus permite varias alternativas ya prefijadas (o coincidir el nombre, o coincidir el nombre + ‘sufijo’ o finalmente coincidir un prefijo y el nombre). Mi consejo es que para no liaros con el ejemplo, tengan el mismo nombre.

Ahora añadid una unidad al proyecto para incluir la declaración de tipos de la clase estrella: TObjectBinding.

De nuevo copiamos y pegamos en su interior los distintos bloques que componen tanto la interfaz como la implementación.

Tenemos que incluir en la sección de uses (previa al tipo) la dependencia de otras unidades para que resuelva los tipos externos que contiene el código y que estan definidos lógicamente en otras unidades.

uses Rtti, TypInfo, Generics.Collections, Controls, StdCtrls, SysUtils;

Y ya para finalizar, volvemos a la unidad del formulario y nos resta seguir sus recomendaciones al implementar los botones. Yo he escrito unas lineas de código siguiendo esas indicaciones:

procedure TFormularioPersona.bnCargarClick(Sender: TObject);
begin
  Binding.Load;
end;

procedure TFormularioPersona.bnLimpiarClick(Sender: TObject);
begin
  LimpiarFormulario;
end;

procedure TFormularioPersona.bnSalvarClick(Sender: TObject);
begin
 Binding.Save;
end;

procedure TFormularioPersona.FormCreate(Sender: TObject);
begin
  Person:= TPerson.Create;
  PreparamosDatosArticulo;
  Binding:= TObjectBinding.Create(Self, Person);
end;

procedure TFormularioPersona.FormDestroy(Sender: TObject);
begin
  FreeAndNIl(Person);
  FreeAndNil(Binding);
end;

procedure TFormularioPersona.LimpiarFormulario;
begin
  Name.Clear;
  Age.Clear;
  Occupation.Text:= '';
  Occupation.ItemIndex:= -1
end;

procedure TFormularioPersona.PreparamosDatosArticulo;
begin
  with Occupation.Items do begin
     Add('Programador');
     Add('Ama de casa');
     Add('Cocinero');
  end;

  with Person do begin
    Name:= 'Pedro';
    Age:= 34;
    Occupation:= 'Cocinero';
  end;

end;

end.

Y ya podéis compilar el proyecto y ejecutar la aplicación. ¡voila!

Si habeis obtenido exito al ejecutar la aplicación y habéis jugado con los botones, cargando y salvando los valores existentes, o sobrescribiendolos, estaréis de acuerdo conmigo en que el resultado final es un formulario bastante “limpio” de código y versatil, con una ruptura clara entre el interfaz del usuario y la capa lógica representada por la instancia de TPerson.

Es más, se produce la paradoja de que cuantos mas controles existan, mas claro será nuestro código respecto a otras unidades diseñadas mediante asignaciones directas entre los valores guardados por el controles y los campos que vinculados del objeto. Ya que toda la lógica de la relación de vínculos creados se almacena de forma trasparente por quien sabe realmente de ello: la clase TObjectBinding (apoyandose en la información de tipos)

Estoy completamente seguro, que tras la lectura, muchos compañeros habrán visto útiles algunos escenarios en los que puede aplicarse. Pero lo dicho: es un punto de partida, una sugerencia. El código es muy interesante y sobretodo didáctico.

Me gustaria que opinarais sobre la entrada de Cobus ¿que os parece?

Se que muchas de las personas que comienzan sus primeros pasos en el entorno, van a agradecer ese tipo de indicaciones, los comentarios, conocer por otro compañero la oportunidad de hacerlo o de no hacerlo. Así que tenéis la oportunidad de mojaros…  ;-)

¿Alguien opina?

O:-)

Un día con los mayores (2)

octubre 5, 2009 en Ado Express & DataSnap, Artículos, Delphi, Entrada Diario, framework, Taller práctico

Veamos cual es el siguiente paso…

En este segundo capítulo vamos a para dar un paso más en la construcción del  framework de Ian, creando la estructura del mismo, un esqueleto vacío en el que todavía no vamos a tener en cuenta ni a concretar nada que haga referencia a la lógica real de los datos sino que todavía nos movemos en un nivel abstracto, con acciones que pertenecen al mundo de las ideas como: Guardar, Descartar, Confirmar, etc.

Algunas unidades que van a formar parte de esta estructura, las podéis imaginar como el molde que “ayuda” a un pastelero a que sus figuritas de mazapán sean lo mas similares posibles de una a otra. Ese es el caso de la clase TBrowser y de la clase TDialogo, que van a ser ese molde sobre el que vamos a crear las ventanas que pertencen al interfaz de nuestro usuario.

Molde de pasteleria para hacer galletas... Y digo intencionalmente “ayuda”, ya que en la vida real, la propia lógica de los datos y de las relaciones entre las entidades, hacen que estos esquemas sean simplemente una guía, algo así como esos trajes unitalla, y nos obliga en alguna que otra ocasión a ser, nosotros mismos, quienes tengamos el suficiente sentido comun para que no acaben siendo una celda que nos encorsete y axfisie. Intetaremos, en un momento posterior retomar esta idea y comentarla para que se pueda ver con mas claridad.

Pero vamos a empezar por el principio, como hace Ian Marteens en los primeros capítulos del bloque C del curso. Lo primero de todo es iniciar nuestro proyecto, seleccionando la opción File -> New -> VCL Forms Application – Delphi for Win 32, que creará el nuevo proyecto. Podemos guardarlo con el nombre que queramos. Yo he guardado la unidad de proyecto como “Mayores.dpr” y la unidad principal como UPrincipal, dentro de una estructura de carpetas que he creado para alojar el proyecto.

Creando el proyecto...

Cada cual organiza los módulos como cree conveniente y no creo que haya nadie que diga ni Estructura de carpetas...que tienes que crearlo todo en una sola carpeta ni que tienes que estructurarlo en cien mil.  Será de esas cosas en las que cada uno tenga su propia opinión. A mi particularmente no me gusta tener un solo directorio por lo que he creado una pequeña estructura.

Una carpeta por ejemplo para todos los archivos que son propios del proyecto y que forman parte del framework. Otra para unidades auxiliares (común) que podrían ser compartidas por otros proyectos por ser recursos de caracter general, como rutinas de evaluación (del dni, de la cuenta bancaria, de cálculo de días de vencimientos en giros, rutinas para saber si un dia cae en festivo o que se yo, si el año es bisiesto y nos trae un dia de mas, etc…).  También podríamos guardar todás las unidades compiladas de nuestro codigo fuente (dcus) en una única carpeta y el ejecutable en otra. Para ello tenemos en las opciones de proyecto donde vamos a activar las rutas que estimemos convenientes. Esta es la imagen:

Creando el proyecto...

Y ya que estamos aquí, aprovechando que tenemos el editor de opciones abierto, activaremos el control de versiones. En alguna de las entradas siguientes puede valernos para añadir unas rutinas que nos permitan actualizar de forma sencilla el ejecutable de nuestra aplicación.

Creando el proyecto...

Volvemos a nuestra unidad principal, que hemos convenido en llamar UPrincipal.pas, ya que tenemos que cambiar algunas de las propiedades en el inspector de objetos. El estilo de nuestro formulario principal va a ser el correspondiente al de la ventana principal de las aplicaciones MDI, por lo que asiganremos la propiedad FormStyle con el valor fsMDIForm. Ian además, activará las propiedades ShowHint a true y el tamaño de inicio de nuestra aplicación en Maximizado (wsMaximized). Así que procedemos a ello, tras nombrar la unidad siguiendo un patron de eliminar el prefijo “U” que fue usado al guardar (hacemos que la propiedad Name tome el valor de Principal).

Todas estas cosas, estos detalles, no cobran importancia ahora. El que tengamos mas o menos  estructurados los módulos, que asignemos correctamente los nombres de los objetos o dejemos cada cual segun del humor con el que nos alcemos, el que no sigamos patrones para nominar las distintas unidades, el olvidar asociar la adecuada documentación segun la etapa de nuestro desarrollo o simplemente el no realizar los debidos analisis de requerimientos confiando en nuestra experiencia y buena estrella, puede ser algo banal o puede ser una soga que se ate a nuestro cuello desde los primeros pasos del mismo.  :-)

Más adelante, vamos a necesitar al menos dos módulos de datos. No vamos a crear ahora mismo los componentes que formaran parte de los mismos y que nos permitirán conectarnos a la fuente de datos. Simplemente, añadimos un módulo de datos (datamodule) para la capa cliente, que llamaremos “UDatos.pas” y otro para el conjunto de datos que accedera a nuestro servidor, “USQLDatos.pas”.

Es decir, hacemos File -> New -> Other -> [Delphi Project -> Delphi Files -> Data Module]

Creando los modulos de datos...

Asi que en este punto ya tenemos casi todo… :-)    ¡Qué más quisierais!

¡No, si yo tampoco me lo creo! :-)   No hemos hecho más que comenzar. Tenemos una archivo de proyecto, una unidad principal que va a responder al esquema de aplicaciones mdi y dos modulos de datos. Y TIENEN QUE EJECUTARSE EN UN ORDEN YA DETERMINADO. Primero la unidad que nos va a permitir conectar con la fuente de datos (USQLDatos.pas). Luego el modulo de datos (TDatamodule) que representa la conexion del cliente (UDatos.pas) y finalmente, el interfaz, nuestra ventana principal, que tendra una relación de “amistad” o “conocimiento” con UDatos, ya que se vale de el para acceder a las distintas peticiones de nuestro usuario.

Esto tiene un sentido que no es dificil de comprender. Tened en cuenta que no estamos separando las capas y que tanto el acceso a los datos del servidor como el que representa al cliente, forman parte de la misma aplicación, dentro de lo que pudiera ser el modelo que representa tradicionalmente a la arquitectura cliente-servidor. En un desarrollo multicapa, el modulo que puede dar servicio al acceso a datos estaría escuchando en algun punto accesible a la aplicación cliente y serviria de intermediario entre esta y el servidor. Por tal razón respetamos el orden y crearemos los distintos módulos según ese esquema. Y van a existir durante toda la vida de nuestra aplicación.

Veamos como quedan dentro de las opciones del proyecto:
Cómo quedan las unidades...

Hemos dicho que nuestra aplicación va a responder al modelo MDI y realmente no hemos dicho demasiado sobre ello. No se decir si me gusta mas o menos, pero sí es cierto que tiene algunas pequeñas ventajas que pueden ser resaltadas. Una aplicacion SDI se organiza mediante ventanas que ocupan un espacio no determinado sobre el escritorio y aunque sigue existiendo una ventana principal esta puede llegar a ser ocultada por el resto de ventanas que se crean en tiempo de ejecución. Así que puede hacerse necesario que controlemos la posición y el tamaño de las mismas. En el modelo MDI, la ventana madre o principal siempre queda visible cuando está activa (una preocupación menos que nos la resuelve el propio sistema)l, y organiza en su interior las ventanas “hijas” creadas. Todos conocemos de sobra esos modelos porque lo hemos vivido con Delphi tanto uno como el otro. El modelo mdi facilita o nos permite desprecuparnos sobre detalles como la posición de las ventanas hijas (en este caso más aun ya que siempre es creada maximizada), permite organizarlas y acceder a ellas facilmente.

En el framework de Ian Marteens, las ventanas hijas, representarán la búsqueda inicial del usuario, y se plasmarán sobre una rejilla que mostrará el resultado de la misma.Inicialmente, puede estar vacía de datos (es lo que recomienda Ian con muchos sentido común) y la elección del usuario sobre los parametros de busqueda, crea el conjunto de registros con los que trabajará en ese momento nuestro usuario. El framework le permitiría saltar de una ventana a otra, de clientes a proveedores, de facturas a pedidos hasta que se decide editar o insertar (manipular datos), momento en el que va a participar una ventana modal que va a contener los datos del registro que ha seleccionado el usuario. Esta ventana modal tendría el estilo de ventana “fsNormal” y sería descendiente de la clase TDialogo, que ya ha sido nombrada en lineas superiores.

Hay desarrolladores que no son partidarios de los enfoques modales en la edición de las fichas. Yo veo que es una solución muy práctica, que te da un mejor control sobre el proceso de edición. Sin embargo, se podrían poner algunos “peros” que pueden ir apareciendo a medida que se desarrolla nuestro proyecto y que tienen que ver con los prerrequisitos que la garantizan y que pueden necesitar adicionales ventanas modales para satisfacerlos. ¿Cual es la cantidad máxima que nos vamos a permitir? ¿O bien relajamos las condiciones y nos valemos de un trigger para elaborar algunos procesos que puedan ser necesarios previamente? ¿Obligo a crear el artículo previo a la edición del documento de venta,  le doy la opción de crearlo en ese momento o postergo la creación al disparo del trigger, una vez grabado el registro?  Son temas que no siempre resultan sencillos ya que la decisión puede depender de otros factores ajenos a la propia aplicación.

En la tercera parte del framework, vamos a meternos en harina y disfrutar de los razonamientos que se descubren en las relaciones de herencia entre las clases TAncestro, TBrowser y TDialogo. Lo vamos a ver ya, en nada, a la vuenta de dos o tres días (si en ese tiempo no me atacan los indios de nuevo el servidor).  ;-)

Es muy tarde. Las dos y cucu… En fin. Tengo que descansar.

Ahhh Para acabar, olvidaba poner la dirección de los cursos de Ian Marteens por si alguno puede estar interesado. En mi opinión, y aunque el contenido ahora mismo no este actualizado con la última versión de nuestros entornos, la metodologia que utliza trasciende a una versión concreta. Somos muchos los programadores de Delphi que hemos aprendido en las páginas de sus libros, ya que no tienen desperdicio.

Nosotros solo vamos a ver un pequeñisimo extracto del framework por lo que, podeis acceder en este link si deseais mas información sobre los mismos.

http://www.intsight.com/training.html

Próximas entradas… pito, pito, gorgorito…

julio 24, 2009 en Entrada Diario, framework

Muy rápidamente porque son las tantas de la mañana y todavía tengo que dormir un rato. Hace unos días escribí un correo a Ian Marteens pidiendole permiso para hablar desde el blog de uno de los frameworks que desarrolla en sus cursos de datasnap. No me parecía correcto tratar el tema y menos compartir algunos de los módulos sin solicitar el permiso del autor, por lo que le escribí una lineas donde le explicaba un poco la idea y le indicaba que era algo que podía ayudar a bastantes compañeros que se inician. Y no ha tardado nada a responder Ian,  escuetamente:

>¿Qué te parece, Ian?

Hazlo por supuesto. Ningún problema, todo lo contrario.

Así que el que tiene el problema ahora soy yo… :-)   Porque el framework es muy lindo… y tenemos que extraer las cuatro ideas principales para que sin extendernos demasiado  quede una buena idea de sus posibilidades. Lo cual es complicado, mas si tenemos que hacerlo en estos días de calor donde uno quisiera estar tumbado en la playa.

Se que muchos comentan que Delphi está moribundo, incluso hay quien ha podido ya enterrarle. :-)

Yo sinceramente no lo creo, y os digo esto sonriendo. Todavía quedan muchos desarrolladores que no hemos tirado la toalla.

Bueno, nada mas.

Darle las gracias a Ian Marteens.

Gracias, Ian.

Un enfoque modular para nuestra aplicación. (FUENTES)

octubre 19, 2007 en Delphi, Entrada Diario, framework, Taller práctico

Durante estos últimos días, he recibido algunos correos de compañeros solicitandome el codigo fuente del articulo escrito en el Boletin de Delphi, y que llevaba como título “UN ENFOQUE MODULAR PARA NUESTRA APLICACION”. En principio la intención era adjuntarlo en la ultima descarga del boletín, pero al final mi amigo Jose Luis Freire olvidó incluirlo.

Así que lo mas fácil, hasta que contacte con él, es añadir a esta entrada un link para su descarga.

El artículo se reparte en los siguientes boletínes:

Desgargar fuentes artículo

Espero que os guste y pueda ayudar a alguien.

Acabando tareas pendientes

mayo 16, 2007 en Entrada Diario

Acabar las tareas pendientes es un ejercicio saludable. :-)

Hace un rato, cosa de veinticinco minutos mas o menos, he entregado a Jose Luis Freire el artículo pendiente sobre la creación de aplicaciones modulares. Aproximadamente son unas 14 páginas (incluidas algunas imagenes) donde he intentado compartir con vosotros esas ideas comentadas en las últimas entradas del blog.

Por lo que hemos podido comentar, dado que este mes ya ha cubierto los articulos del boletín de delphi, posiblemente sea publicado a partir del mes que viene, en una o varias entregas.

Os incluyo un enlace a la aplicación generada, por si teneis curiosidad por verla en ejecución. Las fuentes me imagino que las podreis descargar desde El Rinconcito de Delphi cuando se publique el artículo.

Otra cosa:
Si la descargais, tened en cuenta de que debéis indicarle la ruta al fichero dbdemos.gdb que habitualmente está en el directorio:
c:/Archivos de Programa/Archivos Comunes/BorlandShared/Data/

Como se indica en una ventana emergente, podeis copiar la ruta al fichero ini creado a tal efecto, en la seccion correspondiente.

[CONEXION]
DATABASENAME= c:/Archivos de Programa/Archivos Comunes/BorlandShared/Data/dbdemos.gdb

Descargar ejecutable

Obras son amores…

mayo 10, 2007 en Entrada Diario

…y no buenas razones, que dice el refrán. Así que he pensado en retocar un poco el ejemplo, que referí en entradas anteriores como framework, con el fin de simplificarlo y que se aprecien mejor las relaciones entre los módulos, y entregarlo a Jose Luis Freire para su publicación en el Boletín. Lo que no se todavía, es si llegaré a tiempo para este número ya que todavía estoy retocando las fuentes.

El ejemplo, como ya comenté anteriormente, está basado en unos artículos publicados en Developer Express sobre buenas técnicas de trabajo. He vuelto a buscar el link a dicha página pero ya no aparece por lo que imagino que ha sido movido a otro lugar de la web. Este era el enlace original:

http://www.devexpress.com/Support/BestPractices/VCL/SAP/index.xml

He querido respetar la idea original, manteniendo la misma nomenclatura usada para no desvirtuarlo.

Inicialmente, se apoya en varios de sus componentes: el TdxNavBar, como ventana lateral que puede ser escondida, dejando una pestaña que la restaura si es cerrada, y en la parte superior del area cliente, un contenedor de barras basado en el TdxBarManager.
El efecto final es un interfaz bastante moderno y agradable (al menos esa es mi opinión).

Si además, son combinados con una rejilla de datos de la Suite Exprexs Quantumgrid v5, los resultados y la eficacia es muy alta, aunque gana para mi gusto en demasiada complejidad, por el uso de estos componentes que requieren bastantes horas de aprendizame, y no siempre compensa. El grid de esta suite de componentes es un ejemplo de ello, sobretodo cuando te sales de las operaciones habituales.

Os voy a incluir dos imagenes de un framework de pruebas que extiende esta idea, para que se aprecie mejor el interfaz:

Rejilla de datos


Ficha de edición

Esta pequeña muestra que hice a partir de dicho ejemplo, trabajaba con los componentes de dbExpres, siguiendo los esquemas mostrados por Ian Marteens en los capítulos de Datasnap y Midas, accediendo a una base de datos mediante Firebird 1.5. Y funcionaba bastante bien.

En el que ahora nos ocupa no vamos a hacer uso de los componentes de Developer Express, para que pueda seguirse directamente desde las versiones de Borland Developer Studio y Delphi 2007 sin tener que recurrir a componentes externos. El efecto visual también es aceptable y así evitamos dependencias externas que nos compliquen posteriormente la vida.

Podéis verlo en esta imagen:

Framework artículo

Para sustituir el componente TdxNavBar, he utilizado TCategoryButtons, incluido ya en el BDS 2006, que permite agrupar por categorias. Asímismo, el componente TActionMainMenuBar, ha sustituido, como contenedor de barras, al componente TdxBarManager. Sin embargo, el esquema es similar y lo verdaderamente importante serán las relaciones entre los distintos módulos.

Otra cosa: He preferido aislarme de todo lo relacionado con Datasnap para este ejemplo, por no complicarlo con algo que realmente no era necesario para explicar el framework. Por dicha razón, el acceso a datos lo he realizado a través de los componentes de la paleta de Interbase, de forma que fuera lo más sencillo posible y accediera a una de las bases de datos de ejemplo que trae Delphi.

Si quereis echar un vistazo al diagrama de clases original, sobre el que fue extraido el ejemplo que comentaremos. Visualizar/descargar pdf diagrama.

Nos vemos en el Boletín.