Here is a little test program. I have noticed that there is a minimum interval that TTimer is able to run, and that seems to be about 15. Anything less than interval 15 is redundant.
type
{ TForm1 }
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
delay, second: TTime;
public
end;
var Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
second:=encodetime(0, 0, 1, 0);
delay:=Now+second;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
tag:=tag+1;
if now>delay then begin
delay:=delay+second;
caption:=inttostr(tag);
tag:=0;
end;
end;
It keeps printing 64 ticks per second, when i have TTimer interval set to 1. 1000/64 = 15,625.
Anyway, for higher precision you need another timer (like some suggest Epictimer), or TThread with sleep(1). Without it a thread will max a cpu core, which is something TTimer will never do.
Also for TTimer a good strategy is to keep it running at the minimum interval at all times, never stopping it. Just handle all the timings with same code, and use boolean states determining if they need to do something or not.