Nunca había caido en la cuenta de algo que, al menos a mi, me parece extraño. Quizá alguien puede explicar lo que realmente sucede.
Vamos a suponer que tenemos un formulario
MainForm y un data module
DMData.
En el data module colocamos una componente Table y en el formulario un DataSource.
Incluimos la unidad del data module en la cláusula
uses del formulario con lo cual podemos asignar el Table de DMData a la propiedad DataSet del DataSource del formulario.
Nada fuera de lo común. Supongo que muchos habremos hecho esto cientos de veces:
conectar un datasource de un formulario a un dataset de un data module.
Pues bien; mi pregunta es, ¿a dónde realmente apunta MainForm.DataSource.DataSet?
Dirán ustedes: pues a DMData.Table, ¡lo acabas tú mismo de decir!
Más aún, si vemos el archivo DFM del formulario es justo lo que vemos:
Código Delphi
[-]
object DataSource: TDataSource
DataSet = DMData.Table
Left = 464
Top = 8
end
Pero mi duda comienza aquí:
Cuando agregamos un data module a nuestro proyecto durante el diseño y le insertamos componentes, declaramos propiedades e implementamos métodos, se supone que estamos
definiendo una clase, no construyendo un objeto. Y puede haber más de un objeto de esta clase.
Así pues, reformulo la pregunta:
¿
A qué instancia de la clase TDMData pertenece la componente Table a la que apunta MainForm.DataSource.DataSet?
Una primera respuesta sería decir que a la variable DMData que Delphi crea por defecto.
Bueno, pues ahora borren esa variable y quítenla del
auto-create:
Código Delphi
[-]
type
TDMData = class(TDataModule)
Table: TTable;
procedure DataModuleCreate(Sender: TObject);
end;
Si creamos una instancia de TDMData durante la ejecución:
Código Delphi
[-]
with TDMData.Create(Self) do
begin
Table.Open;
end;
todo funciona igual. Los controles conectados a MainForm.DataSource muestran correctamente los datos de la tabla en DMData.Table.
Pero, ¿si creamos
varias instancias de TDMData? ¿A cuál apunta MainForm.DataSource.DataSet?
Aparentemente a la primera que se haya creado.
¿Cómo hace la VCL para determinar a dónde debe apuntar MainForm.DataSource.DataSet?
// Saludos