Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   DLL' s con formularios (https://www.clubdelphi.com/foros/showthread.php?t=24721)

Esau 31-08-2005 17:15:35

DLL' s con formularios
 
Hola Amigos... Les contare que trabajo en un empresa en donde se desarrolla con distintos productos , VB, Java, Delphi, etc... nuestra area tiene una serie de funciones y procedimiento que han sido desarrollado en delphi, decidimos entonces exportar todas nuestras funciones hacia una DLL, al inicio problemas con los tipos String, pero todo se soluciono rapido, magnifico¡¡, ahora los otros desarrolladores de otros lenguajes pueden usar nuestras funciones.
hasta alli bien , pero tambien, tenemos modulos hechos en delphi que se conectan con bases de datos, realizan operaciones con data , etc, etc, etc,
los mismos programadores en VB y Visual Fox nos pidieron los mismos modulos pero en DLL. Entonces se nos ocurrio exportarlos, pero cuando hacemos la Aplicacion de prueba que llama a la DLL funciona bien , pero al salir nos genera un error que dice "Operacion de Punteros no valida"

El Codigo en la DLL seria Asi
Código Delphi [-]
Procedure MostrarForm; StdCall; Export;
Begin
Form_Hola := TForm_Hola.Create(Application);
Form_Hola.Show;
End
y en el evento Close del formulario se destruye

Cuando lo llamo desde otra Aplicacion se muestra el formulario, realizo todas las operaciones que deseo, luego se destruye el formulario, no hay ninguna queja...pero el problema sucede al salir de la aplicacion que llamo a la DLL,
y todo empieza de nuevo...
algo estamos haciendo mal , pero no lo vemos, se aceptan sugerencias...
Gracias

Crandel 01-09-2005 00:36:15

Cita:

Empezado por Esau
en el evento Close del formulario se destruye

nunca use formularios en dll's pero esto suena muy raro.

no creo que sea correcto destruir el formulario cuando todavia esta en uso.

roman 01-09-2005 01:40:34

¿Cómo destruyes el formulario?

No sé cómo sea con una dll pero recuerda que lo indicado es poner Action := caFree y no Form1.Free.

// Saludos

Esau 01-09-2005 19:34:00

probe con
Código Delphi [-]
   Action := caFree;
y sigue con el mismo problema...

quizas no debo poner formularios en una DLL, pero que tan cierto es esto...

lpmlpm 01-09-2005 19:49:33

Igual me equivoco, pero yo lo pensaría de este modo:

Estas asignando como responsable de la nueva forma a un objeto Application, pero tratandose de que estas cargando el formulario desde una DLL no se ve bien claro a cual Application es a quien le va a colgar el chamaco este procedimiento... porque no puebas (ya que tu mismo te estas encargando de liberar los recursos de la forma) de crear la forma nueva, digamoslo asi, "huerfana" o dicho de otra manera "autosuficiente" :D

Código Delphi [-]
 Procedure MostrarForm; StdCall; Export;
 Begin
   Form_Hola := TForm_Hola.Create(nil);
   Form_Hola.Show;
 End

Sustituyendo Application por nil no estas haciendo responsable a nadie por tu formulario, asi que al cerrar tu aplicación no tendría porque respingar...supongo

Saludos

Esau 02-09-2005 00:23:14

No tuve suerte con lo que me recomendaste... Pero seguire insistiendo con esa logica, creo que esta por ahi, el truco...
Gracias por contestar...

roman 02-09-2005 00:50:21

Hola,

Hay algo que no entiendo. Yo realmente no manejo dlls pero recién me hice uno con una función similar y no me muestra ningún error.

¿Cómo realmente exportas la función? Según la ayuda de Delphi, export (sin s final) sólo se usaba en Windows de 16 bits. Yo he exportado la función con:

exports MuestraForm;


¿Y cómo la importas a tu aplicación?

// Saludos

Esau 02-09-2005 18:01:23

Hola Roman...
Les Contare que partí de Cero, he creado una DLL que crea y muestra un formulario.
Código Delphi [-]
library LaDLL;

uses
  SysUtils,
  Classes,
  FormDLL in 'FormDLL.pas' {Form_FormDLL};

