Ver Mensaje Individual
  #12  
Antiguo 05-12-2008
Avatar de nuk3zito
nuk3zito nuk3zito is offline
Miembro
 
Registrado: ago 2003
Ubicación: "Z" Land
Posts: 244
Reputación: 23
nuk3zito Va por buen camino
Que tal,
cHackAll, me disculpo por mi respuesta agresiva, la verdad es que algunas veces estoy a la defensiva cuando presiento que van a desviar el tema (ya me ha pasado muchas veces, son pocas las ocasiones en que he tenido serias dudas) y creo que en esta ocasión esto me llevó a iniciar con el pie izquierdo; aparte de todo, te agradezco por dar una respuesta a lo que necesito.
Mira, si se que el Framework de .NET tiene su Garbage Collector y es bastante eficiente y he supuesto desde que se me presentó el problema que Delphi no maneja adecuadamente su basura, a pesar de que desde el Delphi 2005 lo han estado prometiendo (uso el 2006, desconozco si alguna versión posterior lo maneje adecuadamente). Es precisamente esto lo que quería indagar en este foro, y es que en realidad nunca se acaba la memoria de mi PC y ni siquiera se ve algo de actividad anormal en este aspecto (ni con los 1300 objetos cargados por el usuario en tiempo de ejecución).
A continuación adjunto un pantallazo que muestra un poco del tema de lo que la pantalla debe hacer (en este proyecto no soy el líder, así que recibo órdenes... órdenes de hacer lo mismo que se hizo en C# de manera muy similar en Delphi)



Los botones se colocan en tiempo de ejecución cargadas sus propiedades y propiedades "agregadas" desde una tabla (para eso utilicé la herencia) los cuales al dar click o al llamar su menú contextual hacen o muestran algo. Las rutinas para las llamadas del menú contextual y el código de los eventos es genérico, es decir, se liga a cada "botón" cargado en la pantalla. Las propiedades que se agregaron son tan genéricas como simples variables (accesadas desde sus propiedades obviamente) de tipo integer, string, real, etc.
¿Por que debe ser botón? Porque al usuario se le indica de manera implícita que le puede dar click (algo obvio) aunque no estoy casado con la idea de tener que usar botones, simplemente fue lo que en su momento se nos ocurrió presentar al usuario. Si encuentro otro componente que sea bastante más ligero y que no me presente los mismos problemas, creo que lo utilizaré.

La manera de liberar los objetos una vez que ya no se requeiren en el reporte actual, es de la siguiente manera:

Código Delphi [-]
  for i := 0 to slElementos.Count - 1 do
    if Assigned( slElementos.Objects[i] ) then
    begin
      TObjElemento(slElementos.Objects[i]).Free;
      slElementos.Delete(i);
    end;

Tal vez esto no sea de la manera adecuada. Pero no se de que otra manera debería liberar los objetos... FreeAndNil entiendo que hace lo mismo pero me pone los valores en null, lo cual lo considero innecesario puesto que elimino mis objetos del StringList que utilizo.

Cita:
Empezado por cHackAll Ver Mensaje

Ahora; cuando en mis comienzos hice lo que el inciador del hilo hizo (con fines de edicion de datos), aprendi que ésta no es una buena practica; solamente basta con imaginar que sucedería si Excel usara para cada celda un TEdit...
Tienes razón al respecto... en este caso el reporte es un mounstruo, se lleva la contabilidad de grandes empresas, pero mi sorpresa no fue que hicieran un reporte así... sino que delphi se sentara con esto. Desde un principio me dejé llevar por la idea de que Delphi sportaría tales procesos como pan comido.

Cita:
Empezado por cHackAll Ver Mensaje

si quieres continar con la actitud inicial pues dudo que obtengas resultados. En mi opinion solo di una critica constructiva para evitarme éste engorroso post.
Creo que a nadie le gusta que le digan que no sabe programar. La verdad me pareció un comentario muy al aire en vez de crítica constructiva puesto que se supone que Delphi no debereía tener problema con esto.

Lo de la memoria por cierto... la memoria de la instancia de la aplicación no se la pasa creciendo, por lo que ni con 3Gb ni con 80Gb se resolvería el problema. Es por eso que acudí al foro para ver si alguien habría tendio antes un problema similar y ver que diablos pudiera estar pasando.

Aún y los roces que se presentaron desde un principio, agradezco ahora si de manera sincera tu aporte. He tenido buena experiencia con foristas que no buscan desacreditar el trabajo de los posteadores sino que se limitan a tratar de solucionar los problemas y lo otro lo dejan como comentario secundario... espero que con esto me disculpes mi postura inicial.

Gracias. Creo que rediseñaré algunas cosas y si esto funciona se los haré saber.
__________________
Tiempo y ocasión acontecen a todos!
Responder Con Cita