Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Bases de datos en componentes vcl (https://www.clubdelphi.com/foros/showthread.php?t=9443)

Roger 23-04-2004 10:02:59

Bases de datos en componentes vcl
 
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:
Código:

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

Cita:

Empezado por Roger
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... :(

Cita:

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.

;)


La franja horaria es GMT +2. Ahora son las 19:48:24.

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