Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error en Bitmap (https://www.clubdelphi.com/foros/showthread.php?t=42561)

natalinuyo 17-04-2007 16:35:13

Error en Bitmap
 
Saludos a todos:

Para simplificar las cosas... En las siguientes líneas de código:

Código Delphi [-]
Form.Image.Picture.Bitmap.FreeImage();
handle := Form.Image.Picture.Bitmap.ReleaseHandle();
...
Form.Image.Picture.Bitmap.Handle := handle;
...

Me aparece un error como sigue:

Project "x.exe" faulted with message 'access violation at 0x03b73ef7: read for address 0x0000033c'. Process...


Estoy utilizando un lector de huella digital, la imagen es la huella digital...
El punto es que no se si recibe bien la imagen del lector, dado que al momento de poner la huella marca ese error...

Les agradezco de antemano la ayuda que me puedan brindar... :o

natalinuyo 17-04-2007 17:34:33

Error en Bitmap
 
El punto es el siguiente:

Me marca error al limpiar la imagen...:rolleyes:

Me pueden dar una alternativa para liberar espacio de un Image?

Utilizo lo siguiente:
Código Delphi [-]
Image.Picture.Bitmap.FreeImage();

Gracias

Chris 17-04-2007 17:44:30

Que código más raro
 
Hola. El código que pusistes me parece raro porque primero, liberas memoria otilizada por la imagen
" Form.Image.Picture.Bitmap.FreeImage; "
Luuego le quitas el identificador a la imagen y lo guardas en una variable, ten en cuenta
que la variable debe ser de tipo HBitmap

" handle := Form.Image.Picture.Bitmap.ReleaseHandle(); "

Luego vuelves a asignar el identificador de la imagen al mismo objeto.
...
" Form.Image.Picture.Bitmap.Handle := handle; "
...No sé realmente cual es la intención con esto, el accessviolation se presenta porque destruyes la imagen, no deverias de hacer esto, en ves de utilizar un controlador podrías ocupar un objeto TBitmap.

Tavel si explicaras un poco más cuales son tus objetivos con esté código, te pueda ayudar.

Delphius 17-04-2007 17:47:55

Para limpiar un Image solo basta con esta sentencia:

Código Delphi [-]
Image1.Picture := Nil;

Saludos,

natalinuyo 17-04-2007 18:06:43

Cita:

Empezado por D&W
El código que pusistes me parece raro porque primero, liberas memoria otilizada por la imagen.

La limpio para asignarle después la image nueva de huella digital.

Tienes razón no debería asignar nada dado que está limpia la imagen...

Sin embargo se me presenta el error al momento de liberar el espacio de la imagen...

natalinuyo 17-04-2007 18:11:10

En esta parte obtengo la imagen:
Código Delphi [-]
 if biometricDisplay then
    // get image with biometric info
    GrBiometricDisplay(template.tpt,raw.img, raw.width, raw.height,raw.Res, hdc,handle, context)
  else
    // get raw image
    GrCapRawImageToHandle(raw.img, raw.width, raw.height, hdc, handle);

  // draw image on picture box
  if handle <> 0 then
  begin
      Fdetalle.image.Picture.Bitmap.Handle := handle;
      Fdetalle.image.Repaint();
  end;

Ya quité la parte donde limpio la imagen, pero ahora el error aparece justo donde le asigno la imagen...
El codigo es medio extraño (no es mio, así me llegó :) ), y algunas cosas aun estoy en proceso de comprenderlas...

natalinuyo 17-04-2007 18:18:49

Este es el procedimiento
Código Delphi [-]
// Display fingerprint image on screen
procedure PrintBiometricDisplay(biometricDisplay: boolean; context: Integer);
var
  // handle to finger image
  handle: HBitmap;
  // screen HDC
  hdc: LongInt;
begin
  // free previous image

