Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #3  
Antiguo 05-01-2018
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 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
 



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
Error con clase utilitaria andresenlared JAVA 0 10-10-2013 00:03:33
Como obtener propiedad de una clase que está en una bpl dinámica? AFilth Varios 14 07-03-2007 17:04:04
Tengo un problema de un Error en la declaración de variables Robert01 Varios 4 03-03-2007 05:45:50
error clase no registrada samame Varios 2 21-04-2004 17:49:49
Me da error en la clase pprinterinfo2 fanon Impresión 7 28-05-2003 19:04:59


La franja horaria es GMT +2. Ahora son las 23:25:01.


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