![]() |
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. |
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 ;) |
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 |
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)); |
yo lo que haria es contestarle a oesteve
|
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. |
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 18:25:51. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi