Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-07-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Cerrar Paquetes cargados dinámicamente, desde el paquete.

Estoy cargando dinámicamente un paquete BPL desde un ejecutable (Aplicación MDI) de la siguiente forma:
Código Delphi [-]
   PackageModule := LoadPackage('UnBPL.bpl');
   if PackageModule <> 0 then begin
    AClass := GetClass('TClaseBPL');
    if AClass <> nil then begin
     with TComponentClass(AClass).Create(Application) as TForm do begin
      OnClose := LiberaBPL;
      Tag := PackageModule;
      Show;
      //Free
     end; //with
    end else begin
      showmessage('no se pudo');
    end; //if aclass
//   UnloadPackage(PackageModule);
   end; //if package <>0

El detalle está en que le asigno al evento OnClose, le asigno la función "LiberaBPL", la cuál lo único que hace es liberar el paquete de la siguiente forma:
Código Delphi [-]
  Temp := (sender as TForm).Tag;
  (sender as TForm).Free;
  UnloadPackage(Temp);

Si le doy click al botón cerrar de la barra de título (la tachita roja), se ejecuta el evento OnClose desde la aplicación que lo carga (MDI) y se libera el paquete si problemas:
Es decir: MDI -> OnClose -> LiberarBPL -> Regresa al MDI

Pero si dentro del BPL pongo un botón "Cerrar" con la instrucción "Close", el evento OnClose se manda llamar desde el mismo BPL y me genera un error de memoría, porque pasada la línea "UnloadPackage", intenta regresar al BPL, pero este ya fue liberado;
Es decir: BPL -> OnClose -> LiberarBPL -> Regresa al BPL - Error de memoria

Puedo hacer, en lugar de la instrucción "Close", poner la instrucción "Free" y el BPL se libera, pero no se libera en la aplicación MDI (nunca ejecuta el OnClose -> LiberarBPL).

Así que mi pregunta es: ¿Como puedo cerrar y liberar el paquete, desde el mismo paquete? Cualquier idea, orientación o comentario es bienvenido.
__________________

Responder Con Cita
  #2  
Antiguo 22-07-2008
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Igual me equivoco, pero quien debe cerrar el paquete es quien lo cargó. Bueno yo así lo hago. mi forma carga el paquete, invoca las clases y descarga el paquete.
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 22-07-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Si cargara los paquetes de forma Modal, al cerrar el paquete se descargaría. Pero no los muestro de forma modal, el BPL es un formulario hijo "MDICHild", por lo que desconozco en que momento el usuario cierra el formulario. Y sí, quien lo descarga es quien lo carga, el punto es que si desde el BPL mando llamar la función para liberar el paquete, al final trata de regresar al BPL, pero como ya se liberó, entonces me marca error de memoría.
__________________

Responder Con Cita
  #4  
Antiguo 23-07-2008
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.285
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 ContraVeneno Ver Mensaje
Si cargara los paquetes de forma Modal, al cerrar el paquete se descargaría.
Bueno, no se si los paquetes "se cargan de forma modal o no". Supongo que te refieres a que el formulario que hay en el paquete se muestre modal o no. Creo que eso es independiente de que el paquete se cargue o se descargue.
Es decir, si el formulario es modal, se liberará al cerrarlo (caFree), pero eso no quiere decir que el paquete se descargue.

Creo que intentar descargar el paquete desde el mismo paquete sólo te va a dar problemas. En todo caso puedes hacer un "Gestor de paquetes", que "vigile" cuantos formulario de un paquete hay cargados y cuando no quede ninguno abierto te los descargue automáticamente.
De la misma forma y ampliando un poco más, ese mismo gestor se puede encargar de cargarlos automáticamente cuando necesites un formulario de un paquete...
__________________
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 23-07-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
...Supongo que te refieres a que el formulario que hay en el paquete se muestre modal o no. Creo que eso es independiente de que el paquete se cargue o se descargue....
Si, a eso me refiero, al formulario del paquete. Si lo mostrara de forma Modal, (que es como lo hacen en el ejemplo que seguí) justo despúes del "ShowModal" está el "Free" y el "UnloadPackage" (están como comentario en el código que puse, ya que como yo no los muestro de forma modal, no los puedo liberar en ese momento).

Cita:
Empezado por Neftali Ver Mensaje
Es decir, si el formulario es modal, se liberará al cerrarlo (caFree), pero eso no quiere decir que el paquete se descargue.
Sí despues del "Free" pones el "unloadpackage", sí se libera

Cita:
Empezado por Neftali Ver Mensaje
Creo que intentar descargar el paquete desde el mismo paquete sólo te va a dar problemas.
La descarga se hace en el evento OnChildClose que le asigno en el formulario principal (MDI), el problema es que mando llamar ese procedimiento desde el paquete... oh bueno, se manda llamar solo con la instrucción "Close" del formulario del paquete.

Y creo que sí empezaré a ver como realizamos un "gestor" como mencionas.
__________________

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
Liberar Paquetes cargados dinámicamente ContraVeneno Varios 3 08-07-2008 14:58:38
Evitar cerrar formulario principal si hay librerías cargadas dinámicamente ContraVeneno Varios 5 03-07-2008 16:21:14
Error al cerrar aplicacion cuando creo fields dinamicamente mierda OOP 3 02-11-2006 18:57:41
Cerrar dos formularios creados dinamicamente (al mismo tiempo) ctronx Varios 7 02-09-2004 00:19:04
cerrar formularios creados dinamicamente ctronx Varios 5 17-06-2004 18:25:17


La franja horaria es GMT +2. Ahora son las 23:38:26.


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