Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Form no refresca el movimiento de una imagen por codigo (https://www.clubdelphi.com/foros/showthread.php?t=60277)

dantemol 26-09-2008 13:33:18

Form no refresca el movimiento de una imagen por codigo
 
Hola:
Tengo un problema y no entiendo como solucionarlo. La cuestión es que muevo una imagen por mi formulario por código, cuando se da una determinada condición, a través de la propiedad Left o Top y este cambio no se visualiza en la pantalla, sin embargo cuando este movimiento lo ejecuto pulsando un botón (con el código anterior) se visualiza correctamente. Use refresh en el formulario, en la imagen y nada. Muchas gracias por combatir mi ignorancia. Saludos.

Lepe 26-09-2008 14:57:00

Todos los mensajes de repintado tienen poca prioridad en windows, si lo mueves por código varias veces, solo verás la última posición, quizás sea eso.

Código Delphi [-]
for i:= 1 to 30 do
begin
  image1.left := image1.left + i;
  image1.Update; // obligamos a que se pinte inmediatamente y se vea el cambio
end;

Si mueves más controles, quizás te interese Form1.Update, ya que forzaría el repintado de toda la ventana y ésto hace que se "refresquen" todos y cada uno de los componentes que tenga.

Saludos

Delphius 26-09-2008 15:05:29

Disculpen que me cole en la fiesta,:D
Y si se observa cierto efecto molesto al "repintar" la ventana (o parte de ella) debería cambiarse a true la propiedad DoubleBuffered del Form (o tal vez con la del componente baste). Al ser una propiedad pública y no publicada, no se la encuentra disponible en el Inspector. Debe hacerse por código.
Tengo entendido que a partir de la versión 2007 o 2009 recién se pasó esta propiedad a published.

Saludos,

dantemol 26-09-2008 15:54:40

Aun no visualiza el salto
 
Ese un solo movimiento el que hago:

Image1.Left := Image1.Left + 200;

con ningún Update funcionó ni en el Form, ni en Image1; lo solucioné a medias poniendo el código para mover en el evento OnResize se que no es lo correcto, será porque es una imagen PNG? voy a convertira a JPG y les cuento. Saludo

Perdón, debo aclarar algo: el código para el movimiento lo ejecuto al crear el formulario y al darse cierta condición la imagen se desplaza a una posición u otras, tendrá algo que ver?

Delphius 26-09-2008 18:00:55

Cita:

Empezado por dantemol (Mensaje 316571)
Ese un solo movimiento el que hago:

Image1.Left := Image1.Left + 200;

con ningún Update funcionó ni en el Form, ni en Image1; lo solucioné a medias poniendo el código para mover en el evento OnResize se que no es lo correcto, será porque es una imagen PNG? voy a convertira a JPG y les cuento. Saludo

Perdón, debo aclarar algo: el código para el movimiento lo ejecuto al crear el formulario y al darse cierta condición la imagen se desplaza a una posición u otras, tendrá algo que ver?

Me parece que es mucho más probable que sea a causa de que lo haces en el evento OnCreate. OnCreate se ejecuta cuando se crea el form, distinto es cuando se muestra, es por ello que no ves el movimiento, muy seguramente lo ves en su posición final. Posiblemente el evento apropiado sea OnActivate.

No creo que se deba al formato de la imagen; al menos intuyo que es poco probable. Me inclino a que es a causa de OnCreate.

Sería oportuno que muestres el código tal cual lo tienes.

Saludos,

krlox31416 29-09-2008 03:42:50

Pega tu imagen a un panel para que veas la diferencia
y programa en el evento OnActivate
Código Delphi [-]
procedure TForm1.FormActivate(Sender: TObject);
Var i: Integer;
begin
for i:= 1 to 500 do
begin
Panel1.left := image1.left + i;
Panel1.Update; // obligamos a que se pinte inmediatamente y se vea el cambio
end;

y si no pureba estas lineas

Código Delphi [-]
// prueba estas líneas de código y nos cuentas que tal te fue!!!
// es cuestion de jugar con los intervalos y el tamaño de tu imagen
// agrega un timer
procedure TForm1.Timer1Timer(Sender: TObject);
var band: Boolean;
begin
if band = False Then
   begin
   if Image1.Left >= Form1.Width - 1 Then
      begin
      band := True;
      end;
   end
   else
   begin
   if Image1.Left <= 1000 Then
   band := False;
   end;
if band = False Then
   begin
   Image1.Left := Image1.Left + 100;
   end
   else
   Image1.Left := Image1.Left - 100;
end;


La franja horaria es GMT +2. Ahora son las 23:22: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