PDA

Ver la Versión Completa : Limpiar un TImage


Angel.Matilla
17-12-2016, 13:14:18
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:
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
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:
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í:

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


Dependiendo de si tienes un bucle que no permita leer los mensajes de Windows, quizás debas añadir:
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.
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
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:

void ReDrawWindow(HWND hWnd)
{
TRect cr;
::GetClientRect(hWnd, &cr);
InvalidateRect(hWnd, &cr, true);
SendMessage(hWnd, WM_NCPAINT, 0, 0);
RedrawWindow(hWnd, &cr, 0, RDW_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:

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

provocaría precisamente ese comportamiento.

Pero por otro lado, el moldeo:
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
Hola ecfisa. Gracias.
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.
Pero por otro lado, el moldeo:
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
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
¿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,


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

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

...

if (!Ficha(fPersona, Query)) 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 :)