So this is a guessing game?
I like doing debugging but I hate doing it wearing opaque black eyeglass.

It sounds cool but I can't see.
Lets the game begin.
I wrote a simple test to reproduce the issue the TS said. But I cannot reproduce it on Lazarus 1.8.0 Gtk2 Ubuntu Mate 17.10 64-bit.
Here are my guesses:
1. He forgot to call invalidate, see my code.
2. He used a buggy version of Lazarus 1.0.12.
3. He didn't do things correctly in TTimer.OnTimer event.
4. He didn't do things correctly in TForm.OnPaint event.
So, tell me do I win this game?

unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, StdCtrls, ExtCtrls, Unit2;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
end;
var
Form1: TForm1;
PosX: Integer = 350;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.Invalidate;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := False;
Button2.Visible := True;
Timer1.Enabled := True;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Button2.Enabled := False;
Form2.Show;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Brush.Color := clForm;
Canvas.Clear;
Canvas.Rectangle(PosX, 130, PosX + 20, 150);
Dec(PosX, 8);
if (PosX < -30) then PosX := Width + 50;
end;
end.