Ir al contenido


Foto

¿Conocen las causas de este error?,Invalid pointer operation.


  • Por favor identifícate para responder
15 respuestas en este tema

#1 Master23

Master23

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 230 mensajes
  • LocationSanto Domingo

Escrito 26 febrero 2011 - 09:13

Hola amigos, estoy teniendo problemas con este asunto de Invalid Pointer operation,estoy usando una conexión remota con mysql  y estoy usando consultas directas como inser into entre otras cosas pero por ejemplo la primera consulta se ejecuta correctamente, luego cuando presiono hacer la inserción  de nuevo surge este error,espero que me puedan ayudar con esto la verdad no sé de donde sale este error, todo esto ocurre al hacer la consulta por segunda vez y en otro hago lo mismo pero el error es diferente can not open a resultset el primer insert ingresa bien, luego al hacer click otra vez presenta un error,en fin espero que me puedan ayudar, muchas gracias de antemano.
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 26 febrero 2011 - 10:04

Hola Master23,

Sin tener más información de tu caso veo complicado saber realmente donde está el problema. Un error Invalid Pointer puede ser provocado por variadas situaciones, y no es algo que sea particularmente un problema dedicado y en forma exlusiva a lo que hace base de datos.

Deberías ser más claro, más detallista. ¿Puedes mostrarnos el código que muestra el error? ¿Qué componentes utilizas y que versión de los mísmos?

Saludos,
  • 0

#3 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 27 febrero 2011 - 09:14

Hola amigos, estoy teniendo problemas con este asunto de Invalid Pointer operation,estoy usando una conexión remota con mysql  y estoy usando consultas directas como inser into entre otras cosas pero por ejemplo la primera consulta se ejecuta correctamente, luego cuando presiono hacer la inserción  de nuevo surge este error,espero que me puedan ayudar con esto la verdad no sé de donde sale este error, todo esto ocurre al hacer la consulta por segunda vez y en otro hago lo mismo pero el error es diferentecan not open a resultset el primer insert ingresa bien, luego al hacer click otra vez presenta un error,en fin espero que me puedan ayudar, muchas gracias de antemano.


En esencia, estás intentando acceder a un área de memoria que o no tiene nada o no contiene lo que se espera. ¿Solución? Ninguna específica. Tal vez, intentar con una serie de instrucciones que realicen el mismo procedimiento pero por otro camino; o cambiar (si es posible) el motor de base de datos.
  • 0

#4 Master23

Master23

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 230 mensajes
  • LocationSanto Domingo

Escrito 27 febrero 2011 - 09:59

quizás el problema se deba a que después de hacer la inserción , uso un método de la clase que creé ,ejemplo.



delphi
  1. dato := TDatos.Create;
  2. dato.InsertarInformacion(edit1.text,edit2.text,edi3.text);
  3. dato.Free;


Quizás tiene que ver con esto , porque la primera ejecución se ejecuta perfectamente, el problema darle de nuevo al botón para que agregue otra vez llamo de nuevo al mismo método, y ahí viene el problema, la primera inserción funciona bien, el problema es si se repite la operación al darle al botón de insertar de nuevo. En conclusión a darle por primera vez al botón insertar se ingresan los datos correctamente, en cambio si ahí mismo vuelvo y le doy click a insertar para que ejecute este método ahí viene el invalid pointer operation.
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 27 febrero 2011 - 10:59

quizás el problema se deba a que después de hacer la inserción , uso un método de la clase que creé ,ejemplo.


dato := TDatos.Create;
dato.InsertarInformacion(edit1.text,edit2.text,edi3.text);
dato.Free;


Quizás tiene que ver con esto , porque la primera ejecución se ejecuta perfectamente, el problema darle de nuevo al botón para que agregue otra vez llamo de nuevo al mismo método, y ahí viene el problema, la primera inserción funciona bien, el problema es si se repite la operación al darle al botón de insertar de nuevo. En conclusión a darle por primera vez al botón insertar se ingresan los datos correctamente, en cambio si ahí mismo vuelvo y le doy click a insertar para que ejecute este método ahí viene el invalid pointer operation.


Es posible, pero sin saber lo que hace el método InsertarInformacion estamos en la misma. Yo por ese código me inclino a que el problema no necesariamente el método sino la creación de dicho objeto.

En vez de



delphi
  1. Dato.Free



Utiliza



delphi
  1. FreeAndNil(Dato);



El meollo del asunto es que Free está para liberar el objeto, más esto no significa que la memoria a la que hace referencia pueda seguir utilizando. De hecho, lo que sucede es que Free libera el objeto pero no limpia la dirección de memoria a la que apunta.

