Ver Mensaje Individual
  #1  
Antiguo 16-12-2012
g_ferrada g_ferrada is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 13
Reputación: 0
g_ferrada Va por buen camino
Question 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:

Código Delphi [-]
procedure buscar(sCaption: string; sSelect: string; sWhere: string; 
  sOrder: string; Sender: TBotonBuscar);


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

Código Delphi [-]
  frmBuscar.buscar( 'Seleccionar Producto','select cdgprdct, descripcion, tipo, stock, unidad from productos',
     '', 'order by cdgprdct', BotonBuscarProducto);


¿Por qué el BitBtnBuscar? Bueno, por que a formBuscar agregué también un BitBtnBuscar, entonces lo primero que hago es
Código Delphi [-]
 
  BotonBuscar1:= Sender;


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

Código Delphi [-]
procedure TfrmBuscar.FormClose(Sender: TObject; var Action: TCloseAction); 
begin     
  BotonBuscar1.Items:= strSelect;     
  BotonBuscar1.OnChangeItems(strSelect);     
  BotonBuscar1:= nil;     
  strSelect.Free; 
end;

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)
Responder Con Cita