Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problemas con Bookmark (https://www.clubdelphi.com/foros/showthread.php?t=36636)

Besto 19-10-2006 10:02:22

Problemas con Bookmark
 
Hola,

tengo un problema con los bookmarks, que paso a explicar:

Uso delphi 6 con MySql

El código es algo así:

Código Delphi [-]
      if qrPan.BookmarkValid(marca) then
         qrPan.FreeBookmark(marca);
      
      marca := qrPan.GetBookMark;
      while not qrPan.eof do
         begin
            {...}
            qrPan.next;
          end;
      qrPan.GoBookmark(marca);

Generalmente funciona bien, pero de repente me da error "Invalid pointer"

¿Alguien sabe que puede pasar??

Gracias.

kuan-yiu 19-10-2006 11:56:45

¿Y el error dónde te salta? ¿Antes del bucle, durante el bucle o después del bucle?

Besto 19-10-2006 13:34:11

El error salta despues de comprobar que es una marca valida independientemente de lo que haga despues, es decir compruebo que es válida da true y luego en la siguiente sentencia da el error.

kuan-yiu 19-10-2006 13:52:55

Yo utilizo bookmarks pero no las utilizo como tú, y no me han fallado. Prefiero hacerlo al revés: liberar el elemento justo después de su último uso, en lugar de hacerlo como primera acción y dentro de un if.
Así me aseguro que después de su uso se borra y no tengo memoria ocupada.
Código Delphi [-]
procedure TfConciliacion.refrescar_posicionarPag;
var
  marca: TBookMark;
begin
// Refresca los datos de los pagos y se posiciona en el lugar que ocupaba.
  marca := qPagos.getbookmark;
  recalcular_querys_p(datoPago.Text, fechaIni_p.Date, fechaFin_p.Date);
  qPagos.GotoBookmark(marca);
  qPagos.freebookmark(marca);
end;

Besto 19-10-2006 14:41:10

Gracias,
he hecho lo que comentas que igual es más lógico, pero de vez en cuando y solo de vez en cuando me sigue dando el mismos error de puntero inválido, ya que no es solo cuando libero la marca sino también me lo da cuando hago un GotoBookMark.

He mirado el código una y otra vez y no veo que puede pasar, pero seguiré insistiendo....

Lepe 19-10-2006 15:59:36

En principio yo lo veo de otra forma:
Código Delphi [-]
if qrPan.BookmarkValid(marca) then // aqui no sé por qué va, supongo que hay
// codigo antes y por eso lo tienes.
         qrPan.FreeBookmark(marca);
      
      marca := qrPan.GetBookMark;
      while not qrPan.eof do
         begin
            {...}
            qrPan.next;
          end;
if qrPan.BookmarkValid(marca) then
begin
      qrPan.GoBookmark(marca);
      qrPan.FreeBookmark(marca);
end;
      marca := nil;

Es decir, lo normal es obtener la marca, mover el dataset y por último, preguntar si el BookMark es válido:
- si lo es, voy a ese Bookmark y despues lo libero
- si no lo es, es que ha habido algún problema, no sé si es conveniente llamar a FreeBookmark, puesto que en este caso, no es un puntero de marca Válido.

Por otra parte habría que mirar la implementación o ayuda sobre este tema en MySql.

Ten en cuenta que si cierras la consulta y despues la vuelves a abrir, los punteros no serán válidos, quizás sea convienente guardar la clave primaria de ese registro y usar un Locate, en lugar de usar un Bookmark.

Saludos

kuan-yiu 19-10-2006 16:24:59

Pregunta: ¿Para qué necesitas la marca? ¿Para no perder la posición mientras recorres la consulta?
Porque si es eso puedes ver si te sirve DisableControls/EnableControls.

Lepe 19-10-2006 18:49:40

Respuesta(:p): EnableControls es para que en un bucle no se tenga que refrescar los controles data aware asociados al dataset, por tanto, al deshabilitar ese refresco de datos, el bucle se procesa más rápido y el usuario no vé en la pantalla cómo pasan los registros a modo de ráfaga por los controles.

EnableControls hace lo mismo que BeginUpdate y EndUpdate de un TreeView, ListView, StringList, y otros controles no data aware.

Puede que MySql tambien implemente los métodos BookmarkStr que es un simple String que no se tiene que liberar y es algo más cómodo su uso.

Saludos


La franja horaria es GMT +2. Ahora son las 13:33:27.

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