Я думаю, что вы уже ответили на большинство вопросов. Вы знаете, что хотите использовать масштаб журнала. Таким образом, вы должны иметь одинаковые интервалы между отметками 0,01, 0,1, 1,0, 10,0, 100,0, скажем.
Вместо полосы прокрутки вы должны использовать трекбар. Значения на панели треков находятся в лог-масштабе Таким образом, вы хотите, чтобы что-то вроде 0 соответствовало 0,01, 100 соответствовало 0,1, 200 соответствовало 1,0 и так далее. Это дает вам трекбар с минимумом 0, максимумом 400 и начальной позицией 200, то есть 1,0.
Теперь осталось сопоставить положение трек-бара с масштабом. Вам нужно Scale(0)
, чтобы равняться 0,01, Scale(100)
, чтобы равняться 0,1 и так далее. Вы делаете это, используя возведение в степень до степени 10.
function Scale(const Position: Integer): Double;
var
Exponent: Double;
begin
Exponent := (Position-200)/100.0;
Result := Power(10.0, Exponent);
end;
Чтобы пойти другим путем, нужно взять логарифмы и переставить.
function Position(const Scale: Double): Integer;
begin
Result := Round(100.0*Log10(Scale)) + 200;
end;
Естественно, если выбранные цифры и минимальные / максимальные значения не подходят, вы можете легко перенастроить их.