Two Ways....
1. using oncreate and onactivate 
create a global flag or even 2 
 var
   aInitialized:boolean;
Set the flag to false in the oncreate handler.
aInitialized := false; //we have not performed our special code yet.
Inside onActivate have something like this
if not aInitialized then begin
//our one time init code. special stuff or whatever
If successful then set aInitialized := true else aInitialized  := false 
end;
And how to close it without showing anything just add your terminate to the formshow.  of course you need to test for some reason to close.. :)
Procedure Tmaindlg.FormShow(Sender: TObject);
Begin
  If (shareware1.Sharestatus = ssExpired) or (shareware1.Sharestatus = ssTampered) Then
    application.Terminate;
End;
In your DPR you will need to add a splash screen type effect. In my case I am showing progress as the application starts.  You could also just show the form and get some data.  
Code from the splash.pas
Procedure tsplashform.bumpit(str: string);
Begin
  label2.Caption := str;
  gauge1.progress := gauge1.progress + trunc(100 / items);
  update;
  If gauge1.progress >= items * (trunc(100 / items)) Then Close;
End;
Program Billing;
uses
  Forms,
  main in 'main.pas' {maindlg},
  Splash in 'splash.pas' {splashform};
{$R *.RES}
Begin
  Application.Initialize;
  Application.Title := 'Billing Manager';
  SplashForm := TSplashForm.Create(Application);
  SplashForm.Show;
  SplashForm.Update;
  splash.items := 5;
  SplashForm.bumpit('Loading Main...');
  Application.CreateForm(Tmaindlg, maindlg);
  SplashForm.bumpit('Loading Datamodule...');
  Application.CreateForm(TfrmSingleWorkorder, frmSingleWorkorder);
  SplashForm.bumpit('Loading SQL Builder...');
  Application.CreateForm(TDm, Dm);
  SplashForm.bumpit('Loading Security...');
  Application.CreateForm(TSQLForm, SQLForm);
  SplashForm.bumpit('Loading Reports...');
  Application.CreateForm(Tpickrptdlg, pickrptdlg);
  Application.Run;
End.