Программирование в Delphi. Трюки и эффекты. Александр Чиртик
Чтение книги онлайн.

Читать онлайн книгу Программирование в Delphi. Трюки и эффекты - Александр Чиртик страница 33

СКАЧАТЬ являющихся рамками или статическими надписями.

Таблица 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. Активизация и деактивизация режима изменения масштаба

      procedure TForm1.cmbScaleClick(Sender: TObject);

      begin

      if cmbScale.Caption = 'Изменить масштаб' then

      begin

      //Начинаем СКАЧАТЬ