Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Acceso a componente de formulario padre???? (https://www.clubdelphi.com/foros/showthread.php?t=1258)

mguixot 09-06-2003 17:53:56

Acceso a componente de formulario padre????
 
Hola gente,
me ha surgido el problema de como acceder a una IBQuery de un componente padre, es decir. Realizo una consulta en el formulario padre, y se asigno el DataSource de la consulta a un DBGrid de un formulario hijo, que creo inmediatamente despues de calcular la Query. Pero cuando ejecuto el programa, me da un error de violacion de memoria , al intentar acceder a algun valor de algun campo de la consulta realizada en el formulario padre.
Alguien sabe como ayudarme?.

Muchas gracias.

Saludos.

__cadetill 10-06-2003 13:22:24

por regla general, yo te aconsejaria que los TQuery, TTables, ..... los pongas en un DataModule y que este lo pongas en el uses del form donde lo necesites, de esta manera te evetaras problemas.

Respecto a lo que te pasa es que seguramente estas haciendo una referencia estilo

FormPadre.Query1.Field[1].Value

no?

Esto es seguramente (ya que no pones nada de codigo ni la linea en que te salta el Acces Violation) porque FormPadre no lo tengas en el uses del form desde donde lo llamas

Si no es eso, pon algo de codigo y la linea donde te salta el error e intentaremos afinar mas la respuesta ;)

mguixot 11-06-2003 12:01:23

Respecto a mi problema planteado anteriormente, aqui incluyo algunas pistas mas, para intentar solucionalo.

Codigo de creacion del formulario hijo:

with TVisualizacionFactura.Create(Self) do
try
SMDBGrid2.DataSource := DataSource1;
frDBDataSetFacturas.DataSource := DataSource1;
DBNavigator1.DataSource := DataSource1;
ShowModal;
finally
free;
end;


Codigo de acceso a los datos del formulario padre:

ShowMessage(FloatToStr( ListadoFactura.IBQueryFacturasDeuda.Value));


En el formulario padre, tenemos declarada una 'IBQueryFacturas', dnd intentamos acceder al campo 'Deuda', pero la aplicacion genera una excepcion de EAccesViolation ...


Saludos y muchas gracias

Bacterion 11-06-2003 12:54:36

Aquí:

with TVisualizacionFactura.Create(Self) do
try
SMDBGrid2.DataSource := DataSource1;
frDBDataSetFacturas.DataSource := DataSource1;
DBNavigator1.DataSource := DataSource1;

// podrías haber creado una propiedad o método
// que al pasarle un Datasource ya se encargara el solo
// de asignarlo donde se necesitara. (por comodidad, digo yo).

ShowModal;
finally
free;
end;

Creas un TVisualizacionFactura (supongo que el form que muestra
los datos de la factura)... bueno...

Y supongo que con
ShowMessage(FloatToStr( ListadoFactura.IBQueryFacturasDeuda.Value));
intentas acceder al padre por medio de la referencia LISTADOFACTURA.

Pero... ¿Tiene asignado al padre?
Generalmente, una violación de acceso, viene provocada por el uso de una referencia invalida (supongo que a nil).
¿Le has pasado al formulario hijo el formulario Padre? Vamos, ¿LISTADOFACTURA := Padre?
¿o es listadofactura es la variable que te crea el delphi cuando te crea un form y resulta que no la estás usando?

De todas formas, para lo que haces no requieres conocer el form padre. En el DataSource que pasas YA TIENES el DATASET en el cual buscas info, luego haz algo del estilo:
ShowMessage(FloatToStr( SMDBGrid2.DataSource.Dataset.FieldByName('UnoDeLosCampos').AsLoqueToque));

oesteve 11-06-2003 13:06:21

yo lo que haria es contestarle a oesteve

mguixot 11-06-2003 13:22:47

Muchas gracias, tio

la opcion de obtener los datos de DBGrid, era una de las alternativas que tenia en mente, pero lo habia intentado, mediante el SelectedRows y tal, pero no lo habia conseguido, por eso andaba un poco desesperado, al no poder acceder a unos datos, que tenia visible delante de mis narices.

en fin, muchas gracias a todos, de nuevo.

Saludos desde Alicante.

pedrohdez 11-06-2003 13:54:19

Hola mguixot,

Una ultima recomendación, procura no programar como comentas, por ejemplo, si tienes una ventana hija y le quieres pasar un DataSource, crea una propiedad y que al asignarla se ocupe de modificar sus objetos internos, pero no des valores desde "fuera".
Otro asunto es el problema haciendo referencia al objeto Padre, (aunque el fondo del asunto es el mismo) no debes hacer referencia por el nombre, sobre todo tus ventanas no son de creación automatica, esa referencia es falsa y te dara montones de problemas, para acceder al padre usa self.owner, pero siempre es mejor pasarle las referencias a los objetos que necesites a propiedades de la vent. hija y no tocar objetos de la ventana padre "a pelo".

PD parece que los hilos se han liado algo, aparece uno de oesteve que no se a cuento de que y cuando voy a responder veo que hay un ultimo mensaje de mguixot


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

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