Fórum Sobre Objetos Irmãos com valores diferentes #282494

20/05/2005

0

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

Responder

Posts

20/05/2005

Massuda

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.


Responder

Gostei + 0

20/05/2005

Massuda

Um pequeno erro de digitação... o certo é...
procedure TDataSource.SetDataSet(Value: TDataSet);
begin
  FDataSet.Assign(Value);
end;



Responder

Gostei + 0

21/05/2005

Bruno Belchior

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...


Responder

Gostei + 0

22/05/2005

Massuda

...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?


Responder

Gostei + 0

23/05/2005

Bruno Belchior

exatamente...


Responder

Gostei + 0

23/05/2005

Massuda

[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].


Responder

Gostei + 0

23/05/2005

Bruno Belchior

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?


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar