Sobre Objetos Irmãos com valores diferentes

Delphi

20/05/2005

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

Bruno Belchior

Curtidas 0

Respostas

Massuda

Massuda

20/05/2005

Usando seu exemplo com TTable e TDataSource... você pode implementar TDataSource.DataSet como sendo um objeto interno do TDataSource...
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;
...ou como uma referência a um objeto externo...
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

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

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

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

Bruno Belchior

20/05/2005

exatamente...


GOSTEI 0
Massuda

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; 
  ...
...nesse caso, @DataSource.DataSet é o endereço de memória (dentro do objeto DataSource) onde o valor da propriedade DataSet é armazenada.

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

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?


GOSTEI 0
POSTAR