PDA

Ver la Versión Completa : Paquetes dinamicos


xerkan
17-10-2007, 11:44:55
Estoy haciendo pruebas con un programa que trabaja con paquetes dinamicos de delphi (bpl) lo crea todo perfectamente pero quiero que desde el paquete se puedan acceder a los datos publicos del formulario que lo creo pero si lo linko normalmente me da el sisguente warning:

[DCC Warning] Package1.dpk(36): W1033 Unit 'Unit1' implicitly imported into package 'Package1'

y cuando ejecuto la aplicaccion me da un access violation al intentar aceder a los datos del formulario padre

al paquete lo estoy llamando con el siguiente codigo:


procedure TForm1.Button1Click(Sender: TObject);
var
PackageModule: HModule;
AClass: TPersistentClass;
begin
Etiqueta:='Hola';
PackageModule:=LoadPackage('Package1.bpl');
if PackageModule<>0 then
begin
AClass:=GetClass('TForm2');
if AClass<>nil then
begin
with TcomponentClass(Aclass).Create(Application) as TForm do
begin
ShowModal;
Free;
end;
UnLoadPackage(PackageModule);
end;
end;
end;


mi idea es cojer el valor de la variable etiqueta desde el TForm2

el programa con el que estoy haciendo las pruebas es este:

http://www.asinval.com/paquetes.zip

walito
17-10-2007, 14:16:50
No intentaste pasandole la variable por referencia cuando creas el Form ?
Capas que hablo giladas, nunca hice nada con bpl :D

Saludos

Neftali [Germán.Estévez]
17-10-2007, 14:30:12
Puedes acceder a propiedades/metodos published de los formularios utilizando RTTI.
Por ejemplo desde el form principal (ya que desde el package has registrado la clase TForm2), puedes acceder y modificar propiedades.

He modificado tu eemplo para que desde el form1 ejecutes con un parámetro una función/método del form2; Así puedes hacerle llegar datos.

Hay cosas más complejas para pasar más información, pero ya depende de lo que necesites (form1 y form2 derivar de un form Base, por ejemplo).
Revisa las modificaciones que he añadido al ejemplo y si tienes dudas ya dirás...

xerkan
17-10-2007, 15:54:39
He visto algo tu ejemplo y empiezo a comprender un poco mas de los modulos (veo que no va a ser ta simple como creia) me podrias decir tambien como acceder desde el modulo (form2) a un datamodule que esta en la aplicacion principal para que pueda usar sus tablas, conexiones, etc..

Neftali [Germán.Estévez]
17-10-2007, 16:28:40
Bueno, el sistema es el mismo que ves en el ejemplo.


TAsignarProp = procedure(AEt:String) of object;


Ahí se pasa por parámetro en el procedimiento un String, pero nada te impide que pases cualquier otra cosa; ADOConnection, DataModule,...

Define el tipo para esa llamada y ya está.

xerkan
17-10-2007, 18:22:18
Ya e visto que con eso se le puede pasar un valor al otro formulario, mi duda es que si le paso un DataModule me seria posible asignar una tabla de este datamodule a un grid del formulario encapsulado para realizar operaciones en el grid, ya que los DBComponentes se esperan un TDatasource y al no existir en diseño no le puedo dar un valor

Neftali [Germán.Estévez]
18-10-2007, 10:34:52
Ya e visto que con eso se le puede pasar un valor al otro formulario, mi duda es que si le paso un DataModule

Es una definición de un procedure como cualquier otro de delphi; No sólo puedes pasar valores, pùedes pasar también objetos (o apuntadores a ellos); Formularios, Datamódules, componentes,...

xerkan
18-10-2007, 11:42:45
He visto que algunos de mis problemas tambien se pueden solucionar con paquetes estaticos (vere un poquillo tambien el tema), ahora tengo un problema algo menor, te queria preguntar si ahi alguna manera para que los requerimientos del paquete se linkaran a el (vcl.bpl, rtl.bpl, ...) ya que me gustaria añadir solo el que cree yo y no aparte un monton de bpl que use el paquete aparte

Neftali [Germán.Estévez]
18-10-2007, 12:06:00
Puedes utilizar un EXE sin packages en runtime y cargar dinámicamente packages, pero en ese caso no podrás utilizar RTTI. Deberás hacerlas funcionar como si fueran DLL's, pero ese añadido de información en Runtime lo pierdes.

Si quieres utilizar RTTI, debes utilizar packages en runtime.

xerkan
18-10-2007, 12:11:25
Lo que quiero es tener el ejeuctable mas un paquete hecho por mi, si le quito la opcion build with runtime packages no carga el paquete que e creado, lo malo es que solo quiero que esten esos 2 ficheros y no esos 2 mas los bpl que tienen en la clausura require el Package

Neftali [Germán.Estévez]
18-10-2007, 12:31:52
Si pruebas en ejemplo que he enviado sin runtime packages, y lo ejecutas paso a paso, verás que sí llega a cargar el package (1), pero cuando intenta acceder a la clase es cuando falla (2), porque es justo ahí donde se requiere RTTI.
Es lo que estaba intentando decirte. Puedes cargar los packages, pero sólo podrás utilizarlos como las DLL's estandard. Define funciones externas y úsalas desde el programa; Pero si intentas utilizar RTTI no podrás.

(1) Esto lo hace sin problemas.

PackageModule:=LoadPackage('Package1.bpl');
if PackageModule<>0 then ...


(2) Esto es o que no hace bien

AClass:=GetClass('TForm2');
if AClass<>nil then ...

xerkan
19-10-2007, 09:34:50
Bueno ahora estoy intentando hacer un modulo dinamico, con un datamodule y un formulario que acceda al datamodule los dos estan en el modulo a el cual llamo desde una aplicacion externa el problema es que cada vez que intento cojer algun valor del datamodule del modulo desde el formulario del modulo este me da un Acces violation

Neftali [Germán.Estévez]
19-10-2007, 10:24:32
¿Puedes postear el ejemplo?
Si el código es casi imposible qué puedes ser lo que está mal...

xerkan
19-10-2007, 10:33:05
¿Puedes postear el ejemplo?
Si el código es casi imposible qué puedes ser lo que está mal...

Claro aqui tienes el programa de prueba que estoy realizando para comprender mejor el sistema de paquetes, el programa para acceder a las tablas estoy usando las IBOobjects

http://www.asinval.com/DMPaquetes.zip

xerkan
22-10-2007, 16:05:58
Bueno mas o menos e dejado el programa que estoy haciendo en plan prueba a mi gusto usando paquetes dinamicos ahora solo tengo una pequeña duda que parece que no afecta a la ejecucion del programa pero me es un poco molesta al editarlo, el caso es que el modulo dinamico tiene un formulario y un datamodule con las tablas que usa el formulario del paquete y si edito alguna cosa de este formulario al intentar compilar me sale un mensaje de error con el mensaje "Module 'frmProvincias' links to module 'dtmDatos' which cannot be found in the current project. Do you wish to remove/redirect the links to another module"

En cambio si abro el datamodule que esta en el paquete este error no se produce y el paquete compila perfectamente, este error solamente me lo da al modificar el paquete el cual contiene en la clausura contains tanto el formulario como el datamodule, este ultimo lo creo en su clausura de inicializacion con el siguiente codigo:


RegisterClass(TdtmDatos);
dtmDatos:=TdtmDatos.Create(nil);


Otra cosa que me gustaria saber es si al crear el datamodule al iniciarse podria pasarle algun tipo de parametros para conectarse a la base de datos ya que por ahora se los estoy pasando desde el formulario del paquete que creo desde la aplicacion principal