Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Evitar lanzar el método Repaint (https://www.clubdelphi.com/foros/showthread.php?t=64551)

LoPiTaL 07-04-2009 12:56:22

Evitar lanzar el método Repaint
 
Hola a todos! Es la primera vez que posteo, aunque ya hace algún tiempo que he estado leyendo hilos, y la verdad es que me habéis ayudado bastante, aunque ahora se me ha planteado una duda que no he podido solucionar. Os comento:

Tengo un slider al que he modificado su método Paint para poder pintar alrededor de éste sombras y darle un efecto 3D, más o menos aceptable. Las sombras que aparecen a izda y drcha del slider funcionan a la perfección. Sin embargo, cuando intento pintar también las sombras que aparecen debajo de éste, cuando pinto el TImage en el que está contenida, lanza otra vez el método Paint del slider, éste repinta la sombra y se relanza, y así sucesivamente....

Utilizo a parte del slider, tres TImage: dos para las sombras laterales y una para la sombra inferior.

¿Cómo puedo evitar que reentre una y otra y otra vez en el método Paint del slider?

Muchas gracias de antemano,
Un saludo,
LoPiTaL

Neftali [Germán.Estévez] 07-04-2009 13:05:50

Supongo que entre ellos se están "pisando" de ahí que se ejecuten los Paint de forma sucesiva.
Si tienes redefinido el método Paint, tal vez puedes evitar llamar al inherited. De todas forma sin ver el código es difícil.

LoPiTaL 07-04-2009 13:48:30

Gracias por la rápida respuesta. Sí, tienes razón en lo de que se están pisando, por eso había dicho que las fotos laterales se mostraban bien, pero la inferior (que se pinta sobre el slider) provoca la reentrada.
El código que utilizo es relativamente simple. Lo que hago (olvidándonos de las imágenes laterales) es:
-Calculo los pixeles de la imágen inferior, reduciendo el brillo de cada uno de ellos en función a una máscara previamente almacenada en memoria.
-Calculo la altura a la que debe estar la imágen (siempre pegada a la palanca del slider).
-Llamo al método Update de la imágen.
-Llamo a inherited.

El código (simplificado) es el siguiente:

Código:

  //Para la sombra de abajo....
  topIm:=topIm+fHandlerBitmap.Height; //Cálculo de la altura (topIm
                                                  //inicializada cuando las otras sombras)
  //Aplicación de la máscara de la sombra y cambio de brillo pixel a pixel:
  temp.Assign(backBottomImage.Picture.Bitmap);
  temp.Width:=backBottomImage.Width;
  temp.Height:=backBottomImage.Height;
  for i := 0 to temp.Height -1 do begin
    DestRow := fBackGroundBitmap.ScanLine[i+topIm];
    for j := 0 to temp.Width - 1 do begin
      colorRGB:=(DestRow[J].rgbtBlue shl 16)+(DestRow[J].rgbtGreen shl 8)+DestRow[J].rgbtRed;
      temp.Canvas.Pixels[j,i]:=cambiaBrilloPixel(colorRGB,fShadeBitmap.Canvas.Pixels[J,I+topIm],RGBF_BGR);
    end;
  end;
  backBottomImage.Picture.Bitmap.Assign(temp);
  backBottomImage.Top:=topIm+Self.Top+1;

    temp.Free;
 
    //Indico que la imagen a cambiado
    backBottomImage.Update;
    inherited Paint;  //Llamo al método superior

Toda ayuda se agradece,
Un saludo,
Rubén

Neftali [Germán.Estévez] 07-04-2009 16:05:32

OK, a eso me refería, tal vez en algunos casos, debas evitar llamar al método inherited.

LoPiTaL 07-04-2009 16:53:24

Sí, pero estoy obligado a llamar al método inherited, porque si no, no se repinta el botón del slider. De todas maneras, he probado a no llamarlo, y sigue reentrando en el Paint una y otra vez.

Un saludo,
LoPiTaL

Neftali [Germán.Estévez] 07-04-2009 17:05:20

Cita:

Empezado por LoPiTaL (Mensaje 344193)
Sí, pero estoy obligado a llamar al método inherited, porque si no, no se repinta el botón del slider.

Bueno, me refería a no llamarlo en unas determinadas condiciones. Está claro que si dejas de llamarlo en todos los casos no va a realizar las tareas correspondientes.

De todas formas, parece que la cosa no es tan sencilla como yo imaginaba... :o

LoPiTaL 07-04-2009 17:13:34

Ya he encontrado la solución!! Ueeeee
He visto que existen los métodos Updating y Updated, que activan flags de dibujado. Se pueden utilizar de la siguiente forma:

Código:

    if (csUpdating in Self.ComponentState) then
      Exit;
    Self.Updating;

    {Código que quieras de dibujado... por ejemplo el Image.Update que me
    molestaba a mí}
 
    //Al final de la función
    Self.Updated

Muchas gracias por la ayuda Neftali.

Un saludo,
Rubén

Neftali [Germán.Estévez] 07-04-2009 17:35:54

Gracias a tí por la respuesta.

Habrá que apuntarla (Updating..Updated).


La franja horaria es GMT +2. Ahora son las 22:44:19.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi