Fórum Buscar todos os objetos no sistema #414290
19/03/2012
0
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
Curtir tópico
+ 0Posts
20/03/2012
Fabiano Góes
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;
Gostei + 0
20/03/2012
Leandro
essa é a herança.
Gostei + 0
20/03/2012
Marco Salles
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..
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)