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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 110

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

procedure TForm1.Button1Click(Sender: TObject);

var

 A1, A2: Integer;

begin

 X := 2;

 A1 := X;

 Inc(A1, GetValueAndModifyX);

 X := 2;

 A2 := GetValueAndModifyX;

 Inc(A2, X);

 Label1.Caption := IntToStr(A1);

 Label2.Caption := IntToStr(A2);

end;

Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄, нСсмотря Π½Π° ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetValueAndModifyX, даст ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Π΅ значСния ΠΏΡ€ΠΈ любом порядкС вычислСния ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ², Ρ‚.ΠΊ. здСсь вычислСниС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² разнСсСно ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ, Π° порядок выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½.

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

Π”Ρ€ΡƒΠ³ΠΈΠ΅ компиляторы ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½ΠΎΠΉ порядок вычислСния ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ². Π’Π°ΠΊ, FreePascal вычисляСт ΠΈΡ… Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ΠΈ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, Ρ‚.Π΅. Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ А1 ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4, А2 β€” 3.

3.4.2. Π—Π°Ρ†ΠΈΠΊΠ»ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° TUpDown.OnClick ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅

Для дСмонстрации этого "ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ камня" Π½Π°ΠΌ потрСбуСтся ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ находится ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TUpDown со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ события OnClick (листинг 3.51, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ UpDownDlg Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС).

Листинг 3.51. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события OnClick ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° UpDown1

procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);

begin

 Application.MessageBox('Text', 'Caption', MB_OK);

end;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ UpDown1, откроСтся ΠΎΠΊΠ½ΠΎ с сообщСниСм (ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ниТнюю ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΎΠΊΠ½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TUpDown свойства Position ΠΈ Min Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ, поэтому Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π½Π° ниТнюю ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ измСнСнию значСния Position, ΠΈ событиС OnClick Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚; Ссли ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства Min ΠΈΠ»ΠΈ Position, Ρ‚ΠΎ Ρ‚ΠΎΡ‚ ΠΆΠ΅ эффСкт Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒΡΡ ΠΈ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ниТнюю ΠΊΠ½ΠΎΠΏΠΊΡƒ). Если Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ это ΠΎΠΊΠ½ΠΎ, Ρ‚ΠΎ Ρ‰Π΅Π»Ρ‡ΠΎΠΊ ΠΌΡ‹ΡˆΡŒΡŽ Π² любом мСстС Ρ„ΠΎΡ€ΠΌΡ‹ снова ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π½ΠΈΡŽ события OnClick ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΡŽ ΠΎΠΊΠ½Π°, ΠΈ Ρ‚Π°ΠΊ Π΄ΠΎ бСсконСчности: любой Ρ‰Π΅Π»Ρ‡ΠΎΠΊ ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΠ΅ Π² любом Π΅Π΅ мСстС Π±ΡƒΠ΄Π΅Ρ‚ снова ΠΈ снова ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ появлСнию сообщСния. Π­Ρ„Ρ„Π΅ΠΊΡ‚ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ ΠΈ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° вмСсто стандартного сообщСния Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ показываСтся любая другая модальная Ρ„ΠΎΡ€ΠΌΠ°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚ΠΎΡ‚ ΠΆΠ΅ эффСкт Π±ΡƒΠ΄Π΅Ρ‚, ΠΈ Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ события OnChanging ΠΈΠ»ΠΈ OnChangingEx вмСсто OnClick, Π½ΠΎ ΠΌΡ‹ Π΄Π°Π»Π΅Π΅ для опрСдСлСнности Π±ΡƒΠ΄Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ± OnClick.

Если этот ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΠΎ шагам Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅, Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ зацикливания Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚: OnClick вызываСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, любоС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π½ΠΈ ΠΊ ΠΊΠ°ΠΊΠΈΠΌ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ VCL ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ систСма ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° TUpDown Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π΄Π²Π° сообщСния: WM_LBUTTONDOWN ΠΈ WM_NOTIFY. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TUpDown ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΡ‚ΠΈΠ»ΡŒ csCaptureMouse β€” это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ WM_LBUTTONDOWN VCL Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΌΡ‹ΡˆΡŒ Π² монопольноС пользованиС для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.

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

