PDA

Ver la Versión Completa : Bases de datos en componentes vcl


Roger
23-04-2004, 10:02:59
Primero que todo perdonad mis continuas preguntas.

He creado un componente con una propiedad basesdedatos (TDataBase).

Luego tengo un formulario dentro del componente con los dataset's.

Cuando hago el create del componente enlazo los data sets con la base de datos que le he puesto en la propiedad y me da un error. Hago lo siguiente:

Form1.DataSet1.DataBase:=FBaseDeDatos

He visto en internet algo de la clase TDataLink pero tampoco se usarla ni se si es lo que necesito. A ver si me echais un cable. Gracias

jachguate
23-04-2004, 10:13:36
entiendo que tu componenete es un componente no visual, que crea un formulario que contiene una base de datos, y varios datasets... (TTable, TQuery), no??

Si es asi, no tenes que asignar en el Create del componente la base de datos. Podes asignarla en tiempo de diseño del componente... y cuando crees el formulario, estas se auto-enlazarán con la base de datos.

Hasta luego.

;)

Roger
23-04-2004, 10:20:45
El formulari no contiene una base de datos solo contiene dos data set, yo le tengo que pasar la base de datos para conectarlos mediante la propiedad que he creado BaseDeDatos. Luego para enlazarlos lo hago en el create, mediante:
Form1.DataSet1.Databes:=FBaseDeDatos;

jachguate
23-04-2004, 10:25:24
Entonces no asignes la base de datos a los datasets en el Create, sino en el método virtual Loaded. El porque se lo dejo a la ayuda de delphi...

Igual, si tenes un método SetDatabase, hacé la verificación siguiente:

if not (csLoading in ComponentState) then
Form1.DataSet1.Database := FBaseDeDatos;


Hasta luego.

;)

__cadetill
23-04-2004, 10:26:14
Sigo sin entenderlo

Tu tienes un Formulario que contiene 2 dataset. Luego "pegas" tu componente y quieres que los datasets del formulario obtengan en su propiedad Database lo que tu componente tenga en su propiedad BaseDeDatos????

Roger
23-04-2004, 10:29:12
Ok cadetill. ya se que seria mas facil poner la base de datos dentro del formulario pero no puedo, porque uno de los requisitos que tengo que cumplir es que les pase la base de datos.

__cadetill
23-04-2004, 10:49:44
Ok cadetill. ya se que seria mas facil poner la base de datos dentro del formulario pero no puedo, porque uno de los requisitos que tengo que cumplir es que les pase la base de datos.
No, si te estaba preguntando si era eso lo que hacías, es que no lo veo claro :D

Roger
23-04-2004, 10:54:49
Lo preguntare de otra forma:

Como se pede conectar la propiedad FBaseDeDatos (TDataBase) con un data set????? La siguiente forma da error: Form1.DataSet.DataBase:=FBaseDeDatos;

Ayudaaaaaaaaa :confused:

jachguate
23-04-2004, 10:55:19
creo que no has visto mi respuesta anterior... :(

Ayudaaaaaaaaa

Sabias que este estiramiento de vocales nos gusta muuuuuuuuuuuyyyyyy poco por aqui???

Roger
23-04-2004, 10:59:17
jachaguete, perodon po no responderte. No me funciona. El problema no es que sea en el create. Con lo que tu me has puesto no entra en el if y no me hace nada. Por lo que parece hace falta algo para hacer la conexion. Ni idea.

jachguate
23-04-2004, 11:03:27
parece que no has leido la ayuda.

Claro que no entrará en el if durante la carga del componente en tiempo de ejecución, precisamente por eso hay que ponerlo... la propiedad se asignará por primera vez en el método Loaded. Luego, si el valor de la propiedad cambia (despues de cargados todos los componentes) si que entrará en el if en el SetDataBase, con lo que funcionará normalmente.

hasta luego, y por favor, lee la ayuda de Loaded y de csLoading (en ComponentState).

;)

Roger
23-04-2004, 11:23:11
Perdonadme


Ahun no habia creado el formulario y ya me estaba refiriendo a componentes de el. Pues estaba ya atrancada aqui desde ayer. Lo siento mucho haberos hecho perder el tiempo.

jachguate
23-04-2004, 11:29:41
No hay problema... a todos nos ha pasado alguna vez... Menos mal te leiste la ayuda.

De cualquier forma, vale aclarar, que aunque ya hubieses creado el formulario (de hecho debieras hacerlo en el constructor de tu componente, que se ejecuta antes del SetDataBase), lo que muy probablemente no se habia Creado era el TDataBase asociado (un peer, o hermanito pues...), ya que durante la carga del formulario, los componentes se crean según el orden en que vienen en el DFM. Sin embargo, ya tenias una referencia a ese componente inexistente aún (una dirección de memoria inválida).

El invento de Loaded precisamente solventa esta situación, y es llamado para todos los componentes cuando se ha terminado de crear todo lo contenido en el DFM. Es la primera vez que las referencias a otros componentes con seguridad serán válidas.

Hasta luego.

;)