Actually main form is visible after OnShow. You can make use of OnIdle to do some work after OnCreate, OnActivate and OnShow. I'm not sure if "run function button.click" fits in that concept.
type
TForm1=class(TForm)
...
private
procedure DoIdle(Sender:TObject;var done:boolean);
end;
procedure TForm1.OnCreate(...)
begin
Application.OnIdle:=@DoIdle;
end;
procedure TForm1.DoIdle(Sender:TObject;var done:boolean);
var i:integer;
begin
for i:=0 to 99 do
begin
SomeHardWork;
ProgressBar1.Progress:=i;
end;
done:=true;
Application.OnIdle:=nil;
end;