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 18: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
|
||||
|
||||
hola
A ver, estoy más perdido que no se qué, a ver, os explico mi problema, yo por ejemplo quiero meter unos componentes en un BPL y poder crearlos desde mi formprincipal, pudiendo acceder a ellos como si estaríen en mi form, y como son varios necesito hacer como una especie de API para que me digan todos sus métodos, propiedades, etc Se entiende lo que quiero hacer? me gustaría que alguien me pueda pasar un ejemplo de como hacer esto con componentes saludos! |
#9
|
||||
|
||||
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!! |
#10
|
|||
|
|||
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 |
#11
|
||||
|
||||
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!! |
#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!! |
#14
|
||||
|
||||
Cita:
Pues puedes crear componentes en un package sin problemas. En realidad todos los componentes que se distribuyen para delphi suelen venir de esa manera. Lo que no entiendo es que si quieres utilizar esos componentes en tus formularios, deberás instalarlos en el IDE y usarlos en diseño. Si sólo quieres crearlos en ejecución, puedes cargar ese package dinámicamente, pero no acabo de enterder muy bien la utilidad de esto último.
__________________
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. |
#15
|
||||
|
||||
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. |
#16
|
||||
|
||||
Hola
Sí, eso entendí desde un principio, pero resulta que no sé por donde empezar, vamos, que esto de los forms ya entendía, pero qué pasaría en el caso de componentes de 3ros? como por ejemplo los TMS si quier meter en un BPL y poder acceder a ellos desde mi app ? creo que es lo único que me falta para solucionar mis problemas. desde ya muchas gracias por por sus respuestas y ayudas. Saludos! |
#17
|
||||
|
||||
Cita:
Tal vez no entendí este último punto.
__________________
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. |
#18
|
||||
|
||||
Hola
A ver, la idea es esta: crear un componente o uno que ya exista, entonces meter este y otros a un BPL, osea hacer un BPL de varios componentes, hasta ahí claro, digamos que se llama comps.bpl, ahora yo en mi form principal tengo que crear un componente del comps.bpl, eso lo hago de la forma expuesta en los anteriores post, hasta aquí todo funciona correctamente, pero no puedo acceder a sus métodos propiedades, etc del dicho componente :S es mas, he seguido esta guía http://tinyurl.com/d3lafr Donde ahí exponen lo que quiero hacer, el que tengo algo de tiemop me gustaría que lo prueben, como ven, el mete 2 componentes en un BPL y luego desde otro form los llama, yo no he logrado que me muestre el edit en mi form, no sé por que, pero me da error en estas líneas
A ver, logro pasar el primer If, donde mi cls NO vale nil, entonces según yo, o lo que entiendo poco o nada de OO, ahí Obj es un objeto que hereda TODO lo del componente que está en el BPL, entonces ahí da a suponer que ulego utiliza su propiedad Parent, Left, Top, pero yo cuando hago lo mismo en la línea Obj.Parent el delphi me marca error, no me deja compilar por que dice que esa propiedad no existe, claro, supongo por que no a acargado el componenet aún, ni lo a creado ni nada, pero entonces, ¿cómo debería poder mostrar el componente en el form principal ? si siguen leyendo el link que puse ahí, la parte de mostrar el método AboutBox SI me funciona, osea puedo lograr mostrar el Dialog ese definido en el BPL, pero mas no las propiedades. Espero que alguien me sepa ayudar, desde ya muchas gracias Adiós! PD: por cierto, qué diferencias hay entre GetClass y FindClass ? creo que a mí con ambas me funciona Última edición por BlackDaemon fecha: 10-04-2009 a las 19:05:11. |
#19
|
||||
|
||||
Pues yo he probado y funciona correctamente la creación de componentes.
Los pasos que he seguido. 1º) Coger los PAS de dos componentes derivados de TEdit (AlignEdit -de Román- y EditInsideHelp -mio-). Son los primero que se me han venido a la cabeza. 2º) He creado un nuevo package y los he incluído ambos dentro. No he puesto los DCR de las imágenes para abreviar. El package se llama PExEdit.dpk y está guardado en el mismo directorio y se copila sin problemas. 3º) Creo una nueva aplicación llamada Testpk en ese mismo directorio. 4º) Antes de continuar y puesto que los componentes no lo tienen, he añadido a ambos el registro de la clase, tal y como explica en el documento anterior al que tú mencionas.
5º) Una vez hecho esto, el package compila perfectamente y el proyecto también. He añadido al proyecto el código para cargar el package en Runtime.
6º) Sólo queda hacer una cosa. En el proyecto, puesto que se van a usar carga dinámica de packages y acceso por RTTI, hay que marcar la opción "Build With runtime package" en las opciones. 7º) Para hacer algunas pruebas más he añadido una rutina que te permite modificar propiedades vía RTTI a partir de su nombre, con lo que puedes modificar propiedades de los componentes. Funciona perfectamente. Te dejo el proyecto completo. Y los ha creado correctamente...
__________________
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. Última edición por Neftali [Germán.Estévez] fecha: 14-04-2009 a las 17:09:14. |
#20
|
||||
|
||||
Hola
Sí, yo también a prueba y error lo he logrado jeje, pero aunque de una forma algo diferente pero en si, llegamos a los mismo, pero como tu lo expones aquí es de lo mejor, muchas gracias neftalí, eres dios por cierto, di tengo 3 componentes en el bpl, y desde mi form principal quiero crear uno, ¿cómo sabría los nombres de los componentes que tengo en el bpl ? osea, sus nombres, métodos, etc, algo así como hace delphi que te muestra mientras vas escribiendo, si esto lo hace automáticamente retiro la pregunta. Pero mi idea era crear una especie de api que me permita saber los nombres de los componentes del bpl y sus propiedades, etc Saludos! |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Hilos con objetos dinámicos | netoDelphi | Varios | 2 | 27-11-2006 21:46:05 |
Dudas con paquetes... | adlfv | OOP | 1 | 01-09-2005 17:18:10 |
Paquetes en delphi | davezf | Varios | 4 | 05-04-2005 21:04:18 |
paquetes ¿? | acertij022 | Internet | 0 | 20-08-2003 17:06:31 |
Paquetes en runtime | rezahe | Varios | 4 | 25-05-2003 07:27:26 |
|