Ver Mensaje Individual
  #4  
Antiguo 30-07-2012
elarys elarys is offline
Miembro
 
Registrado: abr 2007
Posts: 94
Reputación: 18
elarys Va por buen camino
Gracias Neftali, justamente estaba viendo las funciones que propones, les dejo un pequeño resumen de como lo estoy resolviendo, por si a alguno le interesa. Por ahora para ir tomando la idea estoy guardando los datos obtenidos en un array dinamico. Y con el procedimiento recursivo.

Código Delphi [-]
//La llamada a la funcion seria algo como
GetPropertyList(Producto, tkProperties, 0);

//Y aca dicha funcion
procedure GetPropertyList(Obj: TObject; Filter: TTypeKinds; Counter: integer);
var
  Names, Value, Tipo: string;
  PInfo: PPropInfo;
  PropList: PPropList;
  Count, i, j: integer;
  Ob: TObject;
begin
  //Aqui obtengo la lista de propiedades del objeto
  Count := GetPropList(Obj.ClassInfo, Filter, nil);
  GetMem(PropList, Count * SizeOf(PPropInfo));
  GetPropList(Obj.ClassInfo, Filter, PropList);
  //---

  //Luego las recorro y obtengo
  for i := 0 to Count -1 do
  begin
    Value := GetPropValue(Obj, Proplist[i].Name); //Valor de cada propiedad
    PInfo := GetPropInfo(Obj, Proplist[i].Name); //info para obtener tipo de propiedad luego
    Names := UpperCase(Proplist[i].Name); //Nombre de cada propiedad

    //Aqui segun la informacion de la propiedad obtengo el tipo
    //Añadi todos los casos posibles
    //En el caso de que la propiedad sea TDateTime claro con un formatdatetime se soluciona
    //pero el tipo que me devuelve cuando es tdatetime es float... entonces cuando me lee FPrecio
    //lo transformaria tambien con formatdatetime siendo que este si es float y no hay que modificarlo.
    //Estoy viendo que puedo hacer al respecto

    if PInfo <> nil then
    begin
      case PInfo^.PropType^.Kind of
        tkUnknown: Tipo := 'Unknown';
        tkInteger: Tipo := 'Integer';
        tkChar: Tipo := 'Char';
        tkEnumeration: Tipo := 'Enumeration';
        tkFloat: Tipo := 'Float';
        tkString: Tipo := 'String';
        tkSet: Tipo := 'Set';
        tkClass: Tipo := 'Class';
        tkMethod: Tipo := 'Method';
        tkWChar: Tipo := 'WChar';
        tkLString: Tipo := 'LString';
        tkWString: Tipo := 'WString';
        tkVariant: Tipo := 'Variant';
        tkArray: Tipo := 'Array';
        tkRecord: Tipo := 'Record';
        tkInterface: Tipo := 'Interface';
        tkInt64: Tipo := 'Int64';
        tkDynArray: Tipo := 'DynArray';
      end;
    end;

    //Si es de tipo clase, llamo nuevamente mi procedimiento de forma recursiva
    if Tipo = 'Class' then
    begin
      j := High(xmlArray) + 1;
      SetLength(xmlArray, j + 1);
      SetLength(xmlArray[j], 1);
      xmlArray[j][0] := '<' + Names + '>';

      Ob := GetObjectProp(Obj, Proplist[i].Name);
      GetPropertyList(Ob, tkProperties, Counter + 1);

      j := High(xmlArray) + 1;
      SetLength(xmlArray, j + 1);
      SetLength(xmlArray[j], 1);
      xmlArray[j][0] := + '< /' + Names + '>';
      //Esta parte '< /' debe ir sin espacios pero las etiquetas delphi de la pagina me las borra
      //si le quito el espacio, si no se quita el espacio al querer leer el xml da error
    end
    else
    begin
      //Por ahora si es de otro tipo solo lo cargo en un array
      //como si lo tuviera que escribir en xml
      j := High(xmlArray) + 1;
      SetLength(xmlArray, j + 1);
      SetLength(xmlArray[j], 1);
      xmlArray[j][0] := '<' + Names + '>' + Value + '< /' + Names + '>';
    end;
  end;
end;

Última edición por elarys fecha: 30-07-2012 a las 21:08:12.
Responder Con Cita