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
System.SetLength(Empresas, 20);
Empresas[0].cod_empresa = 'blablabla';
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?