FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
referenciar y liberar componentes
Estimados amigos del foro,
primero intertaré explicarles brevemente lo que estoy tratando de hacer, (porque debe existir otra forma más sencilla de lograrlo): Muchas veces necesito seleccionar un dato desde una lista en la cual el usuario requiera una ventana de búsqueda, donde no sólo aparezca el valor, sino varios datos más. Por ejemplo, buscar un cliente, pero mostrar en la ventana el rut(di), la dirección, etc. Posteriormente, decidí que me gustaría que no sólo me devolviera un dato, sino varios de los que tenga disponibles en la BD. Entonces me cree un formulario con un dbgrid y un componente SQL. Le agrego una función en la cual le paso como parámetros las sentencias SQL, luego muestro el form y así el usuario puede seleccionar el registro. Incluso agregue un Edit con el cual filtro dinámicamente los datos modificando y reejecutando la sentencia SQL. Inicialmente guardaba los datos seleccionados en un stringlist en el mismo formBuscar, desde donde los referenciaba cuando los necesitara. Después me asaltó el problema de que podía hacer más de una búsqueda antes de procesar los valores, pero al llamar al fromBuscar por segunda vez, perdía los valores del stringlist anteriores. Fácilmente puedo pasar esos valores a variables de memoria, o directamente a un Edit.Text, pero buscaba algo más versátil. Entonces decidí crearme un componente: tomé un BitButton, le agregué una propiedad Items (TString) y un evento onChangeItems. Desde este botón llamo a la ventana buscar:
la cual ejecuta el query y abre el form Buscar. A su vez, le paso el componente desde el cual la estoy llamando (mi nuevo BitBtnBuscar), ej
¿Por qué el BitBtnBuscar? Bueno, por que a formBuscar agregué también un BitBtnBuscar, entonces lo primero que hago es
De esta forma, logro "asociar" ambos componentes, para que cuando posteriormente modifique la propiedad Items se gatille el procedimiento onChangeItems del primer boton antes de cerrar formBuscar
Mi idea principal es que cada BitBtnBuscar del form desde donde estoy llamando a Buscar() guarde en su propio valor Items los valores correspondientes (además de ejecutar onChangeItems) cada vez, lo que funciona bien hasta el "BotonBuscar1:= nil". Mi problema es que si no coloco BotonBuscar1:= nil en TfrmBuscar.FormClose, todos los botones usados anteriormente cambiarán su valor a medida que los vaya utilizando, pero después de asignar el nil ya no puedo referenciar más la propiedad items del BitBtnBuscar desde el cual llamé al procedimiento. La cuestión es cómo poder "referenciar" estos dos botones (el del form principal con el del formBuscar), asociarlos entre sí para que los cambios del formBuscar se hagan tambien en el otro, y poder romper esa referencia pero permitiendo que el de form principal siga "existiendo" con los valores que tenía. Mi sapiencia es sólo de supervivencia aquí, pero me alcanza para darme cuenta que es una forma bastante chapucera, y sospecho que más de algo estoy haciendo de forma incorrecta, pero, sinceramente me ha servido hasta ahora. Agradezco la ayuda de ustedes, y aprovecho de aprender otro poquito. Gracias de antemano. Última edición por ecfisa fecha: 16-12-2012 a las 21:37:19. Razón: Corregir error etiquetas (WYSIWYG) |
#2
|
||||
|
||||
Pues sí, seguro que hay formas mejores de hacerlo.
El problema es que has ido añadiendo parche sobre parche (vamos, que lo has hecho "a la española" ) y al final te ha quedado como te ha quedado. Lo que te recomiendo es que hagas un poco de ingeniería (¡Por Bob! ¿He dicho eso yo? ). A lo que me refiero es que deberías replantearlo desde cero, tomar requisitos, hacer una planificación, varios esquemas en papel, implementarlo y aplicarlo. Sé que va a ser mucho trabajo, pero a la larga saldrás ganando. Así, sin pensarlo mucho, yo haría un módulo o clase "TBusqueda" que se encargase de hacer el trabajo de buscar y guardar los resultados, y después relacionaría el objeto búsqueda con el botón correspondiente. |
#3
|
|||
|
|||
Sí bueno... aquí decimos "a la chilena" (al final hay descendencia ¿no?). Ya sé que hay que rediseñar, y eso lo logramos sólo en la manera que vamos aprendiendo... si te dijera todo el esfuerzo para lograr modificar mi TButton, creo que te reirías. Nunca pido que me hagan el trabajo, pero tal vez ésta vez fui poco claro en mi pregunta: me conformaría, por ahora, con saber cómo puedo lograr la señalada "disociación" del botón de mi formBuscar con el del form principal, pero logrando que éste último mantenga sus valores y lo pueda seguir referenciando desde mi programa (ya sé que mi código no será candidato a ningún reconocimiento).
Gracias |
#4
|
||||
|
||||
Hay una cosa que creo que "haces mal", y es asignar, en el método "buscar", el botón Sender a BotonBuscar1. Imagino que este último lo has creado con el editor de formularios, ¿no? Por eso luego debes asignarle "nil", para que no lo destruya.
No deberías hacerlo así. Lo que tienes que hacer es reservar una variable en la parte privada de la clase del formulario y asignar ahí el botón Sender:
Así el botón "Sender" lo referencias con "BotonFormularioOrigen", no teniendo que asignarle a "nil" cuando terminas. Claro que en lugar de copiar la referencia (que es lo que hace ":=") quizá te convenga clonar el objeto, es decir, hacer una copia. No recuerdo bien si los componentes tenían un método virtual llamado "Clone" o "Assign" que hacía eso. Si no, puedes añadirlo a tu componente. Lo que hace es copiar las propiedades de uno en el otro: Si aplicas esto a tu botón, tendrás una copia del botón en el formulario de búsqueda, por lo que el botón "original" seguirá manteniendo sus datos. No sé si esto ayuda o no tiene nada que ver con lo que preguntas. Es que me he perdido. |
#5
|
|||
|
|||
Ñuño, exactamente, me has comprendido totalmente. Y agradezco tu ayuda, esta misma noche me pongo a trabajar en eso.Te cuento como me va.
Saludos. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
liberar memoria componentes visuales | study | Varios | 2 | 16-11-2011 17:13:30 |
dejar de referenciar una dll | fedeloko | OOP | 3 | 07-09-2006 16:13:58 |
Liberar los componentes de un srollbox | nenufer | OOP | 3 | 29-05-2006 08:18:48 |
Liberar componentes de la memoria | ingel | Varios | 11 | 29-06-2005 18:30:09 |
Referenciar componente con un string | ingel | Varios | 14 | 21-06-2005 21:01:57 |
|