Si tu vas a reutilizar la variable debes hacer uso de FreeAndNil, o bien:



delphi
  1. MiObjeto.Free;
  2. MiObjeto := nil;



Eso debería ser suficiente para solucionar el problema.

Saludos,
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 06 marzo 2011 - 10:26

¿Alguna novedad? ¿Te ha servido en algo la información brindada?  :huh:

Saludos,
  • 0

#7 Master23

Master23

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 230 mensajes
  • LocationSanto Domingo

Escrito 06 marzo 2011 - 10:47

¿Alguna novedad? ¿Te ha servido en algo la información brindada? 

Saludos,



Intenté con las alternativas que me mencionaste , sin embargo el problema nunca desapareció. Lo único que yo quería era hacer consultas directas se ejecutaban con éxito la primera vez sin embargo a la segunda ya no servían y lanzaban Invalid Pointer operation.


Por ejemplo:


delphi
  1. procedure Button1Click(TSender:Object)
  2. var objecto:TMyClase;
  3. begin
  4. objecto := TMyClase.Create;
  5. obejeto.InsetarEnLaTablaUsuarios(nombre.text,password.text,confirmacion.text);
  6. objecto.Free;
  7. end;



Intenté además de free las demás formas que me mencionaste como FreeAndNil(Objecto) sin embargo sigue el error Invalid Pointer operation.


En ese método uso un adoquery el cual por las propiedades .SQL.Text les hago un insert con los parámetros del método les envío cada dato, la primera ejecución se realiza con éxito , sin embargo le doy al botón otra vez y ahí lanza el problema.


es decir primera ejecución al darle es correcta , pero si le doy al botón otra vez ahí mismo lanza error. Muchas gracias delphius por estar al pendiente como siempre,cuídate.
  • 0

#8 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 07 marzo 2011 - 05:04

Lo siguiente a mirar seria TMyCalse.OnCreate y TMyClase.OnDestroy.

Podria ocurrir que OnCreate asignes alguna propiedad tipo SQLQuery a un objeto "externo" del form o del DataModule o de donde sea, y al salir, matas ese objeto externo con un free... pero claro, has matado algo que no era tuyo, y la segunda vez que vas a usarlo, no existe.

Algo de este estilo podría ser la causa:



delphi
  1. OnCreate: MySQL:= Application.MainForm.SQLObject;
  2. OnDestroy: MySQL.free;


  • 0

#9 Master23

Master23

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 230 mensajes
  • LocationSanto Domingo

Escrito 07 marzo 2011 - 10:26

Lo siguiente a mirar seria TMyCalse.OnCreate y TMyClase.OnDestroy.

Podria ocurrir que OnCreate asignes alguna propiedad tipo SQLQuery a un objeto "externo" del form o del DataModule o de donde sea, y al salir, matas ese objeto externo con un free... pero claro, has matado algo que no era tuyo, y la segunda vez que vas a usarlo, no existe.

Algo de este estilo podria ser la causa:

OnCreate: MySQL:= Application.MainForm.SQLObject;
OnDestroy: MySQL.free;

Si, yo también he pensando lo mismo Sergio, creo que se destruye el objecto con algo más de la base de datos , por eso a la segunda vez , presenta quizás ese error.
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 07 marzo 2011 - 11:08

Coloca por favor el codigo de la clase, sino estaremos andando a ciegas, pregunto, esa clase realiza un query de insecion?, verificaste que antes de insertar se limpie el query para nuevas inserciones?, de todos modos estaremos esperando el code.

Saludos.
  • 0

#11 Master23

Master23

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 230 mensajes
  • LocationSanto Domingo

Escrito 07 marzo 2011 - 08:45

Coloca por favor el codigo de la clase, sino estaremos andando a ciegas, pregunto, esa clase realiza un query de insecion?, verificaste que antes de insertar se limpie el query para nuevas inserciones?, de todos modos estaremos esperando el code.

Saludos.





delphi
  1. procedure TDoctores.Agregar_cita(const nombre: string; apellido: string;
  2.   fecha: string;  identificacion: string; telefono: string);
  3.   begin
  4.     if datamodule2.ZaddCita.Active = false then
  5.     datamodule2.ZaddCita.Active := true;
  6.  
  7.  
  8.     datamodule2.ZaddCita.SQL.Clear;
  9.  
  10.  
  11.     datamodule2.ZaddCita.SQL.Text:=
  12.     'insert into citas values('+
  13.     'null,"'+nombre+'","'+apellido+'","'+fecha+'","'+
  14.     hora+'","'+identificacion+'","'+telefono+'")';
  15.  
  16.  
  17.     try
  18.       datamodule2.ZaddCita.ExecSQL;
  19.     except
  20.       ShowMessage('Ha ocurrido un problema en el momento, de la inserción por favor intente de nuevo.');
  21.       exit;
  22.     end;
  23.     Showmessage('Se agregó la cita con con exito.');
  24.     datamodule2.ZQuery2.Refresh;
  25.   end;




