Честно говоря, по описанию проблемы не понял ничего, кроме того, что пытаешься нарисовать линейку. Попытаюсь ответить исходя из того, что понял (то есть названия).
Код:
const step = 3.1415926535; // шаг линейки в пикселях
const len = 100500; // длина линейки в шагах
const rlen = len * step; // длина линейки в пикселях
...
var x: real;
ix: integer;
...
x := 0;
while x < rlen do
begin
ix := Round(x);
Canvas.MoveTo(ix, 0);
Canvas.LineTo(ix, 10);
x := x + step;
end;
Таким образом нарисуем деления без накапливающихся погрешностей. Если надо делать более длинные отметки через каждые N делений - то добавится еще один if и еще одна константа.
Можно ускорить код, если делать цикл for ... to по делениям, а не по координате. Integer'ы сравниваются быстрее.
Если ответил совсем не в тему - сформулируй, пожалуйста, яснее свой вопрос.