Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Limpiar un TImage (https://www.clubdelphi.com/foros/showthread.php?t=91278)

Angel.Matilla 17-12-2016 13:14:18

Limpiar un TImage
 
Tengo un formulario hecho en BCB 6 con un TImage que cargo a partir de una tabla de Firebird. Hasta ahí, ningún problema. Si la ficha tiene foto, la muestra. El problema viene cuando avanzo en la tabla; en este caso, si la nueva ficha no tiene foto que mostrar, el formulario no me limpia el TImage. Tengo puesto este código para cargar la imagen en el formulario:
Código:

TImage *Imagen = static_cast<TImage>(Source);
Imagen->Picture->Assign(NULL);
Imagen->Picture->Assign(qryTemp->FieldByName("Foto"));

y el query se carga a partir de una vista en FB y esto se ejecuta bien. ¿Qué puedo estar haciendo mal?

Casimiro Notevi 17-12-2016 17:09:24

Image1.Picture := nil;

escafandra 17-12-2016 21:09:05

Cita:

Empezado por Angel.Matilla (Mensaje 511849)
Tengo un formulario hecho en BCB 6 con un TImage que cargo a partir de una tabla de Firebird. Hasta ahí, ningún problema. Si la ficha tiene foto, la muestra. El problema viene cuando avanzo en la tabla; en este caso, si la nueva ficha no tiene foto que mostrar, el formulario no me limpia el TImage. Tengo puesto este código para cargar la imagen en el formulario:
Código:

TImage *Imagen = static_cast<TImage>(Source);
Imagen->Picture->Assign(NULL);
Imagen->Picture->Assign(qryTemp->FieldByName("Foto"));

y el query se carga a partir de una vista en FB y esto se ejecuta bien. ¿Qué puedo estar haciendo mal?

Ese código debería limpiar el TImage, si es un Bitmap también debe limpiar así:
Código:

Imagen->Picture->Bitmap->Assign(NULL);
Dependiendo de si tienes un bucle que no permita leer los mensajes de Windows, quizás debas añadir:
Código:

Imagen->Update();

Saludos.

Angel.Matilla 19-12-2016 09:53:49

Yo también lo había hecho siempre así y siempre me había funcionado.
Cita:

Empezado por escafandra (Mensaje 511855)
Código:

Imagen->Picture->Bitmap->Assign(NULL);

¡Da lo mismo lo que ponga! Con Bitmap->, con ->Update()... No lo limpia. :confused:

escafandra 19-12-2016 16:45:24

Cita:

Empezado por Angel.Matilla (Mensaje 511861)
Yo también lo había hecho siempre así y siempre me había funcionado.

¡Da lo mismo lo que ponga! Con Bitmap->, con ->Update()... No lo limpia. :confused:

¿Si minimizas la ventana y la restauras, o si la mueves fuera del área del monitor, se borra?

Pienso que es un problema de "repintado".

Prueba este código que obliga a un repintado total:
Código PHP:

void ReDrawWindow(HWND hWnd)
{
  
TRect cr;
  ::
GetClientRect(hWnd, &cr);
  
InvalidateRect(hWnd, &crtrue);
  
SendMessage(hWndWM_NCPAINT00);
  
RedrawWindow(hWnd, &cr0RDW_FRAME|RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ALLCHILDREN);



Saludos.

ecfisa 20-12-2016 02:41:40

Hola.

El código del primer mensaje debería borrar la imágen sin problemas, sería interesante verlo dentro del contexto ¿ Existe algún condicional previo al código ? por ejemplo:
Código PHP:

void __fastcall TForm1::qryTempAfterScroll(TDataSet *DataSet)
{
  if ( !
qryTemp->FieldByName("FOTO")->IsNull ) {
    
Image1->Picture NULL;
    
Image1->Picture->AssignqryTemp->FieldByName("FOTO") );
  }


provocaría precisamente ese comportamiento.

Pero por otro lado, el moldeo:
Código:

TImage *Imagen = static_cast<TImage>(Source);
me hace pensar que el código está en un evento del propio TImage ¿ en cuál ?

Tal vez con mas datos nos sea posible ver el motivo de ese extraño proceder.

Saludos :)

Angel.Matilla 20-12-2016 09:40:38

1 Archivos Adjunto(s)
Hola ecfisa. Gracias.
Cita:

Empezado por ecfisa (Mensaje 511892)
El código del primer mensaje debería borrar la imágen sin problemas, sería interesante verlo dentro del contexto ¿ Existe algún condicional previo al código ? por ejemplo:

No, tal como está escrito el código no hay ningún condicional del estilo del que sugieres. Pero tienes razón en que sería así como se comportaría si existiera.
Cita:

Empezado por ecfisa (Mensaje 511892)
Pero por otro lado, el moldeo:
Código:

TImage *Imagen = static_cast<TImage>(Source);
me hace pensar que el código está en un evento del propio TImage ¿ en cuál ?

No, no está declarado en un evento del propio TImage
Cita:

Empezado por ecfisa (Mensaje 511892)
Tal vez con mas datos nos sea posible ver el motivo de ese extraño proceder.

En el adjunto hay dos ficheros de texto (Ficha y Función). En el primero está la llamada al segundo.

escafandra 20-12-2016 12:31:31

¿Has comprobado con el debugger que el código pasa por donde quieres?


Saludos.

Angel.Matilla 20-12-2016 17:48:47

Cita:

Empezado por escafandra (Mensaje 511896)
¿Has comprobado con el debugger que el código pasa por donde quieres?

Sí lo hace.

ecfisa 20-12-2016 19:52:34

Hola.

Revisa los valores de las líneas (1) y (2) al ejecutarse,
Código PHP:


void __fastcall TfPersona
::VerFicha(int Codigo)
{
     
LimpiaForm(this);

     if (
Codigo 1) return;  // (1)

     
...

     if (!
Ficha(fPersonaQuery)) return; //(2)
          

     
...

     
Foto->Picture    NULL;  // (3)

     
... 

ya que si Codigo < 1 (1) o, si ficha == false (2), implica que (3) no se ejecutará nunca y por tanto no se limpiará la imágen.
Intenta mover la línea (3) al inicio de la función, si ese es el problema, debería solucionarse.

Saludos :)


La franja horaria es GMT +2. Ahora son las 10:55:19.

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