Ver Mensaje Individual
  #3  
Antiguo 05-01-2018
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Reputación: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
El problema que me esta generando es que cuando creo una variable de la clase: TEMPRESAS en ciertos momentos me esta devolviendo error ("Fuera de Memoria") quiero entender que eso es por los ARRAY qye estan definidos.
Cual es el codigo y el error exacto?

De todos modos yo te aconsejaria que te replantees el diseño, porque no se si tenga mucho sentido tener cargadas en memoria las 15,000 empresas, para las cuales ademas hay 200 rubros para cada una.

Otro problema puede ser porque los tipos record se alojan en la stack, y no en la heap como es el caso de las clases.

Respondiendo a las preguntas:

Cita:
1. La clase "TEmpresas" debe tener un arreglo dinámico ya que va a recibir una lista grande de empresas la cantidad no se sabe ya que es variable. entonces hay alguna forma de definir que el arreglo sea dinámico y cuando se tenga el número de registros se cree en base a ello. no sé si eso evitara que ya no salga el mensaje de ("Fuera de Memoria")?
Podes usar un arreglo dinamico, simplemente no tenes que declarar su tamaño. Hay que tener en cuenta que debes inicializar explicitamente el array, reservando la memoria e indicando cuantos elementos quere que tenga, por ejemplo:

Código Delphi [-]
var
  Empresas: array of TEmpresa;
begin
  // reservamos memoria para 20 empresas
  System.SetLength(Empresas, 20);
  // accedes por indice, 0-based
  Empresas[0].cod_empresa = 'blablabla';

  // podes redimensionarlo sin ningun problema. Ten en cuenta que es una operacion "costosa" ya que implica mover todo el arreglo
  // a una nueva posicion de memoria en donde quepa
  System.SetLength(Empresas, 30);
end;

De todos modos hay mejores alternativas que gestionan de manera automatica y de forma mucho mas eficiente un arreglo. La solucion mas adecuada para tu problema es usar una clase tipo lista, como TList<T>

Cita:
2. Si ven el Record "TEmpresa" este también tiene un arreglo y quisiera saber si es posible también hacerlo dinámico, similar a lo comentado en el punto 1.
Idem anterior. Podes tener variables en clases o records de tipo TList<T>, sin ningun problema. Ten en cuenta que son objetos y que debes inicializarlos antes de usarlos, y destruirlos cuando ya no los uses mas. En un record yo nunca pondria una variable que sea un objeto. Si queres mantener el tipo TEmpresas como un record, lo mas adecuado seria que uses un arreglo dinamico. Los arreglos dinamicos son liberados automaticamente de memoria (tienen contador de referencias, como los strings)

Para declarar una variable de tipo arreglo dinamico debes primero crear un tipo:

Esto no se permite (si no me falla la memoria)

Código Delphi [-]
type
  TEmpresa = record
    rubros: array of TRubro;
  end;

Esto si:

Código Delphi [-]
type
  TRubros = array of TRubro;
  TEmpresa = record
    rubros: TRubros;
  end;

De todos modos, yo prefiero utilizar genericos, y Delphi ya provee un tipo de arreglo dinamico generico

Código PHP:
type
  TEmpresa 
record
    rubros
TArray<T>; // si buscas la declaracion de TArray<T>, esta definido como TArray<T> = array of T; 
  
end
Cita:
3. He definido así la clase por motivo que me va a llegar información desde un servicio rest(JSON) y tiene esta misma estructura y como luego la data de la clase guardara en un ClientDataSet, ¿no si es la mejor alternativa la que he elegido?
No entendi muy bien la pregunta.. vas a recibir y almacenar toda esa informacion en las clases y despues volcarlas a un ClientDataSet? Y porque no volcar todo directamente al ClientDataSet? Por que lo queres pasar al ClientDataSet?
Responder Con Cita