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 30-12-2003
setry2 setry2 is offline
Miembro
 
Registrado: may 2003
Ubicación: Elche
Posts: 45
Poder: 0
setry2 Va por buen camino
Una clase como propiedad de un componente?

Hola a todos,

A ver si me podéis ayudar. He creado un componente que genera un form a partir de una consulta sql que le paso. Una de las utilidades que tiene es realizar búsquedas sobre nua qry. La forma en que lo uso es: tengo un form de clientes, y al pulsar el boton de busqueda, ejecuto el componente pasándole la sql con la info de clientes sobre la que buscar; el componente me muestra los clientes en un grid y al hacer doble click sobre uno de ellos el componente se cierra y devuelve el código del cliente buscado, de forma que el form de clientes se posiciona sobre ese cliente.

Hasta aqui bien. Lo que busco ahora es que en vez de cerrar el componente cuando hago doble click sobre l cliente, quiero que al pasar de un registro al otro del grid, el form de los clientes que queda atrás vaya saltando al mismo tiempo a esos clientes, de forma que el resultado de la búsqueda siempre queda en primer lugar y puedo ir acotando la búsqueda.

¿Se puede pasar como propiedad del componente la clase del formulario (claseForm), y el nombre del mismo (nombreForm), y desde el componente buscar el form que queda abierto detras?:

Formulario := Application.FindComponent(nombreForm) as claseForm;

¿y ejecutar una búsqueda pasándole el código del cliente:?

Formulario.EjecutaBusqueda(codCliente);

Mi pregunta es si se puede pasar la clase del form. O quizá un puntero a la qry utilizada en el form de clientes sería mejor solución.

Alguien puede aconsejarme?

Muchas gracias a todos.
__________________
Setry2
Eres un bit?
www.lafesta.com
Responder Con Cita
  #2  
Antiguo 30-12-2003
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Buen día a todos!

Setry2:

Dependiendo de las tareas que realice el método EjecutaBusqueda, pudiera ser conveniente que el componente conociera cuál es su forma "cliente" (para la cual trabaja), y de esta manera que llamase el método EjecutaBusqueda.

De ser el código de este método una simple llamada al método Locate del conjunto de datos (o algo similar), podría ser suficiente que el componente conociera el conjunto de datos para el cual trabaja y no tanto la forma donde se encuentran los controles de datos asociados.

Sin embargo, pensando más orientado a objetos. Podrías crear una clase de forma plantilla para todas las formas que implementen el método EjecutaBusqueda. Este sería un método virtual. En la plantilla sólo tendría una llamada al método Locate (por ejemplo) del conjunto de datos, o bien estaría sin código (virtual abstracto). A partir de esa plantilla derivarías las formas finales como Clientes, Productos, Proveedores, etc., en las cuales la implementación redefinida (override) del método EjecutaBusqueda sería particular de cada una de esas clases de formas. Entonces cuando el componente llame al método EjecutaBusqueda, se ejecutaría la búsqueda según la forma "cliente" para la cual esté trabajando en ese momento.

Puedes definir una plantilla de forma con todos los elementos comunes y luego crear las formas descendientes con sus elementos particulares adicionales.
Código:
TPlanFormCata
  TFormClie
  TFormProv
  TFormProd
Finalmente, recuerda que hay mil formas de programar, por lo que la anterior sugerencia de un servidor es sólo una de muchas maneras de implementar el mecanismo que nos planteas.

Espero esto sea de utilidad. Seguimos en contacto.

Al González .
Responder Con Cita
  #3  
Antiguo 30-12-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Una alternativa a la solución propuesta por el amigo Al González sería la siguiente:

A tu componente le añades dos propiedades más, una será el formulario y otra será el nombre del grid sobre el cual hacer la consulta

Código:
    property FormClass : TComponentClass   read FFormClass   write FFormClass;
    property GridName : TComponentClass   read FGridName   write FGridName;
Con estas dos propiedades, luego en el AfterScroll (o BeforeScroll, según tu gusto) del dataset asociado a la pantalla de búsquedas, puedes acceder al formulario, hacer un FindComponent del Grid y acceder a su dataset para hacer el posicionamiento

Código:
var
  F: TComponent;
begin
  F := TForm(FormClass).FindComponent(GridName);
  TDBGrid(F).DataSource.DataSet.Locate(....);
end;
Espero que la idea te sirva.

PD: tengo en mi web un componente de búsquedas estilo al que estás haciendo. Sería posible hecharle una ojeada a tu código?
Responder Con Cita
  #4  
Antiguo 30-12-2003
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 21
marto Va por buen camino
Otra posible solución es crearte un evento en tu componente. Este evento se dispara en el scroll de la query interna, de manera que controlarías desde el form principal si quieres hacer algo al hacer scroll en el componente o no.
__________________
E pur si muove
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


La franja horaria es GMT +2. Ahora son las 03:01:53.


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