Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Una clase como propiedad de un componente? (https://www.clubdelphi.com/foros/showthread.php?t=6308)

setry2 30-12-2003 16:29:22

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.

Al González 30-12-2003 18:28:46

¡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 :).

__cadetill 30-12-2003 21:23:20

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?

marto 30-12-2003 21:30:58

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.


La franja horaria es GMT +2. Ahora son las 20:33:11.

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