Respuesta 1
El efecto se produce porque al dibujar una imagen lo haces sobre la anterior, y las partes transparentes dejan ver los restos de la anterior, de esta manera al ir moviendo la imagen los restos de las imágenes anteriores terminan llenando toda la parte izquierda de la imagen.
Respuesta 2
La función Bitblt es una api que copia un bloque de pixeles de un Device Context a otro, le trae sin cuidado las propiedades del objeto TBitmap. Por eso no hace caso de la propiedad Transparent.
Posible solución:
La solución pasa por usar el método Draw y borrar los restos de la imagen anterior antes de dibujar la actual, además de usar un buffer para evitar el parpadeo. Nos quedaría algo así en el evento del timer:
Código Delphi
[-]
procedure TForm1.Timer1Timer(Sender: TObject);
var
Buffer: TBitmap;
begin
Canvas.Brush.Color:= clBtnFace;
Buffer:= TBitmap.Create;
try
Buffer.Canvas.Brush.Color:= Canvas.Brush.Color;
Buffer.Width:= G.Width + 2;
Buffer.Height:= G.Height + 2;
Buffer.Canvas.Draw(2,2,G);
Canvas.Draw(i+10,10,Buffer);
finally
Buffer.Free;
end;
inc(i,2);
end;