{$R *.res}
Procedure MostrarForm; Stdcall; export;
Begin
  Form_FormDLL := TForm_FormDLL.Create(nil);
  Form_FormDLL.ShowModal;
  Form_FormDll.Hide;
  Form_FormDLL.Free;
End;

Exports
  MostrarForm Name 'MostrarForm';

begin
end.
compilé, y todo bien (Se creo la DLL)
luego he creado una Aplicación, en ella he creado una unidad donde declaro la DLL
Código Delphi [-]
unit Declaraciones;

interface

Procedure MostrarForm; External 'LaDLL.DLL' Name 'MostrarForm';

implementation

end.

y desde el formulario principal hago una llamado a la DLL desde un boton
Código Delphi [-]
implementation

{$R *.dfm}
Uses
  Declaraciones;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MostrarForm;
end;

end.

Parece que los dioses hoy me han dado un manito, y la aplicación no se ha quejado y no hay ningún error, pero he observado algo interesante y me gustaría que me ayuden en la explicación…
La DLL como el ejecutable que se han creado solo pesan 18 y 19 Kb respectivamente…
Me imagino que si llevo la DLL y el Exe a otra maquina me va a pedir algunos DLL…
La pregunta seria ¿Cómo hago para que el Exe solo dependa de la DLL? Y la DLL sea independiente de cualquier otra…

Esau 02-09-2005 18:28:26

Converse con un amigo y me comento que en la opcion Project/Options, en la solapa Packages, en la parte inferior hay una casilla de verificacion "Built with runtime Packages", al estar desactivada se compila, con el codigo necesario para no depender de DLL's
Gracias

heroe 13-08-2006 22:47:48

Ayuda con Forms y Databases en Dlls
 
Hola,

Tengo el problema de poner un form con conexión a base de datos dentro de una dll. El problema que me da es que se pierde la conexión. ¿Cómo puedo solucionarlo, por favor?

email: fernandosolis5@gmail.com

Albano 10-12-2006 21:13:23

Hola a todos, tengan un buen dia.
Estoy trabajando con Delphi 2005, quiero conectarme a una base de datos de MySQL con componentes ADO desde una DLL, supongo que para lograrlo necesito una forma para poner los componentes en ella, así que estoy probando el código que nos dejó nuestro compañero Esau, pero la siguiente línea
Código Delphi [-]
FormDLL in 'FormDLL.pas' {Form_FormDLL};
Fué cambiada en mi laptop por esta
Código Delphi [-]
FormDLL in '..\..\Mis documentos\Borland Studio Projects\FormDLL.pas' {Form_FormDLL};
y aquí me marca el siguiente error:
Cita:

[Fatal Error] Componentes.dpr(6): F1026 File not found: 'FormDLL.dcuil'
Soy un novato en esto y no entiendo nada, ni la línea ni el error, alguien me puede ayudar?

Albano 11-12-2006 10:04:46

No importa el código que ponga en esa línea, siempre me marca el mismo error, también me pasa con cualquier otro código que no haya empezado yo, si quiero abrir un ejemplo que me pasaron me aparece el mismo error, ya sea un proyecto normal de delphi o un proyecto de DLL... Alguien sabe que es lo que esta pasando? Es algo del delphi 2005?

Albano 11-12-2006 10:41:10

Creo que el error me salia porque estaba tratando de usar código de proyectos de Win32 en proyectos de .Net...
La verdad, no entiendo mucho de esto, pero ahora estoy haciendo proyectos para Win32 y me cambió el error... Ahora es el siguiente:
Cita:

[Fatal Error] LaDLL.dpr(6): F1026 File not found: 'FormDLL.dcu'
A final de cuentas se parece, solo cambia la extensión... No entiendo nada :confused:

Albano 11-12-2006 10:52:28

Creo que estoy empezando a enteder:
La DLL utiliza una forma externa? Creo que la respuesta es "si", así que creé esta forma en otro proyecto y la puse en el mismo directorio en el que tengo mi proyecto de DLL y ya no aparece ese error... ahora me aparece el siguiente:
Cita:

[Error] LaDLL.dpr(11): E2003 Undeclared identifier: 'Form_FormDLL'
en la siguiente parte del código:
Código Delphi [-]
  Form_FormDLL := TForm_FormDLL.Create(nil);
  Form_FormDLL.ShowModal;
  Form_FormDll.Hide;
  Form_FormDLL.Free;
