Программирование в Delphi. Трюки и эффекты - страница 52

Шрифт
Интервал


Рис. 3.1. Программа для измерения пробега указателя мыши


Использование этой программы крайне просто: сразу после запуска она начинает измерять пройденное указателем мыши расстояние в пикселах. Нижняя группа элементов управления формы нужна для правильного вывода пройденного расстояния в метрах. При нажатии кнопки Изменить масштаб становятся активными два текстовых поля (предназначенных для ввода ширины и высоты прямоугольника). Чтобы программа правильно преобразовывала пройденное расстояние, нужно линейкой измерить ширину белого прямоугольника и ввести полученное значение (в миллиметрах) в текстовое поле. При повторном нажатии кнопки Изменить масштаб введенные значения принимаются, и с этого момента показания пройденного расстояния начинают переводиться в метры с учетом текущего разрешения и размера монитора.

Теперь перейдем к рассмотрению способа реализации этого приложения. В табл. 3.1 приведены сведения о настройке элементов управления, не являющихся рамками или статическими надписями.

Таблица 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.