Sobre Objetos Irmãos com valores diferentes
Pessoal tenho um componente que está conectado a outro, um exemplo seria ligar um TTable em uma DataSource... em Run Time a idéia é que tanto eu acessar Table1.Active qto DataSource1.DataSet.Active me retornariam a mesmo coisa correto? porem nos meus componentes qdo ligo uns aos outros, meus valores em run time são outros, qdo acesso isso debugando fico surpreso, será que estou errado ou é assim mesmo?
Bruno Belchior
Curtidas 0
Respostas
Massuda
20/05/2005
Usando seu exemplo com TTable e TDataSource... você pode implementar TDataSource.DataSet como sendo um objeto interno do TDataSource......ou como uma referência a um objeto externo...
No primeiro caso, quando você atribui um valor a TDataSource.DataSet, você tem na realidade dois objetos independentes (que no momento da atribuição tinham valores iguais) enquanto no segundo caso você tem um único objeto que está sendo compartilhado.
Pelo que você escreveu, imagino que seus componentes sejam parecidos com o primeiro caso.
type TDataSource = class(... private FDataSet: TDataSet; procedure SetDataSet(Value: TDataSet); public constructor Create(...); property DataSet: TDataSet read FDataSet write SetDataSet; ... constructor TDataSource.Create(...); begin ... FDataSet := TDataSet.Create(...); ... end; procedure TDataSource.SetDataSet(Value: TDataSet); begin FDataSet := Assign(Value); end;
type TDataSource = class(... private FDataSet: TDataSet; public property DataSet: TDataSet read FDataSet write FDataSet; ...
No primeiro caso, quando você atribui um valor a TDataSource.DataSet, você tem na realidade dois objetos independentes (que no momento da atribuição tinham valores iguais) enquanto no segundo caso você tem um único objeto que está sendo compartilhado.
Pelo que você escreveu, imagino que seus componentes sejam parecidos com o primeiro caso.
GOSTEI 0
Massuda
20/05/2005
Um pequeno erro de digitação... o certo é...
procedure TDataSource.SetDataSet(Value: TDataSet); begin FDataSet.Assign(Value); end;
GOSTEI 0
Bruno Belchior
20/05/2005
Massuda pior que estou no segundo caso na debugação vejo o proprietávo do meu segundo objeto no caso o meu DataModule e seu nome é DataSet1 (exemplo) e o objeto que linkei a ele é exatamente DataModulo.DataSet1, mas usando o inspector vejo que a posição de memória dos dois não é a mesma...
GOSTEI 0
Massuda
20/05/2005
...mas usando o inspector vejo que a posição de memória dos dois não é a mesma...
Desculpe, mas eu não entendi... você esta dizendo que @DataSet1 <> @DataModulo.DataSet1?GOSTEI 0
Bruno Belchior
20/05/2005
exatamente...
GOSTEI 0
Massuda
20/05/2005
[quote:d0c1555d8b=´Massuda´]... você esta dizendo que @DataSet1 <> @DataModulo.DataSet1?
exatamente...[/quote:d0c1555d8b]Assumindo que sua classe seja algo assim...type TDataSource = class(... private FDataSet: TDataSet; public property DataSet: TDataSet read FDataSet write FDataSet; ...
Não sei se vai ficar claro, mas se você atribuir um DataSet externo à propriedade DataSource.DataSet, teremos...[list:d0c1555d8b][*:d0c1555d8b]@DataSet <> @DataSource.DataSet[*:d0c1555d8b]DataSet = DataSource.DataSet[/list:u:d0c1555d8b]...pois é o [b:d0c1555d8b]mesmo valor armazenado em locais diferentes[/b:d0c1555d8b].
GOSTEI 0
Bruno Belchior
20/05/2005
ficou claro sim Massuda... resolvi meu problema, era em um teste unitário do DUnit, no procedimento TearDown eu equivocadamente escrei [b:cebb69a96a]FreeAndNilProperties[/b:cebb69a96a] em vez de [b:cebb69a96a]FreeAndNil[/b:cebb69a96a]...
imagino que no caso eu liberei apenas as propriedades do DataModule... então ele criava uma nova instância do meu objeto a cada execução do teste mas a instância do DataModule era a mesma... estou certo? e no caso de sim de qualquer forma meu objeto setado no componente não deveria ter as mesmas propriedades mesmo assim?
imagino que no caso eu liberei apenas as propriedades do DataModule... então ele criava uma nova instância do meu objeto a cada execução do teste mas a instância do DataModule era a mesma... estou certo? e no caso de sim de qualquer forma meu objeto setado no componente não deveria ter as mesmas propriedades mesmo assim?
GOSTEI 0