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 26-05-2007
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 22
David Va por buen camino
Smile No veo la manera de programar esto (Ver dentro)

Hola

Tengo un form donde se cargan los informes Finformes , luego tengo muchos datamodules , que llaman a su informe correspondiente para que la carge en el formulario Finformes .

Desde el datamodule se llama a una pequeña ventana , para elegir el cliente o el proveedor , luego se cierra la ventana y aparece el informe . Si se vuelve abrir la ventana , se crea una segunda instancia del datamodule , pero como busca el primero no cambia el cliente .

Así pues tengo que poner en el datamodule , un FreeAndNil(datamodule) , para destruirlo . Pero que pasa que se destruye cuando esta aún activo el informe y a veces este requiere del datamodule .

Lo que busco es la manera de que no se cierre el datamodule hasta que no cierre FInformes , pero no puedo poner un código en el informe pues hay muchos datamodules .

A ver si lo entendeis y podeis echarme una mano .

Un saludo
Responder Con Cita
  #2  
Antiguo 26-05-2007
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 22
David Va por buen camino
Como estoy un poco perdido , he realizado un pequeño ejemplo , con la base de datos DBDemos , con un DataModule , un formulario de busqueda que muestra los customers , un formulario donde muestra el detalle de cada formulario al que se accede a través del de búsqueda (este formulario haria las veces del informe) , todo ello dentro de un formulario principal .

El caso es que aquí el ejemplo es simple , y parece que no tiene sentido hacerlo así , pero en una aplicación grande esta de esta forma con muchos datamodules heredados , por lo que hay que poner un código en el formulario para que se destruya cuando se cierra la ventana de Orders .

Mirarlo si podeis , adjunto el código ,esta realizado en Delphi 7

Saludos
Archivos Adjuntos
Tipo de Archivo: zip busqueda.zip (4,9 KB, 23 visitas)
Responder Con Cita
  #3  
Antiguo 28-05-2007
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
He estado viendo un poco el código.
Utilizas un DBlookuplist para seleccionar un dato. Este objeto es para seleccionar un dato que sea foreing key ( clave foranea, clave para utilizar en otra tabla ), no para seleccionarlo y utilizar ese dato posteriormente.
Haz una cosa, pon en la ventana que utilizas para seleccionar un botón, que muestre Customer_id. Verás como a pesar de seleccionar cualquiera, siempre tiene el mismo valor.

En lugar de un dblookuplist, utiliza un simple DGrid. Sin tocar nada más obtendrás el resultado que deseas. Lo único que te puede ocurrir es que si reutilizas la ventana para distintas tablas, tendrás que indicar cual es el campo que quieres visualizar en el DBGrid.

Espero haberte ayudado.

Un saludo y suerte.
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #4  
Antiguo 28-05-2007
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
En realidad sí puede usarse un DBLookupListBox, pero David intenta recoger el valor seleccionado del DataSet:

Código Delphi [-]
orders.Params[0].AsInteger := CustomerCustNo.AsInteger;

cuando debiera ser directamente del DBLookupListBox

Código Delphi [-]
orders.Params[0].AsInteger := DBLookupListBox1.KeyValue;

Sin embargo, eso no resuelve el problema, o, mejor dicho, resuelve la parte que mencionas, pero queda la otra:

Cita:
Empezado por David
Si se vuelve abrir la ventana , se crea una segunda instancia del datamodule , pero como busca el primero no cambia el cliente
Es decir, lo que sucede es que al abrir la segunda ventana, se tienen dos copias del datamodule y dos copias de la ventana de informes (orders en el ejemplo). Los controles de la ventana de informes apuntan a los componentes en el datamodule, pues así se establece en el diseño, pero ¡hay dos ventanas y dos datamodule! ¿Cuál apunta a cuál?

Alguna vez yo mismo me pregunté esto.

Yo veo dos opciones:
  • En lugar de hacer la asignación DataSource->DataSet en diseño, la hace por código para así enlazar la ventana con el datamodule que corresponda en lugar del primero que la VCL encuentre.
  • Obliga a la destrucción del datamodule junto con la ventana, tal como proponía él mismo.

El problema es que a ambas posibilidades les veo problemas. La primera funcionaría pero aún así queda el detalle de en qué momento se destruye el datamodule. En la segunda opción no sirve que la ventana destruya al datamodule al momento de cerrarse (OnClose) porque se produce una violación de acceso.

Supongo que cualquiera de las dos problemáticas puede solventarse, pero es que a mi me gustaría tener un poco más de detalle de qué es lo que quiere lograr David. El ejemplo que pone quizá sobre simplifica la situación, pues no me queda claro porqué quiere construir una instancia del datamodule por cada informe.

// Saludos
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como programar esto dentro de FastReport David Impresión 1 03-09-2006 18:25:08
Imprimir de manera no tradicional ilichhernandez Impresión 8 09-11-2005 19:52:25
De que manera se haría sierraja Impresión 8 04-08-2005 02:09:52
Como programo esto (ver dentro) David OOP 1 28-04-2005 22:32:24
Ayuda con un error.No hay manera Descendents Varios 9 16-10-2003 11:10:41


La franja horaria es GMT +2. Ahora son las 11:07:05.


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