Размер шрифта
-
+

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

Теперь перейдем к рассмотрению способа реализации этого приложения. В табл. 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.

Листинг 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

  //Обновим показания в текстовом поле

ShowDistance();

end;

end;

end;


Из данного листинга видно, что обновление показаний происходит при истинном (True) значении переменной isUpdating. Значение этой переменной устанавливается в False во время изменения масштаба, чтобы во время ввода значений в текстовые поля не выводились неправильные цифры (листинг 3.11).

Листинг 3.11. Активизация и деактивизация режима изменения масштаба
Страница 46