Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-03-2011
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Cómo conseguir paquetes dinámicos y no necesitarlos en DesignTime

Hola a todos!
Me asalta una nueva duda con la carga de paquetes en tiempo de ejecución. He seguido aténtamente este hilo http://www.clubdelphi.com/foros/showthread.php?t=68947
en el que Neftali explicaba de manera sublime los tipos de paquetes que podemos tener en nuestra aplicación.
Estoy desarrollando una aplicación en la que en un futuro esperamos hacerla crecer, por lo que me pareció interesante la carga dinámica de paquetes, así que me puse manos a la obra.
Tras darle varias vueltas, decidí por la opción (como dice el propio Neftali) más potente: BPLs cargados en runtime con la opción "Compile with Runtime Packages". Sencillamente funciona perfectamente.
El problema es que ahora me he dado cuenta que estos objetos (objetos maestros) que iré añadiendo a la aplicación, dependen también de otros objetos (objetos esclavos) que también me gustaría ir añadiéndolos dinámicamente.
Tengo la clase padre de ambos en un paquete en DesignTime, y los objetos maestros los puedo añadir fácilmente, derivando de su clase padre y registrándolos.
Pero éstos utilizan información sobre los objetos esclavos, la cual depende de qué tipo sea el esclavo, por lo que no puede estar en la clase padre de los objetos esclavos.
Por tanto, necesito tener información de ellos en DesignTime, por tanto se linkan estáticamente, por tanto, pierde la gracia hacer todo esto.

¿Me podríais indicar cómo puedo obtener información de estos objetos sin necesidad de tenerlos en DesignTime?
Yo estaba pensando en mantener records en DesignTime, y que al crear los objetos esclavos se le pase al constructor un puntero a dichos records.
El problema es que cualquier modificación en dicha estructura me obligaría a recompilar toda la aplicación...

Un saludo,
LoPiTaL
Responder Con Cita
  #2  
Antiguo 10-03-2011
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Me suena a que necesitas un BPL estático que te sirva de "puente" para tus cargas dinámicas.

Algo de esto se comenta en este enlace, podría servirte.
__________________

Responder Con Cita
  #3  
Antiguo 10-03-2011
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Gracias por la respuesta.

Lo que se comenta en ese hilo es lo que ya tengo:



Y eso funciona bien.
Ahora mi problema es que necesito que el Maestro hijo X acceda a información de los esclavos hijos Y, y dicha información, como es dependiente del tipo de esclavo que sea, no está en la clase padre.
Vamos quiero hacer esto otro:



Esa comunicación (marcada en rojo) es la que no sé cómo implementar sin caer en linkado estático, salvo añadiendo un BPL por cada esclavo hijo que únicamente contenga un pas con una estructura que sea la que el esclavo espera recibir, y a la que tendría acceso todo el mundo, por lo que este BPL sería estático, y un cambio en dicha estructura me obligaría a recompilar la aplicación.

¿Se os ocurre algo más? ¿Se me escapa algo?

Un saludo,
LoPiTaL
Responder Con Cita
  #4  
Antiguo 10-03-2011
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Desconozco la forma en que podrías tener "comunicación directa" entre dos BPL dinámicos. Lo que yo hago es hacer la comunicación a traves de un BPL Base. Tu podrías utilizar tu módulo maestro o esclavo para tener esa comunicación, pero sería indirecta.

Por eso yo hacía la mención de un BPL "Puente" que te sirva de camino.
__________________

Responder Con Cita
  #5  
Antiguo 10-03-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.264
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Siguiendo con lo que comenta Contraveneno, entiendo que hay dos formas de acceder a información de otros packages.

El primer problema es saber a qué te refieres con "comunicación"; No es lo mismo acceder a datos, crear objetos definidos en otro paquete, acceder a métodos de clase,...

(1) La forma directa pueder ser utilizando RTTI. Si tu aplicación está compilada con Runtime Packages, como debe ser, puedes utilizar técnicas de RTTI para acceder a determinados datos.

(2) La forma "indirecta" y es la que también uso yo, es la que ha comentado contraveneno. Utilizar una estructura en el package Base o en el programa principal para almacenar cosas que serán accesible por todos los packages.

Por ejemplo, en mi caso, tengo una "lista de Definiciones" en el package Base. Cada package que cargo añade a esa lista (accesible por todos los packages) su objeto definición (que contiene todo lo que los demás necesitan saber de ese package; constructores de clase, definiciones,...)

Una vez cargados los packages, en esa lista están los "objetos definición" de los packages cargados y los que no se han cargado no han añadido su "objeto definición".
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 10-03-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
El problema, hasta donde veo, es que sus clases "maestras" hacen uso de clases "esclavas" específicas por lo que el paquete base tendría que incluir a todas ellas, aún las que no existan en el presente.

