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

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

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

1. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ с ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-диска Ρ„Π°ΠΉΠ»Ρ‹ Line.pas ΠΈ Line.dcr Π² ΠΏΠ°ΠΏΠΊΡƒ, Π³Π΄Π΅ Π²Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. Если Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ Π΅Ρ‰Π΅ Π½Π΅Ρ‚, самоС врСмя ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π΅. Π“Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ располоТСна, значСния Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚, Π²Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ любоС ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ для вас мСсто. Π“Π»Π°Π²Π½ΠΎΠ΅ β€” это ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ эту ΠΏΠ°ΠΏΠΊΡƒ Π² путях, Π³Π΄Π΅ Delphi ΠΈΡ‰Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π² Delphi 7 ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ мСню Tools\Environment Options, Π² появившСмся Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π·Π°ΠΊΠ»Π°Π΄ΠΊΡƒ Library ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ свою ΠΏΠ°ΠΏΠΊΡƒ Π² ΠΏΠΎΠ»Π΅ Library path. Π’ BDS 2006 ΠΈ Π²Ρ‹ΡˆΠ΅ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ мСню Tools\Options, Π² появившСмся Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π² Π΄Π΅Ρ€Π΅Π²Π΅ Π² Π»Π΅Π²ΠΎΠΉ части Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚ Environment Options\Delphi Options\Library β€” Win32 ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ Π² ΠΏΠΎΠ»Π΅ Library path.

2. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ (мСню File\New\Other, Π² ΠΎΡ‚ΠΊΡ€Ρ‹Π²ΡˆΠ΅ΠΌΡΡ ΠΎΠΊΠ½Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Package). ПослС этого Π² Delphi 7 ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях откроСтся нСбольшоС ΠΎΠΊΠ½ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Π’ BDS 2006 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсиях ΠΎΠΊΠ½ΠΎ Π½Π΅ откроСтся, Π½ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ появится Π² Π³Ρ€ΡƒΠΏΠΏΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это ΠΎΠΊΠ½ΠΎ Project Manager Π² ΠΏΡ€Π°Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°). Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ Π² Ρ‚Ρƒ ΠΆΠ΅ ΠΏΠ°ΠΏΠΊΡƒ, Π³Π΄Π΅ находится Line.pas, ΠΏΠΎΠ΄ Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΊΡ€ΠΎΠΌΠ΅ Line (ΠΈΠ½Π°Ρ‡Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΈΠΌΠ΅Π½).

3. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² ΠΏΠ°ΠΊΠ΅Ρ‚ Ρ„Π°ΠΉΠ» Line.pas. Π’ BDS 2006 для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ контСкстноС мСню ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² ΠΎΠΊΠ½Π΅ Project Manager ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚Π°ΠΌ ΠΏΡƒΠ½ΠΊΡ‚ Add. Π’ Delphi 7 ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях Π² ΠΎΠΊΠ½Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Add.

4. УстановитС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. Π’ BDS 2006 ΠΈ Π²Ρ‹ΡˆΠ΅ для этого слСдуСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΡƒΠ½ΠΊΡ‚ Install Π² контСкстном мСню ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° Π² Delphi 7 ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях β€” Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Install Π² ΠΎΠΊΠ½Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π°. ПослС этого Π² ΠΏΠ°Π»ΠΈΡ‚Ρ€Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Ρƒ вас появится Π²ΠΊΠ»Π°Π΄ΠΊΠ° Delphi Kingdom Samples, a Π² Π½Π΅ΠΉ β€” ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TLine.

Если Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TLine Π² ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² (ΠΈΠ»ΠΈ Ρƒ вас Turbo Delphi Explorer, ΠΈ Π²Ρ‹ просто Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ возмоТности), ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ LineSample, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎ врСмя выполнСния создаёт Π΄Π²Π° экзСмпляра TLine, Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся Ρ„ΠΎΡ€ΠΌΠ°, Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ β€” панСль.

ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ сообщСния Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° осущСствляСтся ΠΏΡƒΡ‚Π΅ΠΌ измСнСния Π΅Π³ΠΎ свойства WindowProc β€” записи Π² Π½Π΅Π³ΠΎ указатСля Π½Π° свой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСний. Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TLine Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ своСй ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Ρ‚.ΠΊ., Π±ΡƒΠ΄ΡƒΡ‡ΠΈ прямым наслСдником класса TComponent, ΠΎΠΊΠ½ΠΎΠΌ Π½Π΅ являСтся. Но ΠΌΠ΅Ρ‚ΠΎΠ΄ Dispatch Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ объявлСн Π² классС TObject. Π’ классС TComponent ΠΈ Π² Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ°Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ Dispatch Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ вызываСтся. Если ΠΌΡ‹ напишСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСний Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ сообщСния ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Dispatch, Ρ‚ΠΎ смоТСм Π² нашСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ свои ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Dispatch ΠΏΡ€ΠΈ нСобходимости Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ сообщСния для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. НСобработанныС сообщСния ΠΏΡ€ΠΈ этом Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ DefaultHandler, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρƒ класса TComponent Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚. Если ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΊΡ€ΠΎΠ΅ΠΌ DefaultHandler Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π²Ρ‹Π·Ρ‹Π²Π°Π» ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСний родитСля, Ρ‚ΠΎ всС Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ сообщСния ΠΏΠΎΠΉΠ΄ΡƒΡ‚ Ρ‚ΡƒΠ΄Π°. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹Π·ΠΎΠ² inherited ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сообщСний Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° родитСля, Ρ‚.ΠΊ. Π² Π΄Π°Π½Π½ΠΎΠΌ случаС inherited ΠΏΡ€ΠΈ отсутствии унаслСдованного ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ DefaultHandler. Π’ листингС 1.24 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ объявлСниС класса TLine ΠΈ ΠΊΠΎΠ΄ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², относящихся ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρƒ сообщСний.

Листинг 1.24. Базовая Ρ‡Π°ΡΡ‚ΡŒ класса TLine

type

 TLine = class(TComponent)

 private

  // FCoords Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π»ΠΈΠ½ΠΈΠΈ. Начало Π»ΠΈΠ½ΠΈΠΈ

  // находится Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ (FCoords[0], FCoords[1]),

  // ΠΊΠΎΠ½Π΅Ρ† - Π² (FCoords[2], FCoords[3]).

  FCoords:array[0..3] of Integer;

  // ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ класса написан Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ TLine

  // ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ TWinControl ΠΈΠ»ΠΈ Π΅Π³ΠΎ наслСдник.

  // Но свойство Owner ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ TComponent, поэтому ΠΏΡ€ΠΈ

  // использовании свойств ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса TWinControl

  // Owner придСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Ρ‚ΠΈΠΏΡƒ

  // TWinControl. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ°,

  // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΠ»Π΅ FWinOwner. Оно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅

  // ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΈ Owner, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ TWinControl.

  FWinOwner: TWinControl;

  // Π—Π΄Π΅ΡΡŒ хранится адрСс ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сообщСний, Π±Ρ‹Π²ΡˆΠΈΠΉ Π΄ΠΎ

  // ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π°.

  FOldProc: TWndMethod;

  // Π¦Π²Π΅Ρ‚ Π»ΠΈΠ½ΠΈΠΈ

  FColor: TColor;

  // БостояниС Π»ΠΈΠ½ΠΈΠΈ. Если FStartMoving = True, Π² Π΄Π°Π½Π½Ρ‹ΠΉ

  // ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΠΎ Π»ΠΈΠ½ΠΈΠΈ, Ссли

  // FEndMoving = True - Π΅Π΅ ΠΊΠΎΠ½Π΅Ρ†.

  FStartMoving, FEndMoving: Boolean;

  // Если FDrawLine = False, линия Π½Π΅ рисуСтся. Π­Ρ‚ΠΎ

  // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΡΡ‚Π΅Ρ€Π΅Ρ‚ΡŒ линию.

  FDrawLine: Boolean;

  procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;

  procedure WMLButtonDown(var Msg: TWMLButtonDown); message WM_LBUTTONDOWN;

  procedure WMLButtonUp(var Msg: TWMButtonUp); message WM_LBUTTONUP;

  procedure WMMouseMove(var Msg: TWMMouseMove); message WM_MOUSEMOVE;

  procedure SetColor(Value: TColor);

  procedure SetCoord(Index, Value: Integer);

 protected

  // Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ сообщСний

  // Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°

  procedure HookOwnerMessage(var Msg: Message);

 public

  constructor Create(AOwner: TComponent); override;

  destructor Destroy; override;

  procedure DefaultHandler(var Msg); override;

 published

  property Color: TColor read FColor write SetColor default clWindowText;

  property StartX: Integer index 0 read FCoords[0] write SetCoord default 10;

  property StartY: Integer index 1 read FCoords[1] write SetCoord default 10;

  property EndX: Integer index 2 reed FCoords[2] write SetCoord default 50;

  property EndY: Integer index 3 read FCoords[3] write SetCoord default 50;

 end;

