My guess is that you only update iFrameRate every second or so I would do it like this:

[pascal]
iMoveSpeed: single = 1; //Units/second
fDeltaTime: single; //fraction of second

LastTick, Tick: Cardinal; //Just use GetTickCount. It's precise enough and you don't get problems with changing frequencies
[/pascal]

Every frame before calculating positions do:
[pascal]
Tick := GetTickCount;
fDeltaTime := (Tick-LastTick)/1000;
LastTick := Tick;
[/pascal]

[pascal]
if (buffer[DIK_A] and $80) <> 0 then begin
Cam.x := Cam.x + cos(Cam.RotX + PI/2) * (iMoveSpeed * fDeltaTime);
Cam.z := Cam.z + sin(Cam.RotX + PI/2) * (iMoveSpeed * fDeltaTime);
end else if (buffer[DIK_D] and $80) <> 0 then begin
Cam.x := Cam.x + cos(Cam.RotX - PI/2) * (iMoveSpeed * fDeltaTime);
Cam.z := Cam.z + sin(Cam.RotX - PI/2) * (iMoveSpeed * fDeltaTime);
end;

if (buffer[DIK_W] and $80) <> 0 then begin
Cam.x := Cam.x + cos(Cam.RotX) * (iMoveSpeed * fDeltaTime);
Cam.y := Cam.y - cos(Cam.RotY + PI/2) * (iMoveSpeed * fDeltaTime);
Cam.z := Cam.z + sin(Cam.RotX) * (iMoveSpeed * fDeltaTime);
end else if (buffer[DIK_S] and $80) <> 0 then begin
Cam.x := Cam.x - cos(Cam.RotX) * (iMoveSpeed * fDeltaTime);
Cam.y := Cam.y + cos(Cam.RotY + PI/2) * (iMoveSpeed * fDeltaTime);
Cam.z := Cam.z - sin(Cam.RotX) * (iMoveSpeed * fDeltaTime);
end;
[/pascal]