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. ΠΠ°Π·ΠΎΠ²Π°Ρ ΡΠ°ΡΡΡ ΠΊΠ»Π°ΡΡΠ° TLinetype
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. ΠΠ΅ΡΠΎΠ΄ WMPaintprocedure 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).