Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 14

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ΠΎΠΎΠ±Ρ‰Π΅, Π·Π°Π΄Π°Π½ΠΈΠ΅ ограничСния Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ указатСля ΠΌΡ‹ΡˆΠΈ Π½Π΅ считаСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ Ρ‚ΠΎΠ½ΠΎΠΌ. ΠŸΠΎΡ‚ΠΎΠΌΡƒ для использования Ρ‚Π°ΠΊΠΎΠΉ возмоТности Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ вСскиС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹.

ИзмСнСниС назначСния ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΌΡ‹ΡˆΠΈ

Как извСстно, опСрационная систСма Windows Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π·Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ ΡˆΠΈΡ€ΠΎΠΊΠΎΠΌΡƒ ΠΊΡ€ΡƒΠ³Ρƒ людСй. Π‘ΠΎ стороны Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π³Π»ΡƒΠΏΠΎ Π½Π΅ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ простой Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ манипулятора Β«ΠΌΡ‹ΡˆΡŒΒ» ΠΊ ΠΏΡ€Π°Π²ΡˆΠ΅ ΠΈΠ»ΠΈ лСвшС. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΌΡ‹ΡˆΡŒ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊ Ρ‚Π°ΠΊΠΈΠΌ различиям Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅: ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅ Π½Π°Π΄ΠΎ, достаточно ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΌΡ‹ΡˆΠΈ.

Как ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΌΡ‹ΡˆΠΈ, дСмонстрируСт листинг 3.7.

...

Листинг 3.7.

ИзмСнСниС назначСния ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΌΡ‹ΡˆΠΈ

procedure TForm1.Button1Click(Sender: TObject);

begin

//МСняСм мСстами Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΌΡ‹ΡˆΠΈ

SwapMouseButton(True);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

//ВосстанавливаСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΌΡ‹ΡˆΠΈ

SwapMouseButton(False);

end;

Π’ листингС 3.7 Π½Π΅ учитываСтся Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ инвСрсия ΠΌΡ‹ΡˆΠΈ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСна ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Π·Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ лСвша). Π§Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Π±Ρ‹Π»Π° Π»ΠΈ Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° инвСрсия ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ ΠΌΡ‹ΡˆΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ SwapMouseButton. Если это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΎΡ‚ нуля, Ρ‚ΠΎ Ρ€Π°Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΌΡ‹ΡˆΠΈ Π±Ρ‹Π»ΠΈ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹.

ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ расстояния, ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΌΡ‹ΡˆΠΈ

Рассмотрим Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая носит скорСС ΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, Ρ‡Π΅ΠΌ практичСский Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€. Она ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, сколько ΠΆΠ΅ ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (Π² Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎΠΌ смыслС) ΠΏΡ€ΠΎΠ±Π΅Π³Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ Π·Π° врСмя Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹ прилоТСния ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рис. 3.1.

Рис. 3.1. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° измСрСния ΠΏΡ€ΠΎΠ±Π΅Π³Π° указатСля ΠΌΡ‹ΡˆΠΈ

ИспользованиС Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΡ€Π°ΠΉΠ½Π΅ просто: сразу послС запуска ΠΎΠ½Π° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½ΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΌΡ‹ΡˆΠΈ расстояниС Π² пиксСлах. НиТняя Π³Ρ€ΡƒΠΏΠΏΠ° элСмСнтов управлСния Π½ΡƒΠΆΠ½Π° для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ расстояния Π² ΠΌΠ΅Ρ‚Ρ€Π°Ρ…. ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π± становятся Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ Π΄Π²Π° тСкстовых поля (для Π²Π²ΠΎΠ΄Π° ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ высоты ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°). Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π»Π° ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½ΠΎΠ΅ расстояниС, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈΠ½Π΅ΠΉΠΊΠΎΠΉ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ ΡˆΠΈΡ€ΠΈΠ½Ρƒ Π±Π΅Π»ΠΎΠ³ΠΎ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΈ ввСсти ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π² ΠΌΠΌ) Π² тСкстовоС ΠΏΠΎΠ»Π΅. ΠŸΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ этой ΠΊΠ½ΠΎΠΏΠΊΠΈΠ²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ значСния ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ, ΠΈ с этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° показания ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ расстояния пСрСводятся Π² ΠΌΠ΅Ρ‚Ρ€Ρ‹ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ приступим ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого прилоТСния. Π’ Ρ‚Π°Π±Π». 3.1 приводятся свСдСния ΠΏΠΎ настройкС элСмСнтов управлСния, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Ρ€Π°ΠΌΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ статичСскими надписями.

Π’Π°Π±Π»ΠΈΡ†Π° 3.1. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ элСмСнтов управлСния Ρ„ΠΎΡ€ΠΌΡ‹, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π½Π° рис. 3.1 Π’ листингС 3.8 приводятся объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (Ρ‡Π»Π΅Π½ΠΎΠ² класса TForml) ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ....

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

...

Листинг 3.13.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΡ€ΠΈ запускС ΠΈ ΠΊΠΎΠ΄ сброса счСтчика

procedure TForm1.FormCreate(Sender: TObject);

begin

//Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΌΡ‹ΡˆΠΈ

GetCursorPos(lastPos);

StartUpdating();

end;

procedure TForm1.cmbClearClick(Sender: TObject);

begin

//БбрасываСм счСтчик ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ расстояния

distance := 0;

GetCursorPos(lastPos); //НачинаСм отсчСт с Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ

//ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ указатСля

ShowDistance();

end;

Π’ΠΎΡ‚, собствСнно, ΠΈ всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ рассматриваСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΡΡ‚Π°Π΅Ρ‚ΡΡ лишь ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ способ установки ΠΌΠ°ΡΡˆΡ‚Π°Π±Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ‚Π°ΠΊΠΈΡ… Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠ², ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ искаТСний ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈΠ»ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ. Π§Π°Ρ‰Π΅ всСго это Ρ‚Π°ΠΊΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ изобраТСния ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ ΠΏΠΎΠ΄Ρ‡ΠΈΠ½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΈ 4:3 (640 Ρ… 480, 800 Ρ… 600 ΠΈ Ρ‚. Π΄.). ΠŸΡ€ΠΈ этом Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ пропорциями Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ экран ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°.

ΠŸΠΎΠ΄ΡΠ²Π΅Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ элСмСнтов управлСния

Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ рассмотрим нСслоТный, Π½ΠΎ достаточно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Β«ΠΆΠΈΠ²Ρ‹ΠΌΒ» интСрфСйс прилоТСния: ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ внСшнСго Π²ΠΈΠ΄Π° элСмСнтов управлСния ΠΏΡ€ΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΈ Π½Π° Π½ΠΈΡ… указатСля ΠΌΡ‹ΡˆΠΈ.

Π’ листингС 3.14 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ надпись ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΉ Π½Π° гипСрссылку (для большСго эффСкта для Ρ‚Π°ΠΊΠΎΠΉ надписи ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ свойство Cursor Ρ€Π°Π²Π½Ρ‹ΠΌ crHandPoint Π½Π° этапС проСктирования Ρ„ΠΎΡ€ΠΌΡ‹).

...

Листинг 3.14.

ΠŸΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π° надписи

procedure TForm1.lblUnderlineMouseEnter(Sender: TObject);

begin

lblUnderline.Font.Style := [fsUnderline];

lblUnderline.Font.Color := RGB(0, 0, 255);

end;

procedure TForm1.lblUnderlineMouseLeave(Sender: TObject);

begin

lblUnderline.Font.Style := [];

lblUnderline.Font.Color := RGB(0, 0, 0);

end;

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события Click для надписи, ΠΈ получится довольно правдоподобная гипСрссылка, ΠΏΡ€Π°Π²Π΄Π°, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ любоС дСйствиС.

НачСртаниС ΡˆΡ€ΠΈΡ„Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ для стандартной ΠΊΠ½ΠΎΠΏΠΊΠΈ. Как это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 3.15.

...

Листинг 3.15.

ИзмСнСниС начСртания ΡˆΡ€ΠΈΡ„Ρ‚Π°

procedure TForm1.cmbItalicBoldMouseMove(Sender: TObject;

Shift: TShiftState; X, Y: Integer);

begin

cmbItalicBold.Font.Style := [fsItalic, fsBold];

end;

procedure TForm1.lblItalicMouseEnter(Sender: TObject);

begin

lblItalic.Font.Style := [fsItalic];

end;

Π’ листингС 3.15 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ MouseMove для ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ, ΠΊ Π²Π΅Π»ΠΈΠΊΠΎΠΌΡƒ соТалСнию, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ co6biTHftMouseEnter nMouseLeave для Π½Π΅Π΅ (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, с Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Standard) Π½Π΅ прСдусмотрСны.

3.2. ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°

ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° являСтся основным срСдством для Π²Π²ΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, поэтому Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ стороной ΠΈ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ‚Π°ΠΊ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠ»ΠΈ Π½Π΅ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ возмоТности Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΠΉ.