Fórum RTTI com Delphi 2010. #378789
03/06/2010
0
Gostaria de pedir uma ajuda aos amigos do fórum.. tenho a seguinte situação.
Com a nova RTTI do delphi 2010 e possível tirar muito proveito do código, mas me deparei com um caso , vou exemplificar.
Suponha que eu tenha em um form qualquer.
Form1 (TForm) dentro dele Panel1 (TPanel1) dentro dele Label1(TLabel).
Blz. agora com a nota sintaxe da RTTI do delphi 2010 preciso percorrer os objetos até chegar na label1 e recuperar o conteúdo do caption dela.
usando a sintaxe parecida com a abaixo.
for Tabela in Tipo.GetAttributes do for Propriedade in Tipo.GetProperties do for Coluna in Propriedade.GetAttributes do
Espero ter me expressado bem ..
Agradeço ..
Ederson Caldatto
Curtir tópico
+ 0Posts
03/06/2010
Marco Salles
Gostei + 0
03/06/2010
Ederson Caldatto
O que estou tentando fazer é o Mapeamento de Objeto relacional para fazera persistencia de objeto no banco, citei o ex, para melhor entendimento, mas o caso que tenho é o seguinte.
Tenho uma Classe e dentro desta tem outras ex Duplicata.
TEmpresa = Class ID: Integer; end; TCLiente = class Empresa: TEmpresa IDCliente : Integer end; TFornecedor = class Empresa: TEmpresa IDFornecedor: Integer end; TDuplicata = class Empresa: TEmpresa IDDup: Integer; Cliente : TCLiente Fornecedor: TFornecedor end; Dup: TDuplicata; Dup.Empresa.ID := 1;Dup.IdDup := 1;Dup.Cliente.IdCliente := 1;
O que estou querendo fazer e em uma classe de persistencia passar um obj, no caso TDuplicata, entao usando RTTI, Context, RTTIProperty, e Atributos, pegar os dados das classes que a duplicata tem referencia ex Percorre meu Objeto Duplicata, quando o atributo for uma outra classe um objeto tbm, faço um Type cast e percorro esta classe até encontrar seu ID.
Gostei + 0
03/06/2010
Marco Salles
Gostei + 0
03/06/2010
Ederson Caldatto
o assunto é muito bom , mas é complicado um pouco =D..
Eu estou usando classe que herdam de TCustomAtributte, assim identifico o nome de minhas class, as chaves da classe e os Fields tbm .. assim na persistência, valido conforme a necessidade.
Até consigo pegar o valor do Objeto so que o retorno do ToString vem (TCliente @ 312345) onde deveria vir o código do mesmo.
Gostei + 0
03/06/2010
Marco Salles
unit uPessoa;
interface
uses
classes;
Type
IPessoa = Interface
function GetFId: Integer;
procedure SetFId(const Value: Integer);
property ID:Integer read GetFId write SetFId;
End;
Type
TCliente = Class(TInterfacedObject,IPessoa)
private
FId:Integer;
function GetFId: Integer;
procedure SetFId(const Value: Integer);
published
property ID:Integer read GetFId write SetFId;
End;
implementation
{ TPessoa }
function TCliente.GetFId: Integer;
begin
result:=FId;
end;
procedure TCliente.SetFId(const Value: Integer);
begin
FId:=value;
end;
end.
procedure TForm2.Button1Click(Sender: TObject);
var
obj: IPessoa;
MyCliente:TCliente;
infoProps: TPropInfo; //informaçõles sobre a propriedade
plistaProps: PPropList; //ponteiro para array de ponteiros sobre informações da propriedade
listaProps: TPropList; //array de ponteiros para informações da propriedade
i: integer;
totalProps: integer; //valor total de propriedades do objeto
S,Propriedade,Tipo,Valor:string;
begin
//sempre inicialize o ponteiro como nil
plistaProps := nil;
//setando algumas propriedades do nosso objeto
obj := TCliente.Create;
obj.ID:= 1;
MyCliente:=(Obj as TCliente);
try
mTexto.Lines.Add('Propriedade:'+#9#9#9+'Tipo:'+#9#9#9 +'Valor');
//a função GetPropList seta o ponteiro para lista de propriedades e
//também retorna o total de propriedades
totalProps := GetPropList(MyCliente, plistaProps);
//atribundo a listaProps o valor armazenado no endereço plistaProps
listaProps := plistaProps^;
for I := 0 to totalProps - 1 do
begin
//atribuindo a infoProps o valor contido no endereço da posição i do vetor listaProps
infoProps := listaProps[i]^;
if canvas.TextWidth(infoProps.Name) < 46 then
mTexto.Lines.Add(
infoProps.Name+#9#9#9#9+infoProps.PropType^.Name+#9#9#9+
varToStr(getPropValue(MyCliente, infoProps.Name)))
else
mTexto.Lines.Add(
infoProps.Name+#9#9#9+infoProps.PropType^.Name+#9#9#9+
varToStr(getPropValue(MyCliente, infoProps.Name)));
end;
finally
// obj.Free; Trabalhando com Interface temos o contador de Referencia...
//não podemos esquecer de liberar a memoria do ponteiro
FreeMem(plistaProps);
end;
end;
Gostei + 0
03/06/2010
Ederson Caldatto
vou analisar o código com calma e lhe respondo em seqüência ok..
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)