Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-08-2005
Esau Esau is offline
Miembro
 
Registrado: may 2003
Ubicación: Canto Rey
Posts: 140
Poder: 21
Esau Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 01-09-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
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.
__________________
[Crandel]
Responder Con Cita
  #3  
Antiguo 01-09-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿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
Responder Con Cita
  #4  
Antiguo 01-09-2005
Esau Esau is offline
Miembro
 
Registrado: may 2003
Ubicación: Canto Rey
Posts: 140
Poder: 21
Esau Va por buen camino
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...
Responder Con Cita
  #5  
Antiguo 01-09-2005
Avatar de lpmlpm
lpmlpm lpmlpm is offline
Miembro
 
Registrado: ago 2005
Posts: 136
Poder: 19
lpmlpm Va por buen camino
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"

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
__________________
"Lo mejor de no saber hacer nada es que se tiene mucho tiempo libre."
Responder Con Cita
  #6  
Antiguo 02-09-2005
Esau Esau is offline
Miembro
 
Registrado: may 2003
Ubicación: Canto Rey
Posts: 140
Poder: 21
Esau Va por buen camino
No tuve suerte con lo que me recomendaste... Pero seguire insistiendo con esa logica, creo que esta por ahi, el truco...
Gracias por contestar...
Responder Con Cita
  #7  
Antiguo 02-09-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #8  
Antiguo 02-09-2005
Esau Esau is offline
Miembro
 
Registrado: may 2003
Ubicación: Canto Rey
Posts: 140
Poder: 21
Esau Va por buen camino
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…
Responder Con Cita
  #9  
Antiguo 02-09-2005
Esau Esau is offline
Miembro
 
Registrado: may 2003
Ubicación: Canto Rey
Posts: 140
Poder: 21
Esau Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 13-08-2006
Avatar de heroe
heroe heroe is offline
Miembro
 
Registrado: may 2006
Ubicación: Cartago, Costa Rica
Posts: 45
Poder: 0
heroe Va por buen camino
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
Responder Con Cita
  #11  
Antiguo 10-12-2006
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 20
Albano Va por buen camino
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?
Responder Con Cita
  #12  
Antiguo 11-12-2006
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 20
Albano Va por buen camino
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?
Responder Con Cita
  #13  
Antiguo 11-12-2006
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 20
Albano Va por buen camino
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
Responder Con Cita
  #14  
Antiguo 11-12-2006
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 20
Albano Va por buen camino
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?
Responder Con Cita
  #15  
Antiguo 11-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola Albano, aun no leo completo tu soliloquio de hoy 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
Responder Con Cita
  #16  
Antiguo 11-12-2006
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 20
Albano Va por buen camino
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.
Responder Con Cita
  #17  
Antiguo 11-12-2006
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 20
Albano Va por buen camino
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?

Última edición por Albano fecha: 11-12-2006 a las 20:09:56.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 12:06:24.


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
Copyright 1996-2007 Club Delphi