Ver Mensaje Individual
  #1  
Antiguo 22-01-2013
cd.rafael cd.rafael is offline
Miembro
 
Registrado: abr 2012
Posts: 59
Reputación: 13
cd.rafael Va por buen camino
error en dll con una form

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.
Responder Con Cita