Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-06-2010
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 20
mjjj Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 12-06-2010
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: 19.442
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
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:

Código Delphi [-]
formUsuario := TFormUsuario.Create(...)
...

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.
Responder Con Cita
  #3  
Antiguo 15-06-2010
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 20
mjjj Va por buen camino
Despues de mucho batallar logre cargar de forma dinamica mis packages.

Pero tengo algunos problemas.

La forma de cargar estos paquetes funciona asi:

Código Delphi [-]
var
  Frame :TForm;
  PackageModule: HModule;
  AClass: TPersistentClass;
begin
Frame := FindComponent ('Form5') as TForm;
if Assigned (Frame) then frame.BringToFront
else
BEGIN

PackageModule := LoadPackage('C:\PROGRAMAS\DOMMO_3\Mas.bpl');
  if PackageModule <> 0 then
  begin
    AClass := GetClass('TForm5');
    if AClass <> nil then
      with TComponentClass(AClass).Create(Application)
        as TForm do
      begin
        parent := panel1;
        Show;
   //     Free;
      end;
 //   UnloadPackage(PackageModule);
  end;
end;

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

Código Delphi [-]
Frame := FindComponent ('Form5') as TForm;
if Assigned (Frame) then frame.BringToFront
else

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
Responder Con Cita
  #4  
Antiguo 15-06-2010
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: 19.442
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
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.


Cita:
Empezado por mjjj Ver Mensaje
Pero tengo algunos problemas.
Revisemos...

Cita:
Empezado por mjjj Ver Mensaje
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.
Es lógico. Si haces un ShowModal, la ejecución del programa se detiene en ese punto hasta que cierras el formulario. Si locambias por un Show, piensa que después del Show el programa sigue, así que visualizas el formulario, y justo después, lo liberas (Free) y descargas el package. Funciona, pero el resultado será que no te dará tiempo ni a verlo.

Prueba este código en el With y verás:

Código Delphi [-]
      with TComponentClass(AClass).Create(Application)       as TForm do      begin
        parent := panel1;
        Show;
        MessageDlg('Visualizado...   Continuo destruyendo', mtInformation, [mbOK], 0);
        Free;
      end;

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:
Empezado por mjjj Ver Mensaje
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.
Seguramente basta con que le asignes ese nombre. Estás buscando por nombre (FindComponent), pero no le asignas nombre al form, por eso al crearlo se le asigna uno automático.
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:

Código Delphi [-]
  Frame := FindComponent('Form5') as TForm;
  if Assigned (Frame) then begin
    frame.BringToFront;
    Frame.SetFocus;
  end
  else BEGIN
    PackageModule := LoadPackage('.\Mas.bpl');
    if PackageModule <> 0 then begin
    AClass := GetClass('TForm5');
    if AClass <> nil then begin
      /////  Crearlo con el OWNER A SELF
      with TComponentClass(AClass).Create(Self)       as TForm do      begin
        parent := panel1;
        Name := 'Form5';    //////NOMBRE
        Show;
      end;
    end;


Cita:
Empezado por mjjj Ver Mensaje
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.
Creo que esto es un problema en el diseño de los packages. Tal vez deberías subir el proyecto (o uno más pequeño de ejemplo con el mismo problema) para poder examinarlo detalladamente.

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
  #5  
Antiguo 15-06-2010
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 20
mjjj Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 15-06-2010
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 20
mjjj Va por buen camino
Ahora si va el archivo.

Saludos.

Última edición por mjjj fecha: 19-07-2010 a las 20:17:40.
Responder Con Cita
  #7  
Antiguo 15-06-2010
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: 19.442
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
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:

Código Delphi [-]
Action := caFree;  // en el OnClose

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.
Archivos Adjuntos
Tipo de Archivo: zip Test Packages dinamicosv2.zip (88,0 KB, 18 visitas)
__________________
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
  #8  
Antiguo 15-06-2010
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 20
mjjj Va por buen camino
Que formato tiene el archivo adjunto... no se con que abrirlo.

Me ayudas porfavor.

Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
FirebirdConfig ahora en Plugin para IBExpert egostar Noticias 15 26-09-2008 22:45:17
Plugin para outlook fjardelphiyahoo OOP 1 18-09-2007 13:14:01
¿Como instalo plugin en IBexpert? NPIdea Firebird e Interbase 1 22-06-2007 13:27:10
Instalar Plugin en eclipse Paoti JAVA 3 08-01-2007 20:47:23
Que es un plugin? chavetaz Varios 2 19-10-2004 14:41:29


La franja horaria es GMT +2. Ahora son las 07:27:03.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi