Таблица 3.1. Параметры элементов управления формы, показанной на рис. 3.1
В коде листинга 3.8 объявляются переменные (члены класса TForm1) и методы, добавленные вручную.
Листинг 3.8. Форма для измерения пробега указателя
type
TForm1 = class(TForm)
...
private
isUp dating: Boolean; //Если равен False, то показания в txtDistance
//не обновляются
lastPos: TPoint; //Координаты указателя во время прошлого замера
distance: Real; //Пройденное расстояние в пикселах
procedure StartUpdating();
procedure StopUpdating();
procedure ShowDistance();
end;
Суммарное расстояние в пикселах, пройденное указателем, сохраняется в переменной distance. Ниже представлен способ перевода этого расстояния в метры (листинг 3.9).
Листинг 3.9. Перевод расстояния в метры с учетом масштаба
procedure TForm1.ShowDistance();
var
scale: Real;
distanceMetters: Real;
begin
//Пересчитываем текущий пробег в метры и показываем его
//в текстовом поле
//..определяем масштаб для перевода измерений в метры
scale:= 0.001 * StrToInt(txtWidth.Text) / Shape1.Width;
//..подсчитываем расстояние с учетом масштаба
distanceMetters:= scale * distance;
//..округляем до трех знаков (мм) и показываем
distanceMetters:= Int(distanceMetters * 1000) * 0.001;
txtDistance.Text:= FloatToStr(distanceMetters);
end;
Главная процедура приложения – обработчик для таймера Timer1. Таймер срабатывает с максимальной для него частотой (около 18 раз в секунду). Текст обработчика Timer1Timer приведен в листинге 3.10.
Листинг 3.10. Подсчет разницы между положениями указателя мыши
procedure TForm1.Timer1Timer(Sender: TObject);
var
curPos: TPoint;
delta: Real;
begin
if (curPos.X <> lastPos.X) or (curPos.Y <> lastPos.Y) then
begin
GetCursorPos(curPos);
//Вычисляем разницу между текущим и прошлым положением мыши
delta:= Sqrt(Sqr(curPos.X – lastPos.X) + Sqr(curPos.Y – lastPos.Y));
distance:= distance + delta;
//Не забываем сохранить новые координаты указателя
lastPos:= curPos;
if isUpdating then
begin
//Обновим показания в текстовом поле