Cordial saludo,
He revisado muchos temas respecto al manejo de forms dentro de una dll y hasta ahora no he podido resolver mi problema, que a continuación expongo:
Tengo un ejecutable normal el cual invoca a una dll que a su vez lanza una form. Si dicha form la muestro con "ShowModal" todo funciona bien, pero si la dejo solo como "Show", el ejecutable deja de responder.
Este es el código que uso en el ejecutable:
Código:
procedure TForm1.Button1Click(Sender: TObject);
type
TDLLFunc = procedure(pStUsuario: String; pStPassword: String; pStDB: String; pStEsquema: String; pStTabla: String);
const
DLLFunc: TDLLFunc = nil;
var
DLLHandle: THandle;
begin
DLLHandle := LoadLibrary('forma.dll');
if (DLLHandle < HINSTANCE_ERROR) then
raise Exception.Create('Librería no encontrada.' + SysErrorMessage(GetLastError));
try
@DLLFunc := GetProcAddress(DLLHandle, 'pFormaMaestro');
if Assigned(DLLFunc) then
DLLFunc(txtUsuario.Text, txtContra.Text, txtBD.Text, txtEsquema.Text, txtTabla.Text);
finally
FreeLibrary(DLLHandle);
end;
end;
Y el código de la dll es:
Código:
library forma;
uses
ShareMem,
SysUtils,
Dialogs,
Windows,
Classes,
DConexion in 'DConexion.pas' {dtmConexion: TDataModule} ,
FPrincipal in 'FPrincipal.pas' {frmPrincipal} ,
FAcerca in 'FAcerca.pas' {frmAcerca} ,
FBusqueda in 'FBusqueda.pas' {frmBusqueda} ,
FSplash in 'FSplash.pas' {frmSplash} ,
FRegistro in 'FRegistro.pas' {frmRegistro};
procedure pFormaMaestro(pStUsuario: String; pStPassword: String; pStDB: String; pStEsquema: String; pStTabla: String);
begin
//Pantalla Inicial
frmSplash := TfrmSplash.Create(nil);
frmSplash.Show;
frmSplash.Update;
//Crear el DataModulo
dtmConexion := TdtmConexion.Create(nil);
dtmConexion.gStTabla := pStTabla;
dtmConexion.gStUsuario := pStUsuario;
dtmConexion.gStPassword := pStPassword;
dtmConexion.gStDB := pStDB;
dtmConexion.gStEsquema := pStEsquema;
dtmConexion.pInicioDatos;
frmSplash.Hide;
frmSplash.Free;
//Crear la Forma
if (dtmConexion.gBlSelect) then
begin
try
frmPrincipal := TfrmPrincipal.Create(nil);
frmPrincipal.ShowModal;
dtmConexion.cdsPrincipal.Close;
dtmConexion.qryPrincipal.Close;
frmPrincipal.Hide;
frmPrincipal.Free;
except
on E: Exception do
begin
ShowMessage(E.Message);
end;
end;
end;
end;
exports pFormaMaestro;
begin
end.
Como comenté anteriormente, el código que acabé de exponer funciona bien, pero si cambio el "ShowModal" por el "Show" la aplicación falla.
Cabe anotar que estas líneas de código:
Código:
dtmConexion.cdsPrincipal.Close;
dtmConexion.qryPrincipal.Close;
frmPrincipal.Hide;
frmPrincipal.Free;
Las manejo dentro de los eventos de cierre del form cuando lo muestro con "Show".
Agradezco de antemano cualquier colaboración.