//  Fdetalle.limpia(handle);

  {If range checking is on - turn it off for now
   we will remember if range checking was on by defining
   a define called CKRANGE if range checking is on.
   We do this to access array members past the arrays
   defined index range without causing a range check
   error at runtime. To satisfy the compiler, we must
   also access the indexes with a variable. ie: if we
   have an array defined as a: array[0..0] of byte,
   and an integer i, we can now access a[3] by setting
   i := 3; and then accessing a[i] without error}
  {$IFOPT R+}
    {$DEFINE CKRANGE}
  {$R-}
  {$ENDIF}
   // get screen HDC
  hdc := GetDC(HWND(nil));

  if biometricDisplay then
    // get image with biometric info
    GrBiometricDisplay(template.tpt,raw.img, raw.width, raw.height,raw.Res, hdc,
                        handle, context)
  else
    // get raw image
    GrCapRawImageToHandle(raw.img, raw.width, raw.height, hdc, handle);

  // draw image on picture box
  if handle <> 0 then
  begin
    Fdetalle.image.Picture.Bitmap.Handle := handle;
//    Fdetalle.image.Picture.Bitmap.Handle := handle;
//    Fdetalle.image.Width := Fdetalle.Bevel1.Width;
  //  Fdetalle.image.Height := Fdetalle.Bevel1.Height;
    Fdetalle.image.Repaint();
  end;

  // release screen HDC
  ReleaseDC(HWND(nil), hdc);

  {Turn range checking back on if it was on when we started}
  {$IFDEF CKRANGE}
    {$UNDEF CKRANGE}
    {$R+}
  {$ENDIF}
end;

Chris 17-04-2007 20:05:49

Lo mejor que puedes hacer por el momento es chequear la documentación del componente que estás utilizando para reconocer las huellas. Revise tu código y casi con certeza te puedo decir que la clave está en esta parte del código

Código Delphi [-]
    GrBiometricDisplay(template.tpt,raw.img, raw.width, raw.height,raw.Res, hdc,handle, context)
  else
    // get raw image
    GrCapRawImageToHandle(raw.img, raw.width, raw.height, hdc, handle);

si GrBiometricDisplay y GrCapRawImageToHandle son funciones, seguramente te deben de devolver un controlador o Handle, con lo cual el código quedaría algo así.

Código Delphi [-]
   handle :=  GrBiometricDisplay(template.tpt,raw.img, raw.width, raw.height,raw.Res, hdc,handle, context)
  else
    // get raw image
    handle := GrCapRawImageToHandle(raw.img, raw.width, raw.height, hdc, handle);

También observo que pasas como parámetro la variable handle, ese handle me imagino que es la imagen obtenida del dispositivo, a menos que eso parámetros sean de tipo "var" o "out". De todos modos en este aspecto no te puedo ayudar porque no conozco esas funciones, talvez si conociera su respectiva documentación si te pudiera ayudar. Cualquier cosa me comentas, bye.

natalinuyo 17-04-2007 20:25:22

El error no era error...
 
gracias por tu ayuda....

Resulta que mi problema es otro, igual no lo puedo solucionar aun...

Muchas gracias por tomarte el tiempo de contestarme :p

Resulta que en mi proyecto tengo 5 units... todo sería muy simple, pero el caso es que todos los sistemas que se desarrollan deben "subirse" a una especie de integrador, tengo q crear DLL's... eso no es problema, pero en este momento me marca error en todo lo que tiene que ver con los objetos del formulario.

Pensé q era de la imagen (en anteriores proyectos me causó problemillas...), pero ya vi que no.

No puedo hacer nada de Enable, visible o asignar valores, etc. en cosas que involucran objetos del formulario principal. Aún cuando los muevo al Form principal no funciona.

Lo raro es q eso no era problema, ya lo había probado con anterioridad y la bronquilla que tenía era que el lector no me funcionaba (no prendía)... Ahora "funciona", pero pues me crea otros conflictos :confused: .

Pero lo que me dijiste me aclaró algunas dudas que tenía... GRACIAS!


La franja horaria es GMT +2. Ahora son las 08:10:12.

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