Fórum Buscar todos os objetos no sistema #414290

19/03/2012

0

Estou desenvolvendo uma aplicação OO no delphi xe2... sendo que nessa aplicação tem um framework, com classes genericas
TAbstractBO, TGenericDAO, TManager, TSequence, TUnique e assim por diante, o TManager quando instanciado épassado um Objeto
onde se cria a estrutura na base de dados, minha duvida é o seguinte como faço para obter todos os objetos da aplicação para poder criar ou alterar sua estrutura da base ?

se eu trabalhasse com clientdataset seria facil pois elas poderiam estar no DataModulo, mais com os objetos fica diferente nao queria ter que ter uma classe pra ter esses objetos nela

ex:
property Cliente : TCliente read FCliente write SetCliente;
property Estado: TEstado read FEstado write SetEstado;

no create da classe poderia instanciar todos e fazer assim

lManager.Execute(FCliente);
lManager.Execute(FEstado);

eu preciso fazer um laço de todos os obj do sistem para não me preocupa quando criar uma classe nova ter que ir la e
colocar esse objeto na minha outra classe

com clientdataset poderia ser dessa forma

  
  for i := 0 to ADataModulo.ComponentCount - 1 do
  begin
    if ADataModulo.Components[i] is TLSTable then
    begin
      try        
        FMenu.DataBase.Table := TLSTable(ADataModulo.Components[i]);
        FMenu.DataBase.BuildDataBase;
        Application.ProcessMessages;
      except
      end;
    end;
  end;


Grato Leandro.
Leandro

Leandro

Responder

Posts

20/03/2012

Fabiano Góes

ola amigo,
e se suas classes TCliente, TEstado, etc...
implementasse uma herança de TComponent,
suas classes ganhariam um controle de memória que já é implementado na classe TComponent,
e ganharia um construtor:
constructor Create(AOwner: TComponent);


assim você instanciaria seus objetos assim:
FCliente := TCliente.Create( Self );
FEstado := TEstado.Create( Self );


ai você conseguiria pegar suas objetos assim:
  for i := 0 to Self.ComponentCount - 1 do
  begin
    if (Self.Components[i] is TCliente) then
      // seu código.....
    if (Self.Components[i] is TEstado) then
      // seu código.....
  end;
Responder

Gostei + 0

20/03/2012

Leandro

TAbstractBO = class abstract(TPersistent)


essa é a herança.
Responder

Gostei + 0

20/03/2012

Marco Salles

Vc pode usar a idéia do contructor definindo o seu pr´prio constructor e passando o Proprietário deste Objeto

unit UOwnerObjects;

interface

uses
generics.collections;


Type
IOwnerObject = Interface
[{81516A62-9CE4-42FC-9460-C808C285F14A}]
function Adicionar(T:TObject):integer;
function RetornoObjects:TList<TObject>
End;

var
OwnerObject:IOwnerObject;

implementation

Type
TOwnerObject = class (TInterfacedObject ,IOwnerObject)
private
FLista:TList<TOBject>
constructor Create;
protected
destructor Destroy;override;
class function GetInstance: TOwnerObject;
public
function Adicionar(T:TObject):integer;
function RetornoObjects:TList<TObject>
End;



{ TOwnerObject }

function TOwnerObject.Adicionar(T: TObject): integer;
begin
result:=Flista.Add(T)
end;

constructor TOwnerObject.Create;
begin
Flista:=TList<TObject>.Create;
end;

destructor TOwnerObject.Destroy;
begin
Flista.Free;
inherited;
end;

class function TOwnerObject.GetInstance: TOwnerObject;
begin
if not Assigned(OwnerObject) then
OwnerObject:=TOwnerObject.Create;
result:=TOwnerObject(OwnerObject);

end;

function TOwnerObject.RetornoObjects:TList<TObject>
begin
result:=FLista;
end;

initialization
OwnerObject:=TOwnerObject.GetInstance;

end.

Isto é uma Unite que define um Contrato .. Este contrato é so para dar Um idéia ..

Para usar poderemos pensar assim:

TPessoa = Class
public
Fnome:String;
constructor create (Aonwer:IOwnerObject);reintroduce;
End;

TClasseQualquer = class
FPropertyQualquer:String;
constructor create (Aonwer: IOwnerObject);reintroduce;
end;

definindo o constructor

{ TPessoa }

constructor TPessoa.create(Aonwer: IOwnerObject);
begin
OwnerObject.Adicionar(self);
end;

{ TClasseQualquer }

constructor TClasseQualquer.create(Aonwer: IOwnerObject);
begin
Aonwer.Adicionar(self);
end;

Varrendo

procedure TForm9.Button1Click(Sender: TObject);
var
objPessoa:Tpessoa;
ObjQualquer:TClasseQualquer;
i:integer;
begin
objPessoa:=TPessoa.create(OwnerObject);
ObjQualquer:=TClasseQualquer.create(OwnerObject);
try
for i:=0 to pred(OwnerObject.RetornoObjects.Count) do
showmessage(OwnerObject.RetornoObjects.Items[i].ClassName);

finally
objPessoa.free;
ObjQualquer.Free;
end;
end;


claro ques uma idéia..
Responder

Gostei + 0

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

Aceitar