...


constructor TLine.Create(AOwner: TComponent);

begin

 if not Assigned(AOwner) then raise EWrongOwner.Create(

  'Π”ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π²Π»Π°Π΄Π΅Π»Π΅Ρ† ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° TLine');

 if not (AOwner is TWinControl) then raise EWrongOwner.Create(

  'Π’Π»Π°Π΄Π΅Π»Π΅Ρ† ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° TLine Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ наслСдником TWinControl');

 FWinOwner := AOwner as TWinControl;

 inherited;

 FCoords[0] := 10;

 FCoords[1] := 10;

 FCoords[2] := 50;

 FCoords[3] := 50;

 FColor := clWindowText;

 FStartMoving := False;

 FEndMoving := False;

 FDrawLine := True;

 // Π—Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ старый ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСний Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° ΠΈ

 // Π½Π°Π·Π½Π°Ρ‡Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ.

 FOldProc := FWinOwner.WindowProc;

 FWinOwner.WindowProc := HookOwnerMessage;

 FWinOwner.Refresh;

end;


destructor TLine.Destroy;

begin

 // ВосстанавливаСм старый ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСний Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°.

 FWinOwner.WindowProc := FOldProc;

 FWinOwner.Refresh;

 inherited;

end;


procedure TLine.HookOwnerMessage(var Msg: TMessage);

begin

 // ЕдинствСнноС, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊ сообщСний -

 // ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Dispatch. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Π΅Π΅

 // Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ сообщСний сам ΠΌΠ΅Ρ‚ΠΎΠ΄ Dispatch,

 // Π½ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ, нСсовмСстимый с

 // Ρ‚ΠΈΠΏΠΎΠΌ TWndMethod, поэтому компилятор Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚

 // ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ присваиваниС. ЀактичСски ΠΆΠ΅ Dispatch

 // совмСстим с TWndMethod, поэтому, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ хакСрскиС

 // ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ Π΅Π³ΠΎ ΠΈ

 // ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° HookOwnerMessage. Но хакСрскиС

 // ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ - Π²Π΅Ρ‰ΡŒ нСбСзопасная, ΠΎΠ½ΠΈ допустимы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ

 // Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… срСдств Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π΅Ρ‚.

 Dispatch(Msg);

end;


procedure TLine.DefaultHandler(var Msg);

begin

 FOldProc(TMessage(Msg));

end;

БобствСнно рисованиС Π»ΠΈΠ½ΠΈΠΈ Π½Π° повСрхности Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° обСспСчиваСт ΠΌΠ΅Ρ‚ΠΎΠ΄ WMPaint (листинг 1.25).

Листинг 1.25. ΠœΠ΅Ρ‚ΠΎΠ΄ WMPaint

procedure TLine.WMPaint(var Msg: TWMPaint);

var

 NeedDC: Boolean;

 PS: TPaintStruct;

 Pen: HPEN;

begin

 if FDrawLine then

 begin

  // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Π±Ρ‹Π» Π»ΠΈ DC ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ

  NeedDC := Msg.DC = 0;

  if NeedDC then Msg.DC := BeginPaint(FWinOwner.Handle, PS);

  inherited;

  Pen := CreatePen(PS_SOLID, 1, ColorToRGB(FColor));

  SelectObject(Msg.DC, Pen);

  MoveToEx(Msg.DC, FCoords[0], FCoords[1], nil);

  LineTo(Msg.DC, FCoords[2], FCoords[3]);

  SelectObject(Msg.DC, GetStockObject(BLACK_PEN));

  DeleteObject(Pen);

  if NeedDC then EndPaint(FWinOwner.Handle, PS);

 end

 else inherited;

end;

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ рисуСтся простая линия, ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ здСсь ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляр TCanvas ΠΈ ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊ контСксту устройства, обойдСмся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ GDI. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с контСкстом устройства ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π΅ сообщСния WM_PAINT описаны Π² Ρ€Π°Π·Π΄. 1.2.4.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠ³ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ†Ρ‹ Π»ΠΈΠ½ΠΈΠΈ, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСния, связанныС с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΌΡ‹ΡˆΠΈ ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΈ отпусканиСм Π΅Π΅ Π»Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ (листинг 1.26).