Ciao, non posso aiutarti specificatamente perchè non ho Lazarus in questo momento però ti accenno due indicazioni presupponendo che tu stia lavorando in Windows.
In generale tutto cio che è un componente grafico derivato dai controlli di Windows per essere "sovrascritto" rispetto al design time deve essere continuamente "rinfrescato" ossia ridisegnato (e non sempre ciò funziona, vedi i controlli TCheckBox e simili o il TButton). Si usa l'evento OnPaint per disegnare o scrivere nel controllo qualsiasi cosa tu voglia disegnare a runtime (compreso il testo per alcune tipologie di controlli quali le griglie).
Per ovviare a ciò ci sono dei specifici componenti che possono essere usati a runtime per consentire di disegnare forme basi come cerchi rettangoli stondati o no, lo TShape è uno di questi che può essere usato sia a design time che a runtime.
Se vuoi disegnare sulla form, usa il metodo OnPaint e dentro li ci scrivi la tua routine.
Nell'esempio che ti propongo vedrai che scrivendo una sola volta appare il quadrato permanente, ma per alcuni controlli ciò và fatto in continuo quindi togliendo l"IF"
La FORM DEVE ESSERE ALMENO DI 301 x 301 PIXEL affinchè il codice sotto riportato funzioni.
var tip: integer = 0; //và dichiarata nella sezione "interface"
procedure TForm1.FormPaint(Sender: TObject);
begin
if tip = 0 then //con questo scrive solo una volta
begin
self.Canvas.Rectangle(100, 100, 300, 300);
inc(tip);
end;
end;
P.S.: fai attenzione al codice che inserisci nell'evento, stai occupando il thread principale e quindi "la pompa" dei messaggi di Windows. Se la tua routine impiega molto tempo l'applicazione diventerà instabile (diciamo "not responsive") fino al limite estremo del crash.
C'è una soluzione molto più semplice:
a design time ci piazzi una TImage sulla Form, poi se vuoi o sempre a design time o a runtime setti la proprietà "Align" della TImage a "alClient".
Setta poi le proprietà della TImage (come "proportional", "stretch", etc ..).
Ora caricati una qualsiasi immagine nella TImage di base oppure anche a runtime, oopure crei una bitmap nella TImage direttamente a runtime.
Ora nella Canvas della TImage puoi farci quello che vuoi, disegnarci, copiarci, etc ... e vedrai che spostando la form, rimpicciolendola, posizionandola tra due schermi la tua TImage verrà sempre rinfrescata e mantenuta.
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Canvas.Brush.Color := clGreen;
Image1.Canvas.Pen.Color := clRed;
Image1.Canvas.Pen.Width := 5;
Image1.Canvas.Pen.Style := psSolid;
Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Picture.Bitmap.Create(Image1.Width, Image1.Height);
end;