Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cerrar Paquetes cargados dinámicamente, desde el paquete. (https://www.clubdelphi.com/foros/showthread.php?t=58516)

ContraVeneno 22-07-2008 22:49:11

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.

poliburro 22-07-2008 22:52:27

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.

ContraVeneno 22-07-2008 23:20:07

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.

Neftali [Germán.Estévez] 23-07-2008 10:30:20

Cita:

Empezado por ContraVeneno (Mensaje 302451)
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...

ContraVeneno 23-07-2008 15:42:28

Cita:

Empezado por Neftali (Mensaje 302564)
...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 (Mensaje 302564)
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 :D

Cita:

Empezado por Neftali (Mensaje 302564)
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.


La franja horaria es GMT +2. Ahora son las 01:14:46.

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