FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
espero que mrmanuel coloque su código para poder saber si le propongo que haga: TuQuery.SQL.Clear antes de usarla.
__________________
|
#2
|
|||
|
|||
Cita:
Ademas segun este articulo es conveniente crear componentes con el owner nil y destruirlos.. |
#3
|
|||
|
|||
Hola a todos.
siento el retraso, pero problemas con el curro. Bueno os comento. la Query la creo en tiempo de diseño, la cree simplemente añadiendola en una form, donde tengo una serie de tablas y de queris auxiliares. Dicho form está activo en todo el momento, ya que desde el hago todas las operaciones de acceso a los datos. He probado a poner Query.Close, y nada. respecto a lo de cerrar el form y que el se encarge de destruir los objetos, no lo puedo hacer ya que como he dicho antes, es el que lleva toda la chicha del programa. he provado a liberar el la query en concreto, pero al intentar acceder a ella nuevamente, me dice que no, ya que le he liberado anteriormente y da problemas de acceso a memoria. Lo que tendria que hacer es que liberarse la memoria usada para esa consulta, pero que no me cascase al intentar acceder a ella. Gracias.
__________________
Un Saludo a todos/as |
#4
|
||||
|
||||
a ver si eso te sirve... al menos es lo que a mi me funciona y puedo cambiar el Query cuantas veces sea necesario....
__________________
|
#5
|
|||
|
|||
Hola nuevamente.
el codigo que me indica CntraVeneno, es tal y como yo lo hago, lo único que despues del OPEN, hago un Execute. yo lo que quiero hacer es liberar la memoria q usa esa query en un momento dado, sobre tado cuando hago consultas con gran nº de registros. el problema que tengo es q se me queda en memoria, creo, y cuando intento hacer cualquier tipo de consulta, ya sea en la misma query o en otra, me da error de acceso a memoria. gracias
__________________
Un Saludo a todos/as |
#6
|
||||
|
||||
Cita:
Cita:
Hasta Luego -
__________________
No todo es como parece ser... |
#7
|
||||
|
||||
Cita:
Open cuando es consulta (Select) Execute cuando es modificación (Update, Delete, Insert, alter, etc.) ¿nos podrías decir exactamente cuando haces que cosa te marca el error? y ¿cuál es el error específico que te marca?
__________________
|
#8
|
|||||
|
|||||
Cita:
Cita:
Cita:
Cita:
Cita:
Hasta Luego -
__________________
No todo es como parece ser... |
#9
|
||||
|
||||
Cita:
Si le ponemos a un objeto el Owner como Form1, Application etc, jamás llamaremos a Query1.Free en nuestro código, repito, jamás. ¿Por qué?, entendamos que significa Query1, que es lo mismo que cualquier otro objeto, ventana, clase de delphi, etc. Query1 es una variable de tipo puntero. Si la ponemos en modo diseño, Delphi se encarga de crearla en memoria cuando se ejecute nuestro programa, y además el Owner de ese Query será el Form que lo contenga. Por tanto, cuando se libere esa ventana, se liberará el Query1. Si en esa misma ventana colocamos un Query1.Free, la consulta se libera de memoria RAM, pero la variable Query1 se queda apuntando a la zona de memoria donde estaba creada. La próxima vez que se acceda a Query1 nos dará un access Violation. Es más, como ha sido puesta en modo diseño, al liberar la ventana, ésta intentará liberar la consulta, como Query1 es un puntero que tiene un valor, irá a esa zona para liberarla, y entonces obtendremos otro Access Violation. Estamos en la situación de que un objeto tiene un Owner y queremos liberarlo de la memoria antes que su Owner, ¿no hay una solución? Si, usamos FreeAndNil(Query1); nosotros ponemos FreeAndnil(Query1), se libera la consulta de la RAM y además esa rutina hace Query1 := nil , y aquí está el truco; cuando se vaya a liberar el Form, éste pregunta ¿Query1 <> nil?, como es igual a nil, el Form entiende que ya ha sido liberado anteriormente y no trata de liberarlo de nuevo. No tendrá fallos nuestro código. Otra situacións: Nosotros creamos un objeto y le decimos variable := Tvariable.Create(nil); es decir, no tiene Owner, por tanto, será mejor que nosotros la destruyamos. Para evitar errores en una segunda o tercera creación, tambien usaremos FreeAndNil(variable), si es nil, no ha sido creada previamente, o bien ha sido liberada. Si es distinto de nil, es que está creada, no debemos crearla de nuevo. Si usamos variable.Free , variable se queda apuntando a una zona inválida de la memoria, por tanto, no sabemos si está creada, o ya fue liberada. Al usar FreeAndNil, no tenemos esa ambigüedad: Probemos a dar al boton1 y despues 2 o 3 veces al boton2, no ocurre nada ¿verdad?, el programa funciona bien. Probemos a dar al boton1 y despues 2 veces al boton3. Existe una situación algo más rara, es crear un componente en tiempo de ejecución y no liberarlo. Query1 := Tquery.Create(form1); Y nos olvidamos de FreeAndNil y de .Free, porque al fin y al cabo, le hemos puesto el dueño, él se encargará de destruirlo. Que es lo que hacemos con los TEdits, Grids, Buttons, que ponemos en nuestras ventanas en tiempo de diseño. saludos y espero se entienda.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 10-11-2005 a las 18:45:06. |
#10
|
||||
|
||||
Qué explicación lepe !!!!!!!
Con esto debería quedar más que claro este hilo Hasta Luego -
__________________
No todo es como parece ser... |
#11
|
||||
|
||||
ups, pues lee de nuevo que lo he editado
saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
|
|