FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Paquetes dinámicos!
Hola
Bueno, la idea que tengo es cargar componentes externos en BPLs y poder acceder a estos desde mi .exe, osea crearlos, modificarlos, acceder a sus propiedades, métodos, etc. Y como no tenía idea de esto empecé a buscar y llegué a la web de codegear y el ejemplo del señor Vino Rodrigues para empezar con lo básico me iba bien, pero lo peor es que no logro hacerlos funcionar a los ejemplos, es como si no haría nada y me he puesto a debuguear y llegué a esta línea:
Osea AClass vale Nil y por eso no logra ingresar y ejecutar las demás sentencias y no me muestra la respectiva ventana cargada dinámicamente, ahora la pregunta es: ¿Por qué tiene valor Nil? No pego más code por que todo lo saqué de aquí http://www.clubdevelopers.com/index.php?p=54 Espero alguna solución e idea con respecto a lo de los componentes Saludos! |
#2
|
||||
|
||||
A parte del fantástico artículo de Vino Rodrígues, también puedes echarle un vistazo al artículo que hay en mi web, "Sistema de PlugIns - I".
Otro enfoque sobre el mismo tema. Si el package te lo carga bien, pero te falla el GetClass, apuesto (1 cerveza ) a que estás compilando "sin Runtime Packages". Asegúrate de que el check "Build with runtime packages" está marcado.
__________________
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. |
#3
|
||||
|
||||
Hola
Ya he visto tu sistema de plugins y no es lo que necesito hacer, por cierto igual ahí usas lo mismo que yo estoy aprendiendo, a cargar bpls dinámicamente, ahora, con lo de la apuesta creo que te gano ya que según he leido (espero haber entendido bien) osea si marcas esa casilla y compilas de esa forma qué pasaría si NO existiría el package1.bpl ? lanzaría un error, es mas, en el ejemplo 1 de ese mismo fantástico artículo explican de hacer check a esa casilla, que por cierto ya no es vcl50;Package1.bpl. yo uso delphi 2009 y con eso no me funcionó, cambié a solo vcl;Package1.bpl y así si funcionó perfectamente, pero está claro el mismo artículo dice que qué pasaría si no distrubuyo el bpl. la app fallaría, entonces por este mismo motivo es lo que hacen el ejemplo2, osea cargarlos dinámicamete y ya SIN linkear, y es ahí ya donde no me funciona el ejemplo2 de ese zip del artículo. Espero que me haya explicado bien y tenga las cosas claras hasta aquí, a ver si no estoy totalmente aquivocado que suele ser la mayoría de las veces muchas gracias y a ver si alguien más me da una idea del problema y prueba a bajar el .zip del artículo original que está en el siguiente link http://edn.embarcadero.com/article/27178 y el adjunto está al final Saludos! |
#4
|
||||
|
||||
Cita:
Todavía albergo esperanza... Cita:
PREMISA PARA PODER UTILIZAR RTTI (GetClass): Tanto en el artículo de Vino Rodigues (parte del FINALLY) como en el mío (donde están las RECOMENDACIONES), se deja bien claro que el Check "Build with runtime Packages" debe estar marcado. ¿Porqué? Por explicarlo de una forma sencilla, si compilas sin Runtime packages la información de RTTI del programa principal y de los packages dinámicos no se encuentra en el mismo lugar, por tanto al acceder desde el programa a esa información del package (con GetClass), no la encuentra. La única forma de que esa información esté accesible es compilando el programa con Runtime Packages. Por otro lado están los packages que se cargan de forma estática, que son los que aparecen en la lista que comentas. El package1 que aparece en esa lista, se carga de forma estática, por eso está ahí. Los packages que tú vas a cargar de forma dinámica (con LoadPackage) no deben estar es esa lista. Por la razón que tú comentas (si no existieran fallaría la aplicación). (1) Activa el CheckBox en las opciones del proyecto. (2) Elimina los packages que vayas a cargar con LoadPackage de esa lista (3) Ejecuta el código y prueba el GetClass. CONCLUSIONES. (1) Si tu aplicación se compila/linka sin packages dinámicos (todo en un EXE), puedes usar LoadPackages para cargar packages dinámicos, pero no podrás utilizar la información de RTTI (por ejemplo GetClass) de los packages cargados con LoadPackages desde la aplicación (GetClass de las clases del package siempre devolverá nil). (2) Si tu aplicación compila con runtime packages, hay packages cargados estáticamente (de los que has hecho un USES -los de la VCL, por ejemplo-) y que estarán en la lista de packages (si no están la aplicación falla) y packages cargados dinámicamente con LoadPackage. Estos últimos no deben estar en la lista de packages (opciones del proyecto) y si no están disponibles, fallará la llamada a LoadPackage, pero no la ejecución de la aplicación. Con este escenario la información RTTI de todos los packages cargados (estáticos y dinámicos) está en el mismo lugar, por lo tanto puedes acceder a ella -para todos los packages- sin problemas (Getclass). Espero haberme expllicado medianamente bien. Un saludo. P.D: Sigo creyendo que ganaré la cerveza.
__________________
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. |
#5
|
||||
|
||||
Hola
Pues sí que te entendí todo, peeero una cosa que no me queda clara. ¿Por qué los ejemplos que exponen ahí, los del zip no funcionan ? Osea ahí dice bien claro que debería cargarte el form2 del bpl "dinámicamente" pero no lo hace y es ahí donde probé que da el valor de _nil_ y según he leido pero he vuelto a compilar el programa activando build runtime packages y SOLO dejé ahí "vcl" y eliminé package1 y funcionó, me mostró el form2, es correcto lo que hice? O solo debería marcar la casilla y quitar _todo_ de ahí, vale decir que lo probé de esa forma y pues el resultado es lo mismo que si la casilla esté desmarcada jeje BUeno, si es así, entonces lo correcto es que la casilla esté activada y SOLO esté la palabra vcl ahí y listo ? si sería eso entonces doy mi "primer" problema por solucionado y muchas gracias neftalí por tantas palabras para resolver algo difícil para mí Saludos!! PD por cierto, no a terminado aún este hilo, ya que ahora quiero hacer lo de cargar componentes en un BPL y poder acceder a estos desde un form y crearlos, acceder a sus métodos, etc, a ver si es to es posible edit: bueno, sobre la cerveza me la ganaste, venga ya, nos vemos en la taberna que pago todo yo, y para el que se quiera unir a la farra igual que vaya Última edición por BlackDaemon fecha: 08-04-2009 a las 17:48:57. Razón: oiga, ¿y la cerveza? |
#6
|
||||
|
||||
Cita:
En el primero, como hace el USES del formulario2 en ese caso ya está claro, lo está linkando estáticamente. En el segundo caso lo hace bien. No hace el USES y lo carga con LoadPackage. En ese caso puedes ver que si marcas o desmarcas la casilla el resultado de GetClass es diferente y pasa lo mismo con el Ejemplo3. En el ejempo3 de los dos ítems del menú, el primero lo carga estáticamente, puesto que está haciendo el USES y el segundo dinámicamente, pero para que el segundo funcione vuelve a hacer falta que se active el Check de "Build with runtime packages". En cuanto a qué packages poner en ese Edit, pues como bien dices, VCL y los que se usen linkados estáticamente. Segun lo que utilices; vcl;rtl;dbrtl;adortl;... Un saludo.
__________________
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. |
#8
|
||||
|
||||
Cita:
No pues si yo lo hago igual, solo que el problema o duda era referente a marcar y "que" dejar en ese campo, y ahora veo que SI o SI necesito dejar la palabra vcl ahí, si no, no funcionará. Saludos!! |
#9
|
|||
|
|||
Cita:
Ahora le Pregunta es porque no instalas estos componentes en el Id y le das ese trabajo a Delphi ? no lo se,, disculpa mi ignorancia. Saludos |
#10
|
||||
|
||||
Hola
No pues no tienes de que disculparte, aquí entre ignorantes no entendemos jeje ya que yo igual desconosco muchas cosas Pues lo que pretendo hacer es repartir la aplicación .exe final y el bpl con los componentes, así si quiere actualizar algo solo tendría que hacerlo en el bpl y el .exe y no TODA la aplicación la cual es grande, muy grande A ver si alguien se anima a realizar un ejemplo y podrás ver el funcionamiento Saludos!! |
#11
|
||||
|
||||
Cita:
Pues sí se puede y además creo que es lo correcto para aplicaciones muy grandes. Lo normal es que en un package coloques una serie de formularios y clases que están relacionados, o procesos. De esa forma tu aplicación resulta más modular.
__________________
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. |
#12
|
||||
|
||||
Cita:
Bueno, es parte de lo que estábamos comentado. No sólo basta con hacer eso, sino que si posteriormente vas a acceder a esa clases utilizando RTTI (GetClass) debes compilar com packages en Runtime.
__________________
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. |
#13
|
||||
|
||||
Hola
Bueno, como bien dice el colega nefatalí utilizar RTTI (run-time type informationn) en estos casos es realmente útil, pero ahora yo quisiera saber si es posible hacer lo que yo quiero, alguien aquí podría decirme si es o no posible? de ser así me lo podría explicar así como para tontos? jeje es que así logro entender Saludos!! |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Hilos con objetos dinámicos | netoDelphi | Varios | 2 | 27-11-2006 20:46:05 |
Dudas con paquetes... | adlfv | OOP | 1 | 01-09-2005 16:18:10 |
Paquetes en delphi | davezf | Varios | 4 | 05-04-2005 20:04:18 |
paquetes ¿? | acertij022 | Internet | 0 | 20-08-2003 16:06:31 |
Paquetes en runtime | rezahe | Varios | 4 | 25-05-2003 06:27:26 |
|