Ver Mensaje Individual
  #12  
Antiguo 25-02-2015
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Reputación: 18
_cero_ Va por buen camino
La situación es sumamente simple y le están dando demasiadas vueltas.
Uno de mis sistemas más complejos tiene 72 formularios (sin contar principal, opciones, etc), y precisamente la que comentas es la que creo yo que es la mejor forma de gestionar las ventanas.

1, plantéate el uso de bpl’s en lugar de dll’s, la razón es que los bpl’s son exactamente iguales a las dll’s, solo que añaden el uso de RTTI y son un poco más estables al cargar y descargar de memoria (con la única desventaja de no ser estándar, es decir solo tu aplicación u otra aplicación Builder/Delphi, podrán consumirla).

2, en la dll o bpl, crea una unit (.cpp,.h), en la que contendrás las funciones que se exportaran e iniciaran los formularios, también estas pueden recibir parámetros o punteros de la BD, por ejemplo (a costa de la estandarización, cosa que no te debe preocupar si tu aplicación será la única que consuma la dll/bpl).
Cada función debe ser declarada en él .h de la siguiente manera:

Código:
extern "C" __declspec( dllexport )void __stdcall miFuncionDLL( TIBDatabase *punteroEjemplo );
Puedes buscar más información de que significa cada palabra, pero a grandes rasgos, estas declarando una función estándar que las otras aplicaciones podrán llamar, estas funciones son tal cual las funciones normales, es decir pueden devolver cualquier valor que requieras (otra vez a costa de la estandarización), o recibir cualquier cosa que requieras.

2.1, ya dentro de esta función creas el formulario y le pasas lo que necesites, en este caso “punteroEjemplo” que es el puntero del componente de la BD con el que se conectara tu componente de tabla o query.

3, ya en la aplicación principal en cualquier evento de botón va el siguiente código:

Código:
void __fastcall TForm1::Boton1Click(TObject *Sender)
{
	String rutaDLL = "mi ruta de dll";

	HINSTANCE li =
		FileExists( rutaDLL ) ? //comprobamos que la dll exista
		LoadLibrary( rutaDLL.c_str() ) //si existe cargamos la dll dinamicamente, para cargar un bpl, seria con LoadPackage
		:
		NULL; // si no existe devolvemos un NULL y no entraria en el siguiente bloque

	if ( li != NULL ) {
		typedef void ( __stdcall* fsFuncion )( TIBDatabase *punteroEjemplo ); //definimos el tipo fsFuncion el cual sera un puntero a una funcion con la misma estructura que la de la dll
		fsFuncion miPunteroFuncion = ( fsFuncion )GetProcAddress( li, "miFuncionDLL" ); //declaramos, buscamos "miFuncionDLL" y asignamos la funcion de la dll en el puntero "miPunteroFuncion" de tipo "fsFuncion"

		if ( miPunteroFuncion != NULL ) //si miPunteroFuncion apunta a una funcion real, la ejecuto, y le paso lo que nesesite, y en caso de que devuelva algo lo recibo
			miPunteroFuncion( punteroAMiBD );

		FreeLibrary( li ); //en caso de que ya hayamos terminado con el formulario y hayamos liberado TODOS los punteros que hallamos iniciado en ese formulario, se libera la dll
	}
}
Pd. Esto debería compilar sin problemas, cualquier cosa comenta.
Responder Con Cita