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

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

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим, ΠΊΠ°ΠΊ VCL ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСния. Как ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано Ρ€Π°Π½Π΅Π΅, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса Ρ„ΠΎΡ€ΠΌΡ‹ VCL рСгистрируСт ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΉ класс, Π° всС ΠΎΠΊΠ½Π°, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΎΠΊΠΎΠ½Π½ΠΎΠΌΡƒ классу, ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π»ΠΎΠ³ΠΈΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ VCL Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ события ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»ΠΈΡΡŒ Ρ‚Π΅ΠΌ экзСмпляром oΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инкапсулируСт ΠΎΠΊΠ½ΠΎ-адрСсат. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ сообщСниС Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ экзСмпляру класса VCL. VCL Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту Π·Π°Π΄Π°Ρ‡Ρƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. ΠœΠΎΠ΄ΡƒΠ»ΡŒ Classes содСрТит Π½Π΅Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ MakeObjectInstance, ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Ρ‚Π°ΠΊ:

type TWndMethod = procedure(var Message: TMessage) of object;

function MakeObjectInstance(Method: TWndMethod): Pointer;

Π’ΠΈΠΏ TMessage Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ сообщСнии. ВсС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ VCL-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², связанныС с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ сообщСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ этот Ρ‚ΠΈΠΏ (Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ‹ рассмотрим Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ).

Ѐункция MakeObjectInstance динамичСски Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅Π΅ (ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, любоС VCL-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ содСрТит ΡΠ°ΠΌΠΎΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉΡΡ ΠΊΠΎΠ΄). Π—Π°Π΄Π°Ρ‡Π° этой динамичСски созданной ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ MakeObjectInstance (Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΊΠΎΠ½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, сформированныС этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΌ, ΠΌΠ΅Ρ‚ΠΎΠ΄ MainWndProc ΠΊΠ°ΠΊΠΎΠ³ΠΎ экзСмпляра класса ΠΎΠ½ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚).

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ экзСмпляр ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° создаСт свою ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, которая ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСния Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ MainWndProc. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° эту ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ записываСтся Π² ΠΏΠΎΠ»Π΅ FObjectInstance. Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, ΠΏΡ€ΠΈ рСгистрации ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ класса Π² качСствС ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ указываСтся InitWndProc, которая ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ сообщСния создаСт подкласс, ΠΈ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ назначаСтся Ρ‚Π°, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ хранится Π² ΠΏΠΎΠ»Π΅ FObjectInstance, Ρ‚.Π΅. функция, созданная с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ MakeObjectInstance (см. листинг 1.12). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ экзСмпляр ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ свою ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСния Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ MainWndProc.

MainWndProc β€” это Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ тСхничСских вопросов: ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ "мусора", ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π³ΠΎΡΡ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сообщСния ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. БобствСнно ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСния ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ свойство WindowProc. Π­Ρ‚ΠΎ свойство ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ TWndMethod ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ WndProc. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π΅ измСнял значСния свойства WindowProc, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ сообщСния занимаСтся WndProc.

ΠœΠ΅Ρ‚ΠΎΠ΄ WndProc ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ VCL. ΠžΡΠΎΠ±Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ WndProc ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сообщСния ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ: ΠΎΠ½ слСдит, Π² Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ "ΠΌΡ‹ΡˆΠΈΠ½Ρ‹Ρ…" сообщСний, ΠΈ Ссли этот ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ отличаСтся ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π² Ρ‡ΡŒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΏΠΎΠΏΠ°Π»ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ сообщСниС, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ сообщСния даСтся ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ сообщСниС CM_MOUSELEAVE, Π° Π½ΠΎΠ²ΠΎΠΌΡƒ β€” сообщСниС CM_MOUSENTER. Π­Ρ‚ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π½Π° ΠΏΡ€ΠΈΡ…ΠΎΠ΄ ΠΈ ΡƒΡ…ΠΎΠ΄ ΠΌΡ‹ΡˆΠΈ (Π² частности, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ событий OnMouseEnter ΠΈ OnMouseExit). ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ способа отслСТивания ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° ΠΈ ΡƒΡ…ΠΎΠ΄Π° ΠΌΡ‹ΡˆΠΈ вмСсто использования систСмных сообщСний WM_MOUSEHOVER ΠΈ WM_MOUSELEAVE связана с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ систСмныС сообщСния ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠΊΠ½Π°ΠΌΠΈ, Π° VCL отслСТиваСт ΠΏΡ€ΠΈΡ…ΠΎΠ΄ ΠΈ ΡƒΡ…ΠΎΠ΄ ΠΌΡ‹ΡˆΠΈ ΠΈ Π½Π° Π½Π΅ΠΎΠΊΠΎΠ½Π½Ρ‹Π΅ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, WM_MOUSELEAVE Π² WndProc Ρ‚ΠΎΠΆΠ΅ слуТит Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ срСдством ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΡƒΡ…ΠΎΠ΄Π° ΠΌΡ‹ΡˆΠΈ.

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

ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ здСсь способ отслСТиваниС ΡƒΡ…ΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° ΠΌΡ‹ΡˆΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½, начиная с BDS 2006. Π’ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях Delphi Π·Π° это ΠΎΡ‚Π²Π΅Ρ‡Π°Π» ΠΌΠ΅Ρ‚ΠΎΠ΄ Application.Idle, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠΌΠ½ΠΈΠΌ, вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π° ΠΊΠΎΠ³Π΄Π° Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π΅Ρ‚ сообщСний. Из-Π·Π° этого ΠΈΠ½ΠΎΠ³Π΄Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ быстром Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΌΡ‹ΡˆΡŒΡŽ) события ΡƒΡ…ΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° ΠΌΡ‹ΡˆΠΈ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Π»ΠΈΡΡŒ, Π½Π°Ρ€ΡƒΡˆΠ°Ρ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² BDS 2006 способ контроля ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° ΠΈ ΡƒΡ…ΠΎΠ΄Π° ΠΌΡ‹ΡˆΠΈ Π±Ρ‹Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½, ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° это Π²ΠΎΠ·Π»ΠΎΠΆΠ΅Π½Π° Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ TWinControl.WndProc. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ нСдостатка β€” ΠΏΠΎΡ‚Π΅Ρ€ΠΈ событий, Π½ΠΎ ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠ»ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ ΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° "ΠΌΡ‹ΡˆΠΈΠ½Ρ‹Ρ…" сообщСний Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ это сдСлаСт ΠΌΠ΅Ρ‚ΠΎΠ΄ WndProc, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ возмоТности отслСТивания ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° ΠΈ ΡƒΡ…ΠΎΠ΄Π° ΠΌΡ‹ΡˆΠΈ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° проявляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ программистом ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… осмыслСнных дСйствий ΠΏΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΡŽ ΠΊΠΎΠ΄Π° Π² ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, поэтому ΠΎΠ½Π° Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°, Ρ‡Π΅ΠΌ Ρ‚Π° ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ.

Бобытия ΠΌΡ‹ΡˆΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ WndProc диспСтчСризуСт ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π±Π΅Π· ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DispatchMessage. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ DispatchMessage ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ сообщСниС Ρ‚ΠΎΠΌΡƒ ΠΎΠΊΠΎΠ½Π½ΠΎΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния систСмы. Однако с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния VCL этот ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ для Π½Π΅ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΈ Ссли сообщСниС ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ связано с ΠΈΡ… ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ, Ρ‚ΠΎ ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π½Π΅ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ, Π° Π½Π΅ Π΅Π³ΠΎ ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΌ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ. DispatchMessage Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎ Π½Π΅ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… Π½Π΅ "Π·Π½Π°Π΅Ρ‚" ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠΌ сообщСния, поэтому Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ VCL ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ свой способ. Π’Π΅ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ WndProc Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ (Π° ΠΈΡ… β€” ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ), ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ Dispatch, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ объявлСн ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² классС TObject. На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ странным, Ρ‡Ρ‚ΠΎ Π² самом Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°ΡΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ…. Π­Ρ‚Π° ΡΡ‚Ρ€Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Delphi встроили ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний нСпосрСдствСнно Π² язык. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса, описанныС с Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ message, слуТат ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний. Бинтаксис описания Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

procedure <Name>(var Message: <TMsgType>); message <MsgNumber>;

<MsgNumber> β€” это Π½ΠΎΠΌΠ΅Ρ€ сообщСния, для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄. Имя ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ, Π½ΠΎ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΎΠ½ΠΎ совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ константы сообщСния Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ Π²Ρ‹Π±Ρ€Π°Π½ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ рСгистр символов ΠΈ отсутствуСт символ "_" (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠ΅Ρ‚ΠΎΠ΄ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ WM_SIZE Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ WMSize).

Π’ качСствС Ρ‚ΠΈΠΏΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° <TMsgType> компилятор Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ любой Ρ‚ΠΈΠΏ, Π½ΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ использованиС Ρ‚ΠΈΠΏΠ° TMessage ΠΈΠ»ΠΈ "совмСстимого" с Π½ΠΈΠΌ. Π’ΠΈΠΏ TMessage описан Π² листингС 1.14.

Листинг 1.14. ОписаниС Ρ‚ΠΈΠΏΠ° TMessage

TMessage = packed record

 Msg: Cardinal;

 case Integer of

 0: (

  WParam: LongInt;

  LParam: LongInt;

  Result: LongInt);

 1: (

  WParamLo: Word;

  WParamHi: Word;

  LParamLo: Word;

  LParamHi: Word;

  ResultLo: Word;

  ResultHi: Word);

end;

ПолС Msg содСрТит Π½ΠΎΠΌΠ΅Ρ€ сообщСния, поля WParam ΠΈ LParam β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² сообщСния. ПолС Result β€” Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ΅: ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСния, заносит Π² Π½Π΅Π³ΠΎ Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ оконная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°. Поля с суффиксами Lo ΠΈ Hi ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΊ ΠΌΠ»Π°Π΄ΡˆΠ΅ΠΌΡƒ ΠΈ ΡΡ‚Π°Ρ€ΡˆΠ΅ΠΌΡƒ словам ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ содСрТат ΠΏΠ°Ρ€Ρƒ 16-разрядных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. НапримСр, Ρƒ сообщСния WM_MOUSEREMOVE младшСС слово ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° LParam содСрТит X-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ ΠΌΡ‹ΡˆΠΈ, ΡΡ‚Π°Ρ€ΡˆΠ΅Π΅ β€” Y-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ. Π’ случаС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ этого сообщСния ΠΏΠΎΠ»Π΅ LParamLo Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ X-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ, LParamHi β€” Y-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ.

"БовмСстимыми" с TMessage ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ структуры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Msg, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ сообщСниС. Π­Ρ‚ΠΈ структуры ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ спСцифику ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ сообщСния. Π˜Ρ… ΠΈΠΌΠ΅Π½Π° ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ сообщСния ΠΏΡƒΡ‚Π΅ΠΌ отбрасывания символа ΠΈ добавлСния прСфикса T. Для ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π²ΡˆΠ΅Π³ΠΎΡΡ сообщСния WM_MOUSEMOVE ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ выглядит, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 1.15.

Листинг 1.15. Π’ΠΈΠΏ TWMNCMouseMove

TWMNCMouseMove = packed record

 Msg: Cardinal;

 HitTest: LongInt;

 XCursor: SmallInt;

 YCursor: SmallInt;

 Result: LongInt;

end;

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ WParam ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ Π² HitTest, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ смысл Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ LParam Ρ€Π°Π·Π±ΠΈΡ‚ Π½Π° Π΄Π²Π΅ 16-разрядных части: XCursor ΠΈ YCursor.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠΌΡƒ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ (ΠΏΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ свой Ρ‚ΠΈΠΏ), ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏ TMessage. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСния WM_MOUSEMOVE Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 1.16.

Листинг 1.16. ОбъявлСниС ΠΈ рСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния WM_MOUSEMOVE

type

 TSomeForm = class(TForm)

 ...............