Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чиртик Александр - Delphi. Трюки и эффекты ltrs...rtf
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
964.52 Кб
Скачать

Листинг 3.8. Форма для измерения пробега указателя

type

TForm1 = class(TForm)

private

isUpdating: 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;

В приведенном расчете нет ничего сложного, как, собственно, нет ничего сложного и во всем примере. Главная процедура приложения – обработчик для таймера Timerl. Таймер срабатывает с максимальной для него частотой (не 1 мс, конечно, но где‑то 18 раз в секунду). Текст обработчикаТ1тег1Т1тег приводится в листинге 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;

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

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

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;

Процедуры StartUpdating и StopUpdating скрывают действия, которые необходимо произвести для остановки или возобновления отображения пройденного расстояния в текстовом поле. В нашем примере они выглядят крайне просто (листинг 3.12).

Листинг 3.12. Включение/выключение обновления результатов измерения

procedure TForm1.StartUpdating();

begin

//Включаем обновление показаний в текстовом поле

isUpdating := True;

end;

procedure TForm1.StopUpdating();

begin

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

isUpdating := False;

end;

В завершение остается реализовать код инициализации при запуске программы и обработчик события Click для кнопки cmbClear (листинг 3.13).