МонопольноС использованиС ΠΌΡ‹ΡˆΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π»ΡŽΠ±Ρ‹Π΅ сообщСния, связанныС с ΠΌΡ‹ΡˆΡŒΡŽ, Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠ΅ΠΌΡƒ ΠΌΡ‹ΡˆΡŒ ΠΎΠΊΠ½Ρƒ Π΄Π°ΠΆΠ΅ Ссли Π΅Π΅ курсор Π² это врСмя находится Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΌΡ‹ΡˆΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ любая ΠΊΠ½ΠΎΠΏΠΊΠ°: Ρ‰Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΌΡ‹ΡˆΡŒΡŽ Π½Π°Π΄ Π»ΡŽΠ±ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Π½Π° экранС ΠΈ, Π½Π΅ отпуская клавиши ΠΌΡ‹ΡˆΠΈ, Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ курсор. Когда курсор Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΆΠΈΠΌΠ°Ρ‚ΡŒΡΡ, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° Π½Π΅Π΅ β€” снова Π½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒΡΡ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚Π²Π΅Π΄ΠΈΡ‚Π΅ курсор Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ ΠΊΠ½ΠΎΠΏΠΊΠΈ, отпуститС ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ΠΌΡ‹ΡˆΠΈ ΠΈ снова ΠΏΠΎΠ΄Π²Π΅Π΄ΠΈΡ‚Π΅ Π΅Π³ΠΎ ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠ΅. Кнопка Π½Π΅ наТмСтся. Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ° клавиша ΠΌΡ‹ΡˆΠΈ удСрТиваСтся Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ, ΠΌΡ‹ΡˆΡŒ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ, ΠΈ сообщСниС ΠΎΠ± отпускании клавиши ΠΌΡ‹ΡˆΠΈ пСрСдаётся ΠΊΠ½ΠΎΠΏΠΊΠ΅, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π½Π°Π΄ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠΊΠ½ΠΎΠΌ находится курсор. Π­Ρ‚ΠΎ позволяСт ΠΊΠ½ΠΎΠΏΠΊΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° отпусканиС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΌΡ‹ΡˆΠΈ, Π² Ρ‚ΠΎΠΌ числС ΠΈ Π·Π° Π΅Π΅ ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ.

Π—Π°Ρ‚Π΅ΠΌ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ событиС WM_NOTIFY, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ увСдомляСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠ°Π» Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° TUpDown. ИмСнно ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ этого сообщСния VCL Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ событиС TUpDown.OnClick, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ открываСтся модальноС ΠΎΠΊΠ½ΠΎ. Всё это происходит ΠΎΡ‡Π΅Π½ΡŒ быстро, поэтому ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ отпускаСт Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° модальноС ΠΎΠΊΠ½ΠΎ ΡƒΠΆΠ΅ оказалось Π½Π° экранС. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ сообщСниС WM_LBUTTONUP Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²ΡˆΠ΅Π³ΠΎΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Ссли ΠΌΡ‹ΡˆΡŒ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ Π½Π°Π΄ Π½ΠΈΠΌ, Π»ΠΈΠ±ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΠΈΠΊΡƒΠ΄Π° Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚, Ссли ΠΌΡ‹ΡˆΡŒ Π±Ρ‹Π»Π° Π²Π½Π΅ модального ΠΎΠΊΠ½Π°. На врСмя сущСствования модального ΠΎΠΊΠ½Π° систСма "Π·Π°Π±Ρ‹Π²Π°Π΅Ρ‚" ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ΡˆΡŒ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π° для монопольного использования, Π½ΠΎ "вспоминаСт" ΠΎΠ± этом, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ модальноС ΠΎΠΊΠ½ΠΎ закрываСтся. МонопольноС использованиС ΠΌΡ‹ΡˆΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ TUpDown Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сообщСния WM_LBUTTONUP, Π½ΠΎ ΠΎΠ½ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ сказано Ρ€Π°Π½Π΅Π΅, Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚, поэтому послС закрытия ΠΎΠΊΠ½Π° ΠΌΡ‹ΡˆΡŒ остаСтся Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΠΎΠΉ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ любоС Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ воспринимаСтся систСмой ΠΊΠ°ΠΊ относящССся ΠΊ UpDown1, ΠΈ снова ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний WM_LBUTTONDOWN ΠΈ WM_NOTIFY, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ описанным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’Π°ΠΊ получаСтся ΠΏΠΎΡ€ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΡ€ΡƒΠ³, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄Π°. Π­Ρ‚ΠΎΡ‚ ΠΊΡ€ΡƒΠ³ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·ΠΎΡ€Π²Π°Π½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отмСняСт монопольноС использованиС ΠΌΡ‹ΡˆΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

Π’ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ Π²ΠΈΠ½ΠΎΠ²Π°Ρ‚Π° VCL, которая Π·Π°Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ TUpDown ΡΡ‚ΠΈΠ»ΡŒ csCaptureMouse. Π”Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ рСализуСтся Π½Π΅ срСдствами VCL, β€” это стандартноС ΠΎΠΊΠ½ΠΎ систСмного класса UPDOWN_CLASS, Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TUpDown β€” это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° для Π½Π΅Π³ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹ ΠΌΡ‹ΡˆΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ самой систСмой. VCL Π½Π΅Ρ‚ Π½ΡƒΠΆΠ΄Ρ‹ Π² это Π²ΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒΡΡ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ csCaptureMouse ΠΈΠ· списка стилСй ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. ДСлаСтся это Ρ‚Π°ΠΊ:

UpDown1.ControlStyle := UpDown1.ControlStyle - [csCaptureMouse];

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ события OnCreate Ρ„ΠΎΡ€ΠΌΡ‹), ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π·Π°Ρ†ΠΈΠΊΠ»ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ исчСзнут (Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ UpDownDlg эта строка Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π°).

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² Windows прСдусмотрСно ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ сообщСниС β€” WM_CANCELMODE, β€” посылаСмоС ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Ρ‚ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ ΠΌΡ‹ΡˆΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ Π΅Π΅ освободило. Один ΠΈΠ· способов Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ β€” Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² UpDown1 ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° этого сообщСния (для этого ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ наслСдника TUpDown ΠΈΠ»ΠΈ ΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ свойством WindowProc β€” см. Ρ€Π°Π·Π΄. 1.1.8), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ Π·Π°Ρ…Π²Π°Ρ‚ ΠΌΡ‹ΡˆΠΈ. ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ этого ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° β€” Ρ‚ΠΎΠΆΠ΅ явная ошибка VCL.

3.4.3. Access violation ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΡ‹ с ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ WndProc

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ этот "ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹ΠΉ камСнь", создадим ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, содСрТащий Π΄Π²Π΅ Ρ„ΠΎΡ€ΠΌΡ‹: Π³Π»Π°Π²Π½ΡƒΡŽ Form1 ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Form2. Π’ Form1 Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Form2.

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ напишСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события OnClose Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ устанавливал ΠΏΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΡŽ дСйствиС caFree. Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΠ»Π΅ строкового Ρ‚ΠΈΠΏΠ°, ΠΏΠ΅Ρ€Π΅ΠΊΡ€ΠΎΠ΅ΠΌ конструктор ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ WndProc Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ выглядСл ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (листинг 3.52, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ CloseAV Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚- дискС).

Листинг 3.52. Код класса TForm2

type

 TForm2 = class(TForm)

  procedure FormClose(Sender: TObject; var Action: TCloseAction);

 private

  S: string;

 protected

  procedure WndProc(var Message: TMessage); override;

 public

  constructor Create(AOwner: TComponent); override;

 end;

.... 


constructor TForm2.Create(AOwner: TComponent);

begin

 S := 'abc';

 inherited;

end;


procedure TForm2.WndProc(var Message: TMessage);

begin

 inherited;

 S[2] := 'x'; { * }

end;


procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);

begin

 Action := caFree;

end;

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² конструкторС сначала присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ полю S, ΠΈ лишь ΠΏΠΎΡ‚ΠΎΠΌ вызываСтся унаслСдованный конструктор. Π­Ρ‚ΠΎ сдСлано ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ S содСрТит ΠΏΡƒΡΡ‚ΡƒΡŽ строку, Ρ‚.Π΅. nil, Π° ΡƒΠΆΠ΅ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ унаслСдованного конструктора ΠΎΠΊΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сообщСния, для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ WndProc. Если Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ S Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ nil, ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ символу строки Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Access violation. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΅Ρ‰Π΅ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ унаслСдованного конструктора ΠΏΠΎΠ»Π΅ S Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ подходящСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Запустим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ попытаСмся Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ. Π’ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Access Violation: Write of address 00000001. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π² строкС, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΉ {*}. ΠŸΡ€ΠΈ этом Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ манипуляции с ΠΎΠΊΠ½ΠΎΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚.