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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-03-2005
Avatar de Xianto
Xianto Xianto is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nací en Neuquén (ARG), desde 2001 Spain
Posts: 151
Poder: 20
Xianto Va por buen camino
Destroy de mala madre...

Hola... estoy enojadete (como diria Flanders) con un componente...

Se trata de un TADODataSet.. veamos un poco de código:

Código Delphi [-]
procedure pepe()
var rec: integer;
    vIndex: integer;
    ADORecs: array [0..4] of TADODataSet;
begin
  for x := 0 to 4 do
    begin
        ADORecs[x].Free;
    end;
  vIndex := 0;
  ADORecs[vIndex] := TADODataSet.Create(Self);
    with ADORecs[vIndex] do
      begin
        Name := 'ADORecs'+IntToStr(vIndex);
        CursorType := ctStatic;
        LockType := ltReadOnly;
      end;
..........
end;

El problema es simple, ejecuto el procedimiento con una sola query por lo que solo uso un solo ADODataSet, que en el primer caso el Name seria ADORecs0... hasta ahi todo bien...

El problema al ejecutar el procedimiento una segunda vez, ya que al pasar por la linea: Name := 'ADORecs'+IntToStr(vIndex), intenta nuevamente dar el nombre de ADORecs0, pero el nombre existe, por lo cual el componente no fue destruido...

Como puedo hacer para eliminarlo a el y a los suyos de una vez y por todas sin que me falle de nuevo ???

Desde ya agradecidito.... jejeje
__________________
El diseño dira si tiene futuro...
Responder Con Cita
  #2  
Antiguo 30-03-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Por lo que veo, la variable ADORecs es local del procedimiento y dinámica, por lo que cada vez que entre al procedimiento será una nueva variable, por lo que no contendrá el TDataSet que has asignado anteriormente.
Simplemente o utiliza una variable estática, o sácala del procedimiento.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 30-03-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

Es una saludable práctica de programación destruir todo objeto que se cree cuando deja de ser útil. En tu caso, crear instancias de objetos asignadas a variables locales debería obligarte, cuando menos, a destruirlas antes de salir del procedimiento.

Esto alivia, no solo el problema en cuestión, sino el mas grave problema de consumir recursos y jamás devolverlos, con lo cual la ya frecuente necesidad de reiniciar de windows puede volverse un verdadero dolor de cabeza.

El código quedaria algo asi:

Código Delphi [-]
procedure pepe()
var rec: integer;
    vIndex: integer;
    ADORecs: array [0..4] of TADODataSet;
begin
  vIndex := 0;
  ADORecs[vIndex] := TADODataSet.Create(Self);
  try
    with ADORecs[vIndex] do
      begin
        Name := 'ADORecs'+IntToStr(vIndex);
        CursorType := ctStatic;
        LockType := ltReadOnly;
      end;
     ..........
  finally
    for x :=  0 to 4 do
      AdoRecs[0].Free;
  end;
end;

Lo he encerrado el un bloque try/fianlly para que se libere sin problemas aún cuando ocurra alguna excepción en la ejecución del bloque.

Saludos.
Saludos.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #4  
Antiguo 31-03-2005
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Ahora bien, usar un TObjectList tambien seria util. Aunque habria que hacer un cast el manejo de la memoria es automatico y el codigo quedaria en ultimas mas compacto... en mi opinion...
__________________
El malabarista.
Responder Con Cita
  #5  
Antiguo 31-03-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Podrias explicar cual es la ventaja de usar un TObjectList en este caso particular?

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 31-03-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Buen día a todos!

La solución más adecuada es la que propone Antonio. Cuando una rutina necesita crear un objeto que solamente esa rutina utilizará, es conveniente que en ella se tenga el código que destruya el objeto una vez que ya ha sido utilizado. Para asegurar que la memoria ocupada por el objeto sea liberada finalmente, aunque surjan errores (excepciones) en su utilización, suele emplearse un bloque de protección Try-Finally, como bien lo sugiere Antonio.

El problema principal en el código de Xianto es que en lugar de crear el objeto y luego destruirlo, primero tiene el código de destrucción y luego el de creación, de tal suerte, que cuando la rutina termina, el objeto sigue existiendo y adueñado por el objeto «Self» (considerando que el procedimiento «Pepe» es en realidad un método de alguna clase de objeto).

Delphi.com.ar: Según el código de Xianto la variable ADORecs si es estática, no dinámica.

Espero esto sea de utilidad, seguimos en contacto.

Al González.
Responder Con Cita
  #7  
Antiguo 31-03-2005
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
El manejo de la memoria es automatico... Pero viendo el codigo y teniendo en cuenta que la matriz es de tamaño fijo no es tan buena idea despues de todo... Seria una opcion si se requiere algo mas dinamico pero en este caso ya dieron la mejor respuesta...
__________________
El malabarista.
Responder Con Cita
  #8  
Antiguo 31-03-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Pues por el código original, me da la sensación que Xianto quiere que los objetos se liberen cuando se vuelve a llamar al procedure, no conozco la lógica del programa, pero por eso he propuesto esa solución. Sería bueno conocer su opinión!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #9  
Antiguo 31-03-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Creo que ya entramos al terreno de las suposiciones... será mejor que Xianto nos aclare un poco.

A mi me parece, en vista del código, que en realidad es un descuido al programar, pues no veo de que manera podrian ser accesibles los datos desde fuera, a menos que se asociaran a controles visuales y a través de esto se hiciera, pero igual me parece muy retorcida la idea de hacer esto con una variable local.

Igual, si se hubiese enlazado, podria intentar destruirse antes de volver a crearlo con algo como:

Código Delphi [-]
  if assigned(dbEdit1.Datasource.DataSet) Then
    dbEdit1.DataSource.DataSet.Free;
De cualquier forma esto no me parece nada recomendable.

Hasta luego y un saludo delphi.com.ar
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 31-03-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por Al González
Delphi.com.ar: Según el código de Xianto la variable ADORecs si es estática, no dinámica.
Mmmmm.. No estoy de acuerdo con eso, la variable ADORecs es una viariable dinámica, se creará cada vez que se ejecute el procedimiento. Puede que la confusión resida en que ADORecs es un array estático y no dinámico.

Typed Constants

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 20:56:44.


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