luego implemento ese método de la clase de la manera normal.




delphi
  1. procedure Tform3.BitBtn1Click(Sender: TObject);
  2. begin
  3. Dr := TDoctores.Create;
  4. Dr.Agregar_cita(nombre.text, apellido.text,
  5.   datetostr(fecha.Date), identificacion.text,telefono.text);
  6. Dr.Free
  7. end;



Tomando en cuenta que nombre.text,etc son campos edit normal.

El programa como explique anteriormente, ejecuta la primera vez al dar al botón, todo correctamente, pero si vuelvo a darle al botón , ahí viene el problema Invalid pointer operation.Si, doy continuamente al botón en vez de seguir insertando, lanza ese error.
  • 0

#12 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 08 marzo 2011 - 03:43

Dos cosas respecto de tu codigo:

1) La variable Dr solo se usa dentro del BitBtn1Click, pero por lo que veo es una variable global... mala cosa, eso es un peligro publico, mejor usa una variable local dentro de tu procedure y asi evitas que desde fuera otro proceso quiera usar Dr y te falle! En cualquier caso, si necesitas dejar Dr como esta, al terminar no vale con un free, porque el puntero sigue teniendo valor y cualquier cosa que hagas con Dr te dara un error de memoria feo, asi que creo que sería mejor asi:



delphi
  1. procedure Tform3.BitBtn1Click(Sender: TObject);
  2. var MyDr: TDoctores;
  3. begin
  4. MyDr := TDoctores.Create;
  5. MyDr.Agregar_cita(nombre.text, apellido.text,
  6.   datetostr(fecha.Date), identificacion.text, telefono.text);
  7. FreeAndNil(MyDr);
  8. end;



2) No has puesto el codigo de TDoctores.Create y TDoctores.Destory, el error podria ser lo que te comento de que Dr sea global, o puede estar en estas otras dos funciones

Añadido: Otra cosilla, veo que pones los valores de texto en tu SQL sin mas... eso funciona el 99% de las veces, pero si tu cliente se llama Pepe's Jeans o Restaurante "El soto" entonces esas comillas internas te puede estropear la SQL y no ejecutará! Yo suelo poner tooodos los textos en QuotedStr(Texto), que te añade comillas al principio y al final, y las que hayan internas, las duplica para que SQL las acepte bien.
  • 0

#13 Master23

Master23

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 230 mensajes
  • LocationSanto Domingo

Escrito 08 marzo 2011 - 08:20

Dos cosas respecto de tu codigo:

1) La variable Dr solo se usa dentro del BitBtn1Click, pero por lo que veo es una variable global... mala cosa, eso es un peligro publico, mejor usa una variable local dentro de tu procedure y asi evitas que desde fuera otro proceso quiera usar Dr y te falle! En cualquier caso, si necesitas dejar Dr como esta, al terminar no vale con un free, porque el puntero sigue teniendo valor y cualquier cosa que hagas con Dr te dara un error de memoria feo, asi que creo que sería mejor asi:



delphi
  1. procedure Tform3.BitBtn1Click(Sender: TObject);
  2. var MyDr: TDoctores;
  3. begin
  4. MyDr := TDoctores.Create;
  5. MyDr.Agregar_cita(nombre.text, apellido.text,
  6.   datetostr(fecha.Date), identificacion.text, telefono.text);
  7. FreeAndNil(MyDr);
  8. end;



2) No has puesto el codigo de TDoctores.Create y TDoctores.Destory, el error podria ser lo que te comento de que Dr sea global, o puede estar en estas otras dos funciones

Añadido: Otra cosilla, veo que pones los valores de texto en tu SQL sin mas... eso funciona el 99% de las veces, pero si tu cliente se llama Pepe's Jeans o Restaurante "El soto" entonces esas comillas internas te puede estropear la SQL y no ejecutará! Yo suelo poner tooodos los textos en QuotedStr(Texto), que te añade comillas al principio y al final, y las que hayan internas, las duplica para que SQL las acepte bien.



