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