FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Aplicacion con Plugin
Hola gente,
estoi comenzando un proyecto que involucra el desarrollo de una aplicación que está compuesta por distintos modulo: Adquisiciones, Ventas, Inventario, Facturación, etc. Investigando por la red me percate que existe para Delphi las librerias BPL. Mi idea es tener una aplicación principal, y dependiendo del perfil del usuario las distintas librerias a las cuales pudiera ingresar. De esta forma el programa completa estaría compuesto por un programa base,, mas todos los distintos modulo que componen la aplicación... una de las ventajes que le veo a esto es poder actualizar de forma separada cada modulo (archivos de menor tamaño), etc. El punto es que no se por donde comenzar aprender todo esto... encontre algunos documentos realizados por Neftali, pero me gustaría comnezar con algo mas sencillo... algo bastante mas sencillo, y asñí poder familiarizarme con todo esto. Una de las principales problemas que tuve con estos documentos, fue que no pude generar a partir de cero, los archivos bpl que necesito. Ojala me ouedan ayudar, explicando desde el principio como escribir todo el codigo que necesito para esto. Además, si es que realmente vale la pena desarrollar esta aplicaión de la forma propuesta. Gracias. |
#2
|
||||
|
||||
Cita:
En la web y embarcadero puedes encontrar documentación al respecto y algunos artículos interesantes. En cuanto al diseño de la aplicación me parece el correcto. Es más, yo comencé con el diseño de packages en una aplicación grande por una motivación similar. Diferentes módulos de la aplicación y la característica de que los diferentes usuarios cargan diferentes módulos. La aplicación es un ERP (bastante grande) y aproximadamente cuenta con 25/30 módulos. Por lo tanto no era "aceptable" que todos los usuarios cargaran TODOS los módulos. Hay usuarios que usan 4, los hay que usan 10 y los hay que los usan todos (admins). Nuestra estructura de packages es algo así; Cuenta con varias partes "conceptualmente": * EXE (1 fichero): Básicamente en el formulario principal y algo de código inicial, para iniciar la aplicación, cargar el resto de packages,... * PACKAGES DE LIBRERÍAS (6 BPL): Contienen los packages que son el CORE de la aplicación; Conexiones a Base de Datos, Controles visuales, librerías genéricas, el core de la interficie y el core para la capa de negocio. * PACKAGES BÁSICOS (2 BPL): Contiene las clases básicas para la capa de negocio. Son clases genéricas y que debe acceder todo el mundo, de ahí que se carguen de forma estática. * N PACKAGES NEGOCIO (N BPL): Por último están los packages de negocio. Que son el resto de clases/modulos con los que cuenta la aplicación. * N PACKAGES VCL. El EXE carga de forma estática (es decir que están linkados estáticamente al EXE) los packages de la VCL, los 6 packages de librerías y los 2 packages básicos. Si estos packages no se encuentran la aplicación genera error. Al cargar este core, y segun el usuario que se ha accedido, el sistema sabe qué packages debe cargar (de los N de negocio) y estos son los que se cargan de forma dinámica (utilizando LoadPackage), de forma diferente para cada usuario. de esta forma cada usuario tiene "la parte de la aplicación" que va a utilizar. Más adelante podemos discutir la carga/descarga dinámica (bajo petición). Para empezar te recomiendo que hagas un EXE y una BPL con clases y formularios. Línkalo de forma estática y de forma dinámica y en ambos casos debes acceder a ellos. Cuando tienes carga dinámica tendrás que acceder utilizando RTTI, así que tendrás que empezar a familiarizarte con estos temas. Más adelante podemos hablar de las actualizaciones de packages "por separado" y de que no es tan bonita como a primera vista parece... Te recomiendo que pruebes y que experimentes. Si tienes dudas plantéalas. A priori la complejidad aumenta al utilizar packages y aparecen algunos problemas que de otra forma no tendrías, pero considero que para aplicaciones grandes son casi imprescidibles. 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. |
#3
|
|||
|
|||
Cree un proyecto que contiene 2 packages, cada uno con algunos componentes como TLabel, Tbuttom, Tedit, etc... y un ejecutable con un TButton.
El problema es que al compilar y construir, en ninguna parte me genera los archivos BPL, sino que archivos .dpk. Como hago para crear los archivos BPL, y asi poder seguir con mis pruebas. Saludos. |
#4
|
||||
|
||||
Una DPK es un archivo de package en diseño; Ahí debes añadir tus formularios y lo que necesites dentro del packege. Cuando compilas ese DPK se genera una BPL. Revisa las opciones del DPK para saber cual es el directorio de salida y donde lo está guardando.
Debes tener 1 ProjectGroup (grupo de proyectos) que dentro tenga 1 DPR (que generará el EXE) y 2 DPK que generarán 2 BPL.
__________________
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
|
|||
|
|||
Gracias, ya pude crear los archivos BPL.
Me comentaste que en tu aplicación tienes algunos packeges que se carga de forma estatica y otras dinamica... esto quiere decir (estatica), que los carga automaticamente al ejecutarse el EXE... y dinamica, a peticion del usuario?? Me podrias guiar con algo de codigo como podría cargas estos packages tanto de forma estatica, como dinamica. Gracias |
#6
|
||||
|
||||
En principio es sencillo; Si tú en algún USES de una unit, haces referencia a elementos de otro package, el compilador linka ese pacakes de forma estática y aunque tu programa se ejecute con packages, si falta alguno de esos, tu programa fallará al iniciar.
Para utilizar un form de otro packages, por ejemplo, basta con añadirlo al uses y hacer esto:
La otra opción es no hacer referencia en los USES a nada que esté en los packages, de esa forma el compilador/linker no necesita esas referencias y no crea ese vínculo estático. Esos packages se cargan desde el programa de forma dinámica (LoadPackage o loadLibrary -en el caso de DLL's-) y para utilizar los formularios o clases que contienen se usa RTTI. En este caso si quisieras mostrar el form de usuario, deberías hacerlo como se muestra aquí, aquí, aquí, aquí o aquí. si buscas en los foros, encontrarás más referencias (busca por GetClass, 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. |
#7
|
|||
|
|||
Despues de mucho batallar logre cargar de forma dinamica mis packages.
Pero tengo algunos problemas. La forma de cargar estos paquetes funciona asi:
Las lineas Free y UnloadPackage tuve que comentarlas, ya que cambié el showmodal, por un show. La idea de esto es que funcione como si fuera un archivo de Excel (por ejemplo), en donde pudiese cerrar, maximizar o ajustar el tamaño del form dentro del parent, en este caso un TPanel. Esto funciona bien, pero el problema es que si ejecuto mas de una vez la rutina me sigue cargando nuevos Forms... y no es lo que quiero. Por esto agregue unas lineas al comienzo...
esto con el afan de que si encuentra algun componente de tipo TForm (por ejemplo), en vez de crear nuevamente lo traiga al frente. El punto es que no funcionó, me percate, que cada vez que creo el Form le agrega al nombre original "_1", "_2", "_3", y asi sucecivamente... como puedo solucioanr esto. Por otro lado, tengo en el progrma principal 2 Tform, uno que es el con el comienza la aplicación, y el segundo un TdataModule. Ocurre que tengo 2 paquetes, y en cada uno de ellos lo tengo linkeado con la sentencia "uses", al unit del datamodulo. El punto es que como NO cierro estos paquetes, si tengo uno abierto y quisiera abrir el otro, me arroja un error que no se puede cargar el paquete, porque contiene un unit que está en otro paquete. Porque ocurre esto... como puedo solucionarlo. Espero me puedan ayudar. Saludos |
#8
|
||||
|
||||
Hola mjjj.
Veo que la cosas van avanzando... Te felicito, es un tema compejo, pero muy interesante, no te desanimes. Sería bueno que subieras un proyecto (Grupo de proyectos BPG) con lo que vas haciendo, para poder ir probando (no sólo yo, sino el resto de gente). Y sobre ese proyecto se pueden ir aciendo las modificaciones y los cambios. Revisemos... Cita:
Prueba este código en el With y verás:
Ahora la ejecución se detiene cuando está en pantalla en diálogo (es modal), cuando cierres el diálogo sigue y el form se destruye. Ok, ahora supongamos que comentas las líneas del Free y del UnloadPackage, con lo que los forms que creas no se destruyen. Cita:
También es imprescindible que el Owner del formulario creado sea el form actual, de otra forma el FindComponent no te lo encontrará. Prueba con este código:
Cita:
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. |
#9
|
|||
|
|||
Adjunto el proyecto simplificado para que puedan echarle una mirada.
Los problemas son los siguientes. 1.- Resolví el asunto que cargaba muchisimas veces un package, pero el problema es que al cerrar el formulario cargado por el paquete, y lo vuelvo a cargar, me arroja que no puedo enfocarme en una ventana invisible. 2.- Si cargo un paquete, y a continuación el segundo, me arroja que no se puede cargar el paquete porque contiene el unit conect, al cual el paquete cargado también hace referencia. Espero me puedan ayudar. Gracias. |
#10
|
|||
|
|||
Ahora si va el archivo.
Saludos. Última edición por mjjj fecha: 19-07-2010 a las 21:17:40. |
#11
|
||||
|
||||
Hola mjjj.
Te paso el ejemplo con algunas modificaciones. Tengo que marchar, así que no me puedo parar casi nada, luego si me da tiempo lo comento de forma más extensa. * He cambiado para que las consultas apunten al BDE (y poder probarlo) * En los formularios de los packages te falta el:
Para que el formulario se destruya. Si no lo que hace delphi por defcto es enconderlo (Hide), de ahí el error que te daba al abrilo la segunda vez. Luego más. Chao.
__________________
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
|
|||
|
|||
Que formato tiene el archivo adjunto... no se con que abrirlo.
Me ayudas porfavor. Saludos. |
#13
|
||||
|
||||
Perdón. Es un problema que tengo dede hace tiempo cuando subo ficheros ZIP al foro.
Te vuelvo a subir otro ZIP y un RAR al que tienes que quitarle la extensión ZIP a ver si alguno puedes descompimirlo.
__________________
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. |
#14
|
|||
|
|||
He vuelto a retomar esto, y me han surgio un problema.
El proyecto tiene un ejecutable con varios paquetes que se cargan de forma dinamica. Para que esto funcione tuve que seleccionar la opción de build with packages. Ahora bien, una vez compilado y ejecutado en el PC donde se desarrollo funciona perfecto, pero al llevarlo a otro PC, me arroja un error que no encuentra el archivo rtl100.bpl. Por otro lado, si retiro la opción de build with packages, se ejecuta el programa sin problema, pero al tratar de cargar los paquetes creados por mi, no ocurre nada... ni error ni paquete abierto. Que podrá ser esto? Espero me puedan ayudar. |
#15
|
||||
|
||||
Es correcto.
Si una aplicación utiliza package dinámicos como esta, y para ello usa RTTI, debe estar compoilada TODA con packages. Es decir, para utilizar los packages tal y como están aquí tu aplicación debe estar compilada con el flag "Build with runtime packages". Eso significa que junto con tu aplicación y sus packages, deberás distribuir los packages de la VCL necesarios para que esta funcione. Para saber qué packages necesitas puedes usar "dependency Walker", GExperts (PE explorer) o el "Executable Analizer (Cn)" que el otro día subí al FTP del Club. Con cualquiera de estos programa si les das el ejecutable te dicen la lista de packages que debes distribuir con él. La otra opción es generar un sólo ejecutable (sin "Build with runtime packages") y cargar los packages de forma dinámica, pero en ese caso no podrás utilizar RTTI. Es decir, podrás cargar los packages como si fueran DLL's, y perderás MUCHO potencial (todo lo que te ofrece RTTI, o lo que es lo mismo, pierde toda la gracia , y en ese caso casi es más recomendable usar DLL's).
__________________
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
|
|||
|
|||
No hay caso, no he podido resolverlo.
Si corro el programa que sugirieron, me arroja que utiliza en package rtl100.bpl (entre otros). Ahora bien si en la opción de los packages de la aplicación agrego el rtl100.bpl, me arroja que este no existe. Si reviso el listo de packeges existe uno que se llama rtl.bpl. Revise el directorio de windows\system32, y encontre el packages. si trato de instalarlo no hay caso.. no me deja, dice que ya esta instalado. Como puedo solucionar esto? Por ultimo en un PC que estaba limpio, es decir, nunca se había instalado Delphi 2006, lo instale. Creé un proyecto nuevo, el cual consistia en un TForm, el cual contenia un TButton. Me fui a la opción de los packages y le seleccione la opción de build with packages, lo compile y lo mismo... No se que hacer... ayuda porfa Gracias |
#17
|
|||
|
|||
Finalmente lo que hice fue buscar en el equiopo de desarrollo todas las librerias que necesitaba la aplicación, y las copie a la carpeta donde se copió la aplicación.
El punto es que tuve que copiar todas las librerias, no solo con la que tenia problema.... Como puedo agregar las librerias en el mismo ejecutable? Me imagino que al seleccionar el build with packages, existe unaopción de agregar packages... asumo que aquí es donde se agregan.. esto es asi?? Asumiendo eso, lo realice y no me funcionó... Porque podría ser esto? Otra idea, como puedo selccionar de donde leer las librerias del ejecutable... en las mismas opciones del ejecutable hay un item que dice directorios... aquí escribo el directorio de la librerias, para no tenerlas en la misma carpeta donde está el ejecutable... y tampoco me fucniona. Son varias preguntas, espero me puedan ayudar. Gracias |
#18
|
||||
|
||||
Cita:
Eso es correcto, no te has equivocado. Lo lógico es que tu instalador, cuando lo hagas, las copie. Cita:
Si quieres utilizar carga dinámica de Packages y RTTI, debes compilar tu aplicación con "Build with runtime packages" y por tanto desdes distribuir: * EXE * BPL's dinámicos que has creado tú * BPL's de librerías Cita:
Si realizas carga estática, las librerías deben estar en el directorio del ejecutable o en un directorio del path del sistema (C:\Windows), por ejemplo. Si quieres que estén en otro, debes especificarlo en el path.
__________________
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. |
#19
|
||||
|
||||
DLL's, DPL's, carga dinámica, carga estática y Packages en Runtime
DLL's, DPL's, carga dinámica, carga estática y Packages en Runtime
Lo he explicado aquí, espero que te aclare un poco las cosas. 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. Última edición por Neftali [Germán.Estévez] fecha: 16-07-2010 a las 14:08:27. |
#20
|
|||
|
|||
Gracias Neftali por tu respuesta, me fue de mucha ayuda.
Tengo otras dudas. Mi aplicación consta del ejecutable (3 forms y 1 DataModule), 3 paquetes de carga dinámica (desarrollados por mi), y librerias de terceros. Me interesa que las librerias de terceros se cergen de forma estatica, pero que ademas esten en una carpeta dentro de la carpeta donde esta instalado la aplicación. Esto se define en las opciones de proyecto... ¿en search path? El Datamodule contiene los componentes necesarios para conectarme con la BD. En los paquetes se carga dinamica, le agrego el datamodule como "uses datamodule". el problema ocurre al tratatr de cargar un paquete cuando tengo otro abierto, me arroja que en otro paquete ya se esta usuando el datamodule. Como puedo solucionar esto? Gracias |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
FirebirdConfig ahora en Plugin para IBExpert | egostar | Noticias | 15 | 26-09-2008 23:45:17 |
Plugin para outlook | fjardelphiyahoo | OOP | 1 | 18-09-2007 14:14:01 |
¿Como instalo plugin en IBexpert? | NPIdea | Firebird e Interbase | 1 | 22-06-2007 14:27:10 |
Instalar Plugin en eclipse | Paoti | JAVA | 3 | 08-01-2007 21:47:23 |
Que es un plugin? | chavetaz | Varios | 2 | 19-10-2004 15:41:29 |
|