PDA

Ver la Versión Completa : [SOLUCIONADO] Extraño comportamiento de paquetes


jzginez
15-02-2014, 01:04:44
Hola amigos estoy intentando dividir mi aplicación en paquetes, ya lei todas las ayudas que hay aquí en el foro, vi el video que recomiendan, etc.

logro hacer lo siguientes:

Forma principal:
procedure TFrmModCatalogos.SpeedButton1Click(Sender: TObject);
Var
PackageModule: HModule;
Aclass: TPersistentClass;
begin
PackageModule:= Loadpackage('PackCtrlClasiClientes.bpl');
if PackageModule <> 0
Then Begin
Aclass:= GetClass('TFrmGBCLasiClient1');
if Aclass <> nil
Then Begin
FormaHija:= TComponentClass(Aclass).Create(Application) as TForm;
if Assigned(FormaHija)
then FormaHija.OnClose:= ChildFormClose
else begin
UnloadPackage(PackageModule);
PackageModule:= 0;
end;
End;
End;
end;


Creo el paquete PackCtrlClasiClientes.bpl con las siguientes formas
Forma 1:
unit UniFrmGBCLasiClient;

.....

type
TFrmGBCLasiClient = class(TForm)
....
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmGBCLasiClient: TFrmGBCLasiClient;

implementation


{$R *.dfm}

.......

initialization
RegisterClass(TFrmGBCLasiClient);
finalization
UnRegisterClass(TFrmGBCLasiClient);

end.

Forma 2:

unit UniFrmGBCLasiClient1;

...

type
TFrmGBCLasiClient1 = class(TFrmGBCLasiClient)
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmGBCLasiClient1: TFrmGBCLasiClient1;

implementation

{$R *.dfm}

initialization
RegisterClass(TFrmGBCLasiClient1);
finalization
UnRegisterClass(TFrmGBCLasiClient1);

end.

He suprimido el código de los componentes de las formas para ahorrar espacio

Como veran en la forma principal al hacer click en un boton cargo el paquete y mando a llamar a la forma 2 (TFrmGBCLasiClient1) y esto funciona de forma correcta no hay ningun problema, pero al agregar una tercera forma a mi paquete

Forma 3:
unit UniFrmAMClasiClient;

....
type
TFrmAMClasiClient = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmAMClasiClient: TFrmAMClasiClient;

implementation

{$R *.dfm}

.....

initialization
RegisterClass(TFrmAMClasiClient);
finalization
UnRegisterClass(TFrmAMClasiClient);

end.

En ejecutarlo en el programa principal AClass siempre me da nil

Aclass:= GetClass('TFrmGBCLasiClient1');
if Aclass <> nil


Alguna idea para crear esta 3° Forma? o como corregir el error

Gracias

Neftali [Germán.Estévez]
17-02-2014, 10:46:24
La forma más sencilla de poder probarlo y ayudarte (para no probar cada uno una cosa diferente) es que prepares un pequeño proyecto de ejemplo con el paquete los formularios y el ejecutable y lo subas.
De esa forma podemos probar todos sobre lo mismo y ayudarte.

Es una sugerencia.

jzginez
18-02-2014, 00:15:14
Listo ahí esta lo que llevo del proyecto. La forma UniFrmAMClasiClient es la que cuando anexo al proyecto de marca el error.

Cualquier comentario sobre el funcionamiento del proyecto es mas que bien venido

Gracias

Neftali [Germán.Estévez]
18-02-2014, 10:51:24
Listo ahí esta lo que llevo del proyecto. La forma UniFrmAMClasiClient es la que cuando anexo al proyecto de marca el error.
Cualquier comentario sobre el funcionamiento del proyecto es mas que bien venido


Revisando el proyecto, lo que he visto es que el problema está en el form UniFrmAMClasiClient, porque si se añade otro (uno nuevo funciona perfectamente).
Eso me ha hecho pensar que había algo "raro" en este formulario, que impedía la carga o que hacía que las clases no se registraran correctamente.
Total que mirando el código me han sonado extraño estas dos units añadidas al uses: QComCtrls, QMask :eek::eek:

No pertenecen a la VCL (antigua compatibilidad con Kylix, imagino).
Si las quitas, verás que el problema desaparece.

Buen trabajo con paquetes. ^\||/^\||/^\||/

Un saludo.

jzginez
18-02-2014, 21:38:22
QComCtrls, QMask[/B]


Gracias Neftali esas dos unidades las uso para el procedimiento escribe archivo, para el componente SpinEdit y MaskEdit respectivamente, las quite y aún así no funciono, ya volví a crear una forma nueva y funciona bien así que voy a tener que ir agregando poco a poco el código de la forma e ir probando para encontrar el error

Neftali [Germán.Estévez]
19-02-2014, 07:52:42
Pues a mi me ha funcionado perfectamente el proyecto.
Es verdad que previamente a esas 2 units, he tenido que eliminar algunas cosas más, pero al final, el quitar esas 2 ha sido lo que lo ha hecho funcionar.
:confused:

jzginez
21-02-2014, 01:09:19
Gracias Neftali no se que paso pero ya creada la nueva forma funciona y agrege poco a poco las funciones que estaban comentadas en el que te envie y haciendo algunos cambios de código, obligados por cambiar de una aplicación normal a una por paquetes, y ya esta funcionando

Nuevamente gracias

p.d. como marco este hilo como cerrado?

Neftali [Germán.Estévez]
21-02-2014, 14:25:43
p.d. como marco este hilo como cerrado?

No lo cierres, por si más adelante otro usuario quiere añadir algo o comentar/preguntar.
Si quieres puedes cambiar el título y añadir al inicio un [SOLUCIONADO].

Estaría bien. ;)

AÑADO: He realizado una prueba y lo he añadido yo...