Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   [SOLUCIONADO] Extraño comportamiento de paquetes (https://www.clubdelphi.com/foros/showthread.php?t=85211)

jzginez 15-02-2014 01:04:44

[SOLUCIONADO] Extraño comportamiento de paquetes
 
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:
Código Delphi [-]
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:
Código Delphi [-]
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:

Código Delphi [-]
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:
Código Delphi [-]
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

Código Delphi [-]
      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

1 Archivos Adjunto(s)
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

Cita:

Empezado por jzginez (Mensaje 472733)
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

Cita:

Empezado por Neftali;.........
Total que mirando el código me han sonado extraño estas dos units añadidas al uses: [B
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

Cita:

Empezado por jzginez (Mensaje 472873)
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...


La franja horaria es GMT +2. Ahora son las 21:49:29.

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