Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-12-2012
g_ferrada g_ferrada is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 13
Poder: 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
  #2  
Antiguo 18-12-2012
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 19-12-2012
g_ferrada g_ferrada is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 13
Poder: 0
g_ferrada Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 19-12-2012
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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:
Código Delphi [-]
TfrmBuscar = CLASS (TForm)

  ... { aquí los componentes del formulario }

PRIVATE
{ Enlace al botón }
  BotonFormularioOrigen: TBotonBuscar;

  ... { etcétera }
END;

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:

Código Delphi [-]
  TMiClase = CLASS (TObject)
  PRIVATE
    fPropiedad1: INTEGER;
    fPropiedad2: TStringList;
  PUBLIC
  { Este es el método de clonado. }
    PROCEDURE Clone (Origen: TMiClase);
  END;



  PROCEDURE TMiClase.Clone (Origen: TMiClase);
  BEGIN
  { Copia las propiedades. }
    SELF.Propiedad1 := Origen.Propiedad1;
    SELF.Propiedad2 := Origen.Propiedad2;
  END;
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #5  
Antiguo 19-12-2012
g_ferrada g_ferrada is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 13
Poder: 0
g_ferrada Va por buen camino
Smile

Ñ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.
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
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


La franja horaria es GMT +2. Ahora son las 15:17:55.


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