Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-05-2020
javicho_villa javicho_villa is offline
Miembro
 
Registrado: feb 2005
Ubicación: Lima - Perú
Posts: 99
Poder: 20
javicho_villa Va por buen camino
Smile Funcion Get usando RTTI

Buenos dias con todos, siempre es un gusto contactarlos, en esta oportunidad estoy tratando de hacer una función generica Get para que me devuelva un objeto de cualquier tipo a traves de una consulta con un Query.
por ejemplo:
1. Creo una clase TCliente
Código Delphi [-]
type
  TCliente = class(TObject)
    private
      Id_Cliente:Integer;
      RazonSocial:String;
      RazonSocialCorta:String;
...
...
    public
      Constructor Create;
      procedure Clear;
      property iId_Cliente:Integer           read Id_Cliente           write Id_Cliente;
      property iRazonSocial:String           read RazonSocial          write RazonSocial;
      property iRazonSocialCorta:String      read RazonSocialCorta     write RazonSocialCorta;
...
...
   End;

2. Creo una function con parametros del nombre de la Tabla y el numero del registro. por ejemplo la tabla se llama Cliente y el Id es el numero 1, estos datos los pongo cuando invoco la función:

Código Delphi [-]
var Obj :TObject;
begin

  Obj := TObject.Create;
  Obj := Dm.GetObject(1,'Cliente');

  showmessage('Razon Social: '+ (Obj as TCliente).iRazonSocial);

aquí les paso la funcion GetObject que es la quiero implementar
Código Delphi [-]

function TDM.GetObject(Id: integer; TableName: String): TObject;
var ClassName,Cad,CProp:String;
    Obj:TObject;
    MiQuery: TFDQuery;
    Campos, Propiedad : TStringList;
    lProp    : TRTTIProperty;
    lContext,C : TRTTIContext;
    lType    : TRTTIType;
    Value: TValue;
    Pos1,Pos2:integer;
begin

  Campos     := TStringList.Create;
  Propiedad  := TStringList.Create;
  Cad           := 'select * from '+TableName;
  ClassName := 'T'+TableName;

  MiQuery := TFDQuery.Create(nil);
  MiQuery.Connection := Connection;
  MiQuery.SQL.Clear;
  MiQuery.SQL.Add(Cad);
  MiQuery.Open;

  //-- Iniciando extraccion de las propiedades de las clases --//
  LContext := TRttiContext.Create;
  C := TRttiContext.Create;

  Obj := (C.FindType('Modelo_Cliente.'+ClassName) as TRttiInstanceType).MetaClassType.Create;
  lType    := lContext.GetType(Obj.ClassInfo);   

  for lProp in LType.GetProperties do  /// Aca guardo las propiedades en un StringList llamado Propiedad
  begin
    Cad  := lProp.ToString;
    Pos1 := Pos('i',Cad);
    Pos2 := Pos(':',Cad);
    CProp := Copy(Cad,Pos1,Pos2-Pos1);
    Propiedad.Add(CProp);
  end;


  if MiQuery.RecordCount>0 then
    begin
      //--- Poniendo los campos en el arreglo --///
      Connection.GetFieldNames('','',TableName,'',Campos);   //--- Aca hay que poner los campos del Query ----//

      //--- Poniendo las propiedades del Objeto ---//
      //(Obj as ClassName).Propiedad[2] := '123456';
      Value := '123456789';


      for lProp in LType.GetProperties do  //// ACA ESTA EL ERROR NO PUEDO GUARDAR LOS VALORES EN EL OBJETO
      begin                                            /// NOSE COMO USAR EL PROPERTY O CUALQUIER METODO PARA MODIFICAR LOS ATRIBUTOS DEL OBJETO.
        Cad  := lProp.ToString;
        //showmessage(Cad);
        if Cad = 'property iId_Cliente: Integer' then
          lProp.SetValue(Obj,Value);
      end;

      //Lprop.SetValue(Obj,'12345');


      //showmessage(Campos[5]);
      //showmessage(Propiedad[4]);

    end;

  result := Obj;
end;

Como comentaba en lineas arriba no se como modificar los atributos del objeto Obj para poder devolver el objeto con todos sus valores.
todo esto lo quiero hacer para cualquier tabla y cualquier tipo de objeto, para esto debo indicar que si creo una tabla Kardex también creo una clase TKardex en un .pas que se llamaría Modelo_Kardex, ese es un standard que sigo.

Les pido me den una mano para poder solucionar este problema, este metodo me serviria para extraer cualquier objeto de cualquier tabla.

Muchas gracias de antemano por leer esta consulta y gracias por su tiempo.

Saludos,

Javier Villa.
__________________
Javier Villa Sánchez
jvilla@andreaproducciones.com
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Usando RTTI para devolver lista de eventos elrayo76 Varios 13 03-06-2016 08:34:57
Recuperación información a través de RTTI jocaro Varios 15 10-05-2016 08:18:00
Error en funcion usando stdcall Ramsay Varios 2 11-03-2016 02:45:55
Herencia externa de componentes (BPL)(RTTI) jednavlop OOP 4 05-11-2010 18:37:14
Acceder al objeto asociado a una prop. (RTTI) Neftali [Germán.Estévez] Trucos 0 30-05-2007 13:39:22


La franja horaria es GMT +2. Ahora son las 06:10:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi