unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    txtDistance: TEdit;
    GroupBox1: TGroupBox;
    Shape1: TShape;
    cmbClear: TButton;
    Label2: TLabel;
    txtWidth: TEdit;
    cmbScale: TButton;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure cmbClearClick(Sender: TObject);
    procedure cmbScaleClick(Sender: TObject);
  private
    isUpdating: Boolean;
    lastPos: TPoint;     //Координаты курсора во время прошлого замера
    distance: Real;      //Пройденное расстояние в пикселях
    procedure StartUpdating();
    procedure StopUpdating();
    procedure ShowDistance();
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StartUpdating();
begin
  //Включаем обновление показаний в текстовом поле
  isUpdating := True;
end;

procedure TForm1.StopUpdating();
begin
  //Отключаем обновление показаний в текстовом поле
  isUpdating := False;
end;

procedure TForm1.ShowDistance();
var
  scale: Real;
  distanceMetters: Real;
begin
  //Пересчитываем текущий пробег в метры и показываем его в
  //текстовом поле
  //..определяем масштаб для перевода измерений в метры
  scale := 0.001 * StrToInt(txtWidth.Text) / Shape1.Width;
  //..подсчитываем расстояние с учетом масштаба
  distanceMetters := scale * distance;
  //..округляем до 3 знаков (мм) и показываем
  distanceMetters := Int(distanceMetters * 1000) * 0.001;
  txtDistance.Text := FloatToStr(distanceMetters);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Инициализируем координаты мыши
  GetCursorPos(lastPos);
  StartUpdating();
end;

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
      //Обновим показания в текстовом поле
      ShowDistance();
    end;
  end;
end;

procedure TForm1.cmbClearClick(Sender: TObject);
begin
  //Сбрасываем счетчики пройденного расстояния
  distance := 0;
  GetCursorPos(lastPos); //Начинаем отсчет с текущей позиции курсора
  ShowDistance();
end;

procedure TForm1.cmbScaleClick(Sender: TObject);
begin
  if cmbScale.Caption = 'Изменить масштаб' then
  begin
    //Начинаем изменение масштаба
    StopUpdating();
    cmbScale.Caption := 'Принять масштаб';
    txtWidth.Enabled := True;
  end
  else
  begin
    //Заканчиваем изменение масштаба
    txtWidth.Enabled := False;
    cmbScale.Caption := 'Изменить масштаб';
    StartUpdating();
  end;
end;

end.