Obviamente es poco lo que se puede decir sin mayores datos, pero podría tratarse de un diseño de clases no del todo correcto. Las clases "esclavas" probablemente deberían de poderse acceder de manera genérica y dejar al polimorfismo la distinción de comportamientos.

// Saludos
Responder Con Cita
  #7  
Antiguo 11-03-2011
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Gracias a todos por las respuestas.

Neftali:
Cita:
El primer problema es saber a qué te refieres con "comunicación"
Con esto me refiero a que:
- El maestro deberá inicializar con unos determinados valores a los esclavos.
- Deberá leer sus datos.
- Los esclavos no necesitan saber nada de los maestros salvo lo que está en el paquete principal.

Cita:
La forma directa pueder ser utilizando RTTI
No me gustaría usar RTTI, por aquello que hace la app lenta.

Cita:
Utilizar una estructura en el package Base
Eso es lo que comentaba que es lo único que se me había ocurrido. Creas un record de esta estructura, lo inicializas y se lo pasas al constructor del esclavo y ya se apañará.
Esta es la solución que por ahora más me gusta...
Su única pega es que si en versiones posteriores introduces cambios en esta estructura, debería actualizar toda la app y no sólo el package.

Cita:
Cada package que cargo añade a esa lista (accesible por todos los packages) su objeto definición
¿Puedes explicar un poco más esto? ¿A qué te refieres con "objeto definición"? ¿Por ejemplo a un array de strings del tipo 'NombreVar=Valor'? Si es así, tal vez podría utilizar estructuras tipo XML para conocer el estado de los esclavos o inicializarlos... (se me acaba de ocurrir, mañana lo estudiaré más tranquilamente esto)

Román:
Cita:
El problema, hasta donde veo, es que sus clases "maestras" hacen uso de clases "esclavas" específicas por lo que el paquete base tendría que incluir a todas ellas
Sí, exactamente ese es el problema que tengo. Las clases esclavas comparten métodos genéricos a todas ellas, por tanto sí puedo hacer herencia / polimorfismo. Pero hay determinadas propiedades que son exclusivas de determinados esclavos. Esto es lo que no consigo resolver.

Cita:
podría tratarse de un diseño de clases no del todo correcto
No descarto que sea este el problema, pero como he dicho antes, los esclavos comparten métodos y propiedades accesibles a través del esclavo padre, pero hay cosas que dependen de lo que el esclavo haga.


Después de todo esto, me está pareciendo cada vez más simple dejar los esclavos que se linken de forma estática en todos los packages de los maestros que los necesiten, y cuando haga una actualización en cualquier package de algún esclavo, actualizar también todos los packages de maestros que dependan de él...

Gracias por las respuestas,
Un saludo,
LoPiTaL
Responder Con Cita
  #8  
Antiguo 11-03-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.264
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por LoPiTaL Ver Mensaje
No me gustaría usar RTTI, por aquello que hace la app lenta.
Bueno, personalmente no tengo constancia de que RTTI haga más lenta la aplicación; Lo he leído en algun sitio más, pero no se si realmente es cierto y si lo es, habría que saber cómo cuantificamos ese "mas lento".
En todo caso dependerá de las operaciones que hagas utilizando RTTI; De cuales y de cuantas.

Cita:
Empezado por LoPiTaL Ver Mensaje
¿Puedes explicar un poco más esto? ¿A qué te refieres con "objeto definición"?
¿Por ejemplo a un array de strings del tipo 'NombreVar=Valor'?
Si es así, tal vez podría utilizar estructuras tipo XML para conocer el estado de los esclavos o inicializarlos... (se me acaba de ocurrir, mañana lo estudiaré más tranquilamente esto)
Le he llamado "Objeto definición", porque en mi caso es una clase que contiene varias cosas.
En mis packages dinámicos existen clases (en cada package N clases); Cuando se carga un package se añade a la lista, un objeto por cada una de las clases que hay en ese package.
¿Qué contiene ese objeto definición? En mi caso ese objeto contiene un Identificador, algunas propiedades que se necesitan conocer de esa clase, apuntadores a constructores (Edit, Browse,...), información de inicialización, el package al que pertenece,...

Cuando acaba la carga de la aplicación, esa lista de definiciones, contiene 1 objeto (con toda la información anterior) de cada clase que se ha cargado. Viene a ser como un "diccionario de clases" (en realidad lo es) y me sirve como complemento a la RTTI.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como crear componentes dinamicos sErgis .NET 3 06-06-2011 17:10:05
Componentes con DesignTime y RunTime LoPiTaL OOP 2 26-10-2010 09:11:42
Refresco en formularios creados con paquetes dinamicos andresenlared Varios 1 28-11-2007 23:00:41
Paquetes dinamicos xerkan Varios 14 22-10-2007 16:05:58
Como leer los paquetes que se reciben por el puerto COM rjsitruiz Varios 5 07-08-2004 00:07:10


La franja horaria es GMT +2. Ahora son las 12:08:12.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi