You don't necessarily need threading, you just need to return control to the main UI message loop periodically. For instance, break up your loop into chunks that you can trigger with TThread.ForceQueue() for each iteration, eg:
procedure TMyForm.DoProcessing(i: Integer);
begin
Label1.Text := 'Step ' + IntToStr(i);
Inc(i);
if i <= 10 then
TThread.ForceQueue(nil, procedure begin DoProcessing(i); end, 200)
else
TThread.ForceQueue(nil, AfterProcessing);
end;
procedure TMyForm.StartProcessing;
begin
DoProcessing(1);
end;
procedure TMyForm.AfterProcessing;
begin
...
end;