Ahora qué pasa?

roman 11-12-2006 18:10:11

Hola Albano, aun no leo completo tu soliloquio de hoy :p pero me llama la atención esto:

Cita:

Empezado por Albano
supongo que para lograrlo necesito una forma para poner los componentes en ella

A menos que en Delphi 2005 hayan desaparecido, puedes usar un DataModule en lugar de un formulario porque realmente no necesitas mostrar una ventana, ¿cierto? Es decir, si lo único que quieres es una "superficie" para colocar tus componentes de acceso a datos y poder ajustar sus propiedaded en el inspector de objetos, entonces basta un DataModule.

// Saludos

Albano 11-12-2006 18:23:22

Cita:

Empezado por roman
aun no leo completo tu soliloquio de hoy

Corrección: De ayer y hoy jaja... Lo que pasa es que soy novato y estoy haciendo pruebas, de repente quito un error y pongo otro... "echando a perder se aprende"...
Cita:

Empezado por roman
puedes usar un DataModule en lugar de un formulario porque realmente no necesitas mostrar una ventana, ¿cierto?

Creo que eso es lo que estoy buscando, lo que necesito es conectarme a la base de datos con una DLL, pero no se cómo agregar componentes cuando estoy haciendo una DLL para que, mediante ellos, me pueda conectar a mi base de datos.

Albano 11-12-2006 19:40:14

Haber si poniéndo imágenes y un poco de código de mi proyecto es mas sencillo expresar lo que quiero hacer:

Aqui se muestra el programa en tiempo de ejecución... En el primer DbLookUpComboBox me aparecen las bases de datos que tengo en mi sistema.
También tengo un botón que dice conectar, al darle click a ese botón me conecto a la base de datos que seleccioné en el primer DBLookUpComboBox y aparecen las tablas que ésta tiene en el segundo DBLookUpComboBox.
Por último, tengo un botón que dice mostrar datos, ese pone en un query la consulta para que me arroje todos los registros que tengo en la tabla seleccionada al DBGrid.

Aqui muestro mi formulario en el tiempo de diseño, los componentes ADO quiero que esten en una DLL, así como el código que utilizo para conectarme...

Ahora pondré el código que utilizo para hacer lo que mencioné arriba.
Código Delphi [-]
procedure TForm1.BtnConectarClick(Sender: TObject);
begin
  if bbdd.Text <> '' then     //bbdd es el DBLookUpComboBox que muestra las bases de datos del sistema
  begin
    BD := bbdd.Text;
    tablas.ListField := '';
    tablas.KeyField := '';
    conexiontablas.Connected := false;
    querytablas.Active := false;
    tablas.Enabled := false;
    conexiontablas.ConnectionString := 'Provider=MSDASQL.1;Password=pass;Extended Properties="DATABASE=' + bd + ';DRIVER={MySQL ODBC 3.51 Driver};OPTION=3;PWD=pass;PORT=0;SERVER=localhost;UID=root"';
    conexiontablas.Connected := true;
    querytablas.Active := true;
    tablas.ListField := 'Tables_in_' + BD;
    tablas.KeyField := 'Tables_in_' + BD;
    tablas.Enabled := true;
    btnmostrar.Enabled := true;
  end
  else application.MessageBox('Seleccione una base de datos a la que se desea conectar',
                              'ERROR',Mb_ok + Mb_Iconerror);
end;

procedure TForm1.BtnMostrarClick(Sender: TObject);
begin
   if tablas.Text <> '' then     //tablas es el DBLookUpComboBox que muestra las tablas que tiene la base de datos seleccionada
   begin
     Tabla := tablas.Text;
     querydatos.SQL.Clear;
     querydatos.SQL.Insert(0, 'select * from ' + Tabla);
     querydatos.Active := true;
   end
   else application.MessageBox('Seleccione una tabla para mostrar su contenido',
                               'ERROR', Mb_ok + Mb_Iconerror);
end;
Qué necesito para poner esos componentes y el códgio en la DLL?


La franja horaria es GMT +2. Ahora son las 19:17:47.

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