Muchas gracias amigo Sergio,Voy a probar tus recomendaciones y si, tienes razón con las comillas externas voy hacer lo que me dices, Muchas gracias otra vez.
  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 marzo 2011 - 09:08

Hola,

Efectivamente lo que te ha dicho Sergio es lo que te comenté: el uso de FreeAndNil() para liberar adecuadamente el objeto. Si la idea es reutilizar la variable es OBLIGATORIO su uso.

Como ha dicho Sergio, el problema puede estar en el .Create, en el .Destroy... alguna otra llamada y/o uso de la variable... Hace falta más de tu parte Master23, debes mostrarnos como estás encarando tu código por mucho que te moleste o te pueda costar aceptar esa idea... sin ver código estaremos obligados a adivinar, o dando palos a lo ciego como dicen.

Esta excepción llamada EInvalidOperation, que no error, se puede producir por muchas causas... la más común y lo que tiene de factor común a todas las causas es que se pierde referencia del handle o el "manejador" de un componente o que no tiene parent.
Es posible que estés liberando algún componente y no te das cuenta. No debería aventurarme pero tengo una ligera sospecha que se trata de ZaddCita.

Lo que yo si he notado de tu código es el uso de EXIT. Eso no va... cuando se provoca una excepción se "cancela" toda la operación y el resto de las instrucciones no se ejecutan... se sale del ciclo normal. Es inútil el exit, en vez de "salir" lo adecuado sería establecer ZaddCita inactivo (.Active = false) Y mover la línea del ShowMessage de éxito y el Refresh a la parte try.

Te aconsejo una profunda leída al concepto de Excepciones de la Cara Oculta de Delphi 4.

Saludos,
  • 0

#15 Master23

Master23

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 230 mensajes
  • LocationSanto Domingo

Escrito 08 marzo 2011 - 09:13

Hola,

Efectivamente lo que te ha dicho Sergio es lo que te comenté: el uso de FreeAndNil() para liberar adecuadamente el objeto. Si la idea es reutilizar la variable es OBLIGATORIO su uso.

Como ha dicho Sergio, el problema puede estar en el .Create, en el .Destroy... alguna otra llamada y/o uso de la variable... Hace falta más de tu parte Master23, debes mostrarnos como estás encarando tu código por mucho que te moleste o te pueda costar aceptar esa idea... sin ver código estaremos obligados a adivinar, o dando palos a lo ciego como dicen.

Esta excepción llamada EInvalidOperation, que no error, se puede producir por muchas causas... la más común y lo que tiene de factor común a todas las causas es que se pierde referencia del handle o el "manejador" de un componente o que no tiene parent.
Es posible que estés liberando algún componente y no te das cuenta. No debería aventurarme pero tengo una ligera sospecha que se trata de ZaddCita.

Lo que yo si he notado de tu código es el uso de EXIT. Eso no va... cuando se provoca una excepción se "cancela" toda la operación y el resto de las instrucciones no se ejecutan... se sale del ciclo normal. Es inútil el exit, en vez de "salir" lo adecuado sería establecer ZaddCita inactivo (.Active = false) Y mover la línea del ShowMessage de éxito y el Refresh a la parte try.

Te aconsejo una profunda leída al concepto de Excepciones de la Cara Oculta de Delphi 4.

Saludos,



Si, Delphius pero mostré el código, osea no hay nada más que mostrar solo hago métodos igual a ese que mostré, la clase usa ese  ese tipo de métodos mostré ese método porque todos son iguales, y el uso que les doy en el botón.
  • 0

#16 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 marzo 2011 - 10:32

Pero el punto Master23 es que te estamos diciendo que posiblemente el problema no necesariamente esté en esos métodos sino en el constructor ( Create) y/o el destructor (Destroy) como así también podría deberse a una liberación de algún componente que se te ha pasado por alto.

Con todo respeto, no basta con que nos digas que los demás métodos son iguales a ese... ¡no vemos el resto del código de la clase y de la unidad que hace uso de la clase! El error no necesariamente puede estar en el método... ¡entiéndelo! El error sale porque en algún otro lado ha sucedido algo que ha liberado o perdido referencia a su parent ¡NO VEMOS EN ESAS POCAS LINEAS ALGO QUE NOS DIGA EL VERDADERO PROBLEMA!.

¿Porqué no haces un break point y vas ejecutando paso a paso para ver en que línea exactamente salta la excepción?, de allí podríamos tener una pista más firme de por donde fijarnos. Pero como ya te hemos indicado: ¡estamos dando palazos a lo ciego! No no estás facilitando las cosas para asesorarte.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.