Fórum Obter todas as propriedades de uma classe #458665
17/10/2013
0
Olá pessoal!
Estou iniciando alguns testes com JSON/REST no DataSnap e me deparei com uma situação.
Criei uma classe, com exatas 105 propriedades correspondentes a todos os campos de uma tabela.
No servidor DataSnap, eu devo ler os registros da tabela e gravar nesta classe, que será retornada com resultado da função via JSON.
Aí que está o "problema". Pra facilitar minha vida, eu gostaria de fazer o loop em todos os campos da tabela e gravar sua respectiva propriedade da classe.
Desta forma eu não precisaria igualar as 105 propriedades da classe aos 105 campos da tabela manualmente. Sem falar que se houver alguma variação do meu select, essa função iria ser genérica para todas minhas consultas, nesta mesma tabela.
A ideia que tive seria mais ou menos representada pelo código abaixo:
Existe alguma forma de fazer isso?
Desde já agradeço.
Estou iniciando alguns testes com JSON/REST no DataSnap e me deparei com uma situação.
Criei uma classe, com exatas 105 propriedades correspondentes a todos os campos de uma tabela.
No servidor DataSnap, eu devo ler os registros da tabela e gravar nesta classe, que será retornada com resultado da função via JSON.
Aí que está o "problema". Pra facilitar minha vida, eu gostaria de fazer o loop em todos os campos da tabela e gravar sua respectiva propriedade da classe.
Desta forma eu não precisaria igualar as 105 propriedades da classe aos 105 campos da tabela manualmente. Sem falar que se houver alguma variação do meu select, essa função iria ser genérica para todas minhas consultas, nesta mesma tabela.
A ideia que tive seria mais ou menos representada pelo código abaixo:
var
iCampo: Integer;
begin
for iCampo := 0 to Query.FieldCount - 1 do // Leio todos os campos da tabela;
begin
if Query.Fields[iCampo].FieldName = 'Propriedade_da_Classe' then // Preciso pegar o nome da propriedade, tipo um cast...
// Classe.Propriedade... := Campo da Tabela; // Aqui o sistema iria jogar cada campo da tabela em sua respectiva propriedade da classe;
end;
end;
Existe alguma forma de fazer isso?
Desde já agradeço.
Marcos Oliveira
Curtir tópico
+ 0
Responder
Posts
17/10/2013
Pjrm1470
Não tenho certeza do funcionamento nas versões mais novas, pois isso é lá da época da CodeGear.
adicione a uses:
Nela temos a função
Há um Overload dela também, mas não tive tempo de implementar
Aqui vai um outro metodo:
Veja se da certo, pois eu lembro de ter feito isso a muito tempo e foi pra jogos. So não lembro se ainda funfa. rsrs
Abraço.
adicione a uses:
uses TypInfo;
Nela temos a função
SetPropValue(SeuObjeto, 'Nome da propriedade', 'Valor');
Há um Overload dela também, mas não tive tempo de implementar
Aqui vai um outro metodo:
var
piPropInfo: PPropInfo;
begin
piPropInfo := GetPropInfo(ClassInfo, 'Nome da sua propriedade');
if Assigned(piPropInfo) then
SetOrdProp(SeuObjeto, piPropInfo, LongInt(ValorDaPropriedade));
end;
Veja se da certo, pois eu lembro de ter feito isso a muito tempo e foi pra jogos. So não lembro se ainda funfa. rsrs
Abraço.
Responder
Gostei + 0
17/10/2013
Marcos Oliveira
Valeu amigo. Deu certo sim.
Muito obrigado.
Att,
Marcos
Tópico Resolvido.
Muito obrigado.
Att,
Marcos
Tópico Resolvido.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)