Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-04-2009
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
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:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  PackageModule: HModule;
  AClass: TPersistentClass;
begin
  PackageModule := LoadPackage('Package1.bpl');
  if PackageModule <> 0 then
  begin
    AClass := GetClass('TForm2');
 
    if AClass <> nil then // <-- Aquí tengo AClass con Nil
      with TComponentClass(AClass).Create(Application)
        as TCustomForm do
      begin
        ShowModal;
        Free;
      end;
 
    UnloadPackage(PackageModule);
  end;
end;

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!
Responder Con Cita
  #2  
Antiguo 08-04-2009
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.286
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
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.
Responder Con Cita
  #3  
Antiguo 08-04-2009
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
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!
Responder Con Cita
  #4  
Antiguo 08-04-2009
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.286
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 BlackDaemon Ver Mensaje
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
Pues justamente por eso te recomendé que leyeras el artículo y que revisaras el proyecto de ejemplo (que por cierto he corregido el link porque no era correcto). Porque ahí se hace lo mismo que tú estás haciendo (GetClass) y sí funciona correctamente.


Cita:
Empezado por BlackDaemon Ver Mensaje
ahora, con lo de la apuesta creo que te gano
Todavía albergo esperanza...

Cita:
Empezado por BlackDaemon Ver Mensaje
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.
Pues creo que eso es lo que no has entendido bien.

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.
Responder Con Cita
  #5  
Antiguo 08-04-2009
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
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?
Responder Con Cita
  #6  
Antiguo 08-04-2009
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.286
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 BlackDaemon Ver Mensaje
¿Por qué los ejemplos que exponen ahí, los del zip no funcionan ? ...pero he vuelto a compilar el programa activando build runtime packages y SOLO dejé ahí &quot;vcl&quot; y eliminé package1 y funcionó, me mostró el form2, es correcto lo que hice?
Pues sí funcionan si los configuras correctamente.
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 &quot;Build with runtime packages&quot;.

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.
Responder Con Cita
  #7  
Antiguo 08-04-2009
Efren2006 Efren2006 is offline
Miembro
 
Registrado: feb 2006
Posts: 172
Poder: 19
Efren2006 Va por buen camino
BlackDaemon

Yo utilizo mi aplicacion exactamente como tu lo necesitas, para que esto funciones debes Registrar la Clase al final de cada form:

Código Delphi [-]

initialization
RegisterClass(TForm2);
 
finalization
UnRegisterClass(TForm2);
Responder Con Cita
  #8  
Antiguo 08-04-2009
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Cita:
Empezado por Efren2006 Ver Mensaje
BlackDaemon

Yo utilizo mi aplicacion exactamente como tu lo necesitas, para que esto funciones debes Registrar la Clase al final de cada form:

Código Delphi [-] initialization RegisterClass(TForm2); finalization UnRegisterClass(TForm2);
Hola

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!!
Responder Con Cita
  #9  
Antiguo 08-04-2009
Efren2006 Efren2006 is offline
Miembro
 
Registrado: feb 2006
Posts: 172
Poder: 19
Efren2006 Va por buen camino
Cita:
Empezado por BlackDaemon Ver Mensaje
Hola

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!!
Disculpa,, no habia leido al detalle la expliacion de Neftali, y de tu problema, efectivamente es como el te lo explica, yo tambien uso delphi 2009, pero no he tenido la necesidad de crear componentes solo Formularios,

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
Responder Con Cita
  #10  
Antiguo 08-04-2009
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
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!!
Responder Con Cita
  #11  
Antiguo 09-04-2009
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.286
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 BlackDaemon Ver Mensaje
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

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.
Responder Con Cita
  #12  
Antiguo 08-04-2009
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.286
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 Efren2006 Ver Mensaje
Yo utilizo mi aplicacion exactamente como tu lo necesitas, para que esto funciones debes Registrar la Clase al final de cada form

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.
Responder Con Cita
  #13  
Antiguo 09-04-2009
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
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!!
Responder Con Cita
Respuesta



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
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


La franja horaria es GMT +2. Ahora son las 21:51:59.


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