Obter todas as propriedades de uma classe
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
Curtidas 0
Respostas
Pjrm1470
17/10/2013
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.
GOSTEI 0
Marcos Oliveira
17/10/2013
Valeu amigo. Deu certo sim.
Muito obrigado.
Att,
Marcos
Tópico Resolvido.
Muito obrigado.
Att,
Marcos
Tópico Resolvido.
GOSTEI 0