Ver Mensaje Individual
  #6  
Antiguo 25-08-2005
Avatar de jmariano
jmariano jmariano is offline
Miembro
 
Registrado: jul 2005
Posts: 376
Reputación: 19
jmariano Va por buen camino
Cita:
Empezado por roman
Regresando al principio; incluir la unidad en tu aplicación no sirve porque fuerzas un enlace estático.

La solución

Citar:
Originalmente publicado por jmariano

Para hacer esto lo único que tienes que hacer es especificar el unit "UBD" (donde se encuentra declarado el objeto _BD) en la cláusula "uses" del .dpr pero sin añadir "UBD" al proyecto (porque si lo añades, entonces, no usará el del paquete).




hasta donde yo entiendo no es correcta. Si quitas el paquete del proyecto pero dejas la referencia en la cláusula uses lo que sucederá es que tu aplicación ya no sólo se enlazará estáticamente al paquete, sino que de hecho lo integrará al ejecutable. Aun cuando logres apuntar al objeto que está en el paquete cargado dinámicamente, la realidad es que tendrás dos copias del objeto, con lo cual pierde sentido el cargarlo dinámicamente.

Para usar paquetes dinámicos- evitando el enlace estático, tu aplicación no puede contener ninguna referencia al paquete, ni en la lista de run time packages ni en las cláusulas uses.
Eso no es correcto, el hecho de añadir a la cláusulas "uses" el unit donde se encuentra declarado el objeto no significa que haya un enlace estático y lo integre en el ejecutable o en un paquete (de hecho, la aplicación cargará el paquete automáticamente cuando se haga referencia al objeto, y no necesitaremos usar "LoadPackage"). Pero para que esto sea así es necesario añadir a la cláusula "Requires", de todos los paquetes que usen un objeto, el paquete donde se encuentra implementado dicho objeto. Precisamente, la cláusula "Requires" sirve para indicar que no sean enlazadas estáticamente en un paquete aquellas clases u objetos utilizados que se encuentran en otras units dentro de otros paquetes. Por último, para conseguir que nuestras clases u objetos no sean enlazadas estáticamente dentro del ejecutable, es necesario especificar en la lista "Runtime packages" (sería el equivalente a la cláusula "Requires" de los paquetes), del archivo de proyecto, todos los paquetes donde se encuentren dichas clases u objetos.

Tened en cuenta que cuando se compila un paquete se genera, a parte del .bpl, un archivo de extensión .dcp (que equivaldría a los .dcu de las unit). Este archivo es el que especificamos en la cláusula "Requires" de los paquetes y en la lista "Runtime packages" del archivo de proyecto, y realizar esto sirve precisamente para indicar a la aplicación que paquetes han de ser cargargados dinámicamente (y no enlazarlos estáticamente), evitándonos así todo el proceso que representa la carga manual de paquetes. (Para verlo más fácilmente, imaginemos que cada vez que especificamos un archivo .dcp se está añadiendo a una "lista", dentro del ejecutable o .bpl, aquellos paquetes que han de ser cargados dinámicamente).

Por último, aclarar nuevamente que es necesario especificar en la lista "Runtime packages" del archivo de proyecto aquellos paquetes que se desean usar de forma dinámica (porque sino, entonces, sí que se enlazaran estáticamente). (Esta es una de las razones del porqué los ejecutables son tan grandes en Delphi, y cuando hacemos uso de los paquetes de ejecución se "encogen").

Última edición por jmariano fecha: 25-08-2005 a las 14:51:13.
Responder Con Cita