Let's summarize, OK?
The OP's question was about why the label caption was changed only for the last string, and the reason is that
Delay() prevents the application from processing its message queue.
The solution is to insert calls to
Application.ProcessMessages() or--more circunscript--
lblMessage.Repaint, the difference being that
ProcessMessages() makes the application process *all* its pending messages while
Repaint causes, as the documentation says, just an "immediate redraw of the control, bypassing the message queue."
Beyond this, as Thaddy correctly remarks, using
CRT in a GUI application should be considered forbidden because the initialization and termination of this unit can cause lots of (relatively) hard to debug problems. The solution is to use
Sleep() instead of
Delay(), and delete
CRT from the
uses clause.
With all this in mind, this may be the (somewhat) correct code:
procedure tform1.btnlukclick(sender : tobject);
begin
lblMessage.Caption := 'Message 1';
lblMessage.Repaint;
Sleep(2000);
lblMessage.Caption := 'Message 2';
lblMessage.Repaint;
Sleep(2000);
lblMessage.Caption := 'Message 3';
end;