home *** CD-ROM | disk | FTP | other *** search
- âïÇéÇ 17.
-
- éìôÆÉàììêë öÄÉîÇÆ ÄüÜàèÆÄé.
-
- é¡πΓαÑ¡¡¿⌐ Σ«α¼áΓ «íΩѬΓá »«σ«ª ¡á ºá»¿ß∞. Å«½∩ «íΩѬΓá
- ºá»«¼¿¡áεΓß∩ ó »«α∩ñ¬Ñ «íΩ∩ó½Ñ¡¿∩, ¬á¬ ¡Ñ»αÑαδó¡á∩
- »«ß½Ññ«óáΓѽ∞¡«ßΓ∞ »ÑαѼѡ¡δσ. ïεíδÑ »«½∩, π¡áß½Ññ«óá¡¡δÑ «Γ Γ¿»á
- »αÑñ¬á ºá»«¼¿¡áεΓß∩ ñ« ¡«óδσ »«½Ñ⌐, «»αÑñѽѡ¡δσ ó »«α«ªñÑ¡¡«¼
- Γ¿»Ñ.
- àß½¿ «íΩÑ¬Γ¡δ⌐ Γ¿» «»αÑñѽ∩ÑΓ ó¿αΓπá½∞¡δÑ ¼ÑΓ«ñδ, ¬«¡ßΓαá¬Γ«αδ
- ¿½¿ ñÑßΓαá¬Γ«αδ, ¬«¼»¿½∩Γ«α αáß»αÑñѽ∩ÑΓ ñ«»«½¡¿Γѽ∞¡«Ñ »«½Ñ ó
- «íΩÑ¬Γ¡«¼ Γ¿»Ñ. ¥Γ« 16-Γ¿ í¿Γ«ó«Ñ »«½Ñ, ¡áºδóáѼ«Ñ »«½Ñ¼ Γáí½¿µδ
- ó¿αΓπá½∞¡«ú« ¼ÑΓ«ñá (VMT) ¿ ¿ß»«½∞ºπÑΓß∩ ñ½∩ ºá»«¼¿¡á¡¿∩ ß¼ÑΘÑ¡¿∩
- VMT φΓ«ú« «íΩÑ¬Γ¡«ú« Γ¿»á ó ßÑú¼Ñ¡ΓÑ ñá¡¡δσ. Å«½Ñ VMT ß½ÑñπÑΓ
- ¡Ñ»«ßαÑñßΓóÑ¡¡« »«ß½Ñ «íδτ¡δσ »«½Ñ⌐ ó «íΩÑ¬Γ¡«¼ Γ¿»Ñ. è«úñá
- «íΩÑ¬Γ¡δ⌐ Γ¿» ¡áß½ÑñπÑΓ ó¿αΓπá½∞¡δÑ ¼ÑΓ«ñδ, ¬«¡ßΓαá¬Γ«αδ ¿½¿
- ñÑßΓαá¬Γ«αδ, «¡ ΓᬠªÑ ¡áß½ÑñπÑΓ »«½Ñ VMT, »α¿ φΓ«¼ ñ«»«½¡¿Γѽ∞¡«Ñ
- »«½Ñ ¡Ñ αáß»αÑñѽ∩ÑΓß∩.
- ê¡¿µ¿á½¿ºáµ¿∩ »«½∩ VMT φ¬ºÑ¼»½∩αá »α«¿ºó«ñ¿Γß∩ ¬«¡ßΓαá¬Γ«α«¼
- «íΩÑ¬Γ¡«ú« Γ¿»á. Åα«úαá¼¼á ¡¿¬«úñá ∩ó¡« ¡Ñ ¿¡¿µ¿á½¿º¿απÑΓ ¿ ¡Ñ
- «íαáΘáÑΓß∩ ¬ »«½ε VMT.
- æ½ÑñπεΘ¿Ñ »α¿¼Ñαδ ¿½½εßΓα¿απεΓ ó¡πΓαÑ¡¡¿⌐ Σ«α¼áΓ «íΩÑ¬Γ¡δσ
- Γ¿»«ó.
-
- type
- LocationPtr = ^Location;
- Location = object
- X, Y: Integer;
- procedure Init(PX, PY: Integer);
- function GetX: Integer;
- function GetY: Integer;
- end;
-
- PointPtr = ^Point;
- Point = object(Location)
- Color: Integer;
- constructor Init(PX, PY, PColor: Integer);
- destructor Done; virtual;
- procedure Show; virtual;
- procedure Hide; virtual;
- procedure MoveTo(PX, PY: Integer);
- end;
-
- CirclePtr = ^Circle;
- Circle = object(Point)
- Radius: Integer;
- constructor Init(PX, PY: Integer;
- PColor, PRadius: Integer);
- procedure Show; virtual;
- procedure Hide; virtual;
- procedure Fill; virtual;
- end;
-
- É¿ß. 17.1 »«¬áºδóáÑΓ ß½«¿ φ¬ºÑ¼»½∩α«ó Location, Point ¿
- Circle; ¬áªñδ⌐ »α∩¼«πú«½∞¡¿¬ ß««ΓóÑΓßΓóπÑΓ «ñ¡«¼π ß½«óπ »á¼∩Γ¿.
-
- É¿ß. 17.1 潫¿ φ¬ºÑ¼»½∩α«ó Location, Point ¿ Circle.
-
-
- Location Point Circle
- ┌──────────┐ ┌───────────┐ ┌───────────┐
- │ X │ │ X │ │ X │
- ├──────────┤ ├───────────┤ ├───────────┤
- │ Y │ │ Y │ │ Y │
- └──────────┘ ├───────────┤ ├───────────┤
- │ Color │ │ Color │
- ├───────────┤ ├───────────┤
- │ VMT │ │ VMT │
- └───────────┘ ├───────────┤
- │ Radius │
- └───────────┘
-
-
- ū߬«½∞¬π Point ∩ó½∩ÑΓß∩ »Ñαóδ¼ Γ¿»«¼ ó ¿Ñαáασ¿¿, ¬«Γ«αδ⌐
- óó«ñ¿Γ ó¿αΓπá½∞¡δÑ ¼ÑΓ«ñδ, »«½Ñ VMT αáß»αÑñѽ∩ÑΓß∩ »«ß½Ñ »«½∩
- Color.
-
- Æáí½¿µδ ó¿αΓπá½∞¡δσ ¼ÑΓ«ñ«ó.
-
- èáªñδ⌐ «íΩÑ¬Γ¡δ⌐ Γ¿», ¬«Γ«αδ⌐ ß«ñÑαª¿Γ ¿½¿ ¡áß½ÑñπÑΓ
- ó¿αΓπá½∞¡δÑ ¼ÑΓ«ñδ, ¬«¡ßΓαá¬Γ«αδ ¿½¿ ñÑßΓαá¬Γ«αδ, ¿¼ÑÑΓ
- ß««ΓóÑΓßΓóπεΘπε Ѽπ VMT, ¬«Γ«αá∩ σαá¡¿Γß∩ ó ¿¡¿µ¿á½¿º¿α«óá¡¡«⌐
- τáßΓ¿ ßÑú¼Ñ¡Γá ñá¡¡δσ »α«úαá¼¼δ. æπΘÑßΓóπÑΓ Γ«½∞¬« «ñ¡á VMT ñ½∩
- «íΩÑ¬Γ¡«ú« Γ¿»á (á ¡Ñ ñ½∩ φ¬ºÑ¼»½∩αá), ¡« ñóá αẽ¿τ¡δσ «íΩÑ¬Γ¡δσ
- Γ¿»á ¡¿¬«úñá ¡Ñ αáºñѽ∩εΓ VMT, ¬á¬ íδ »«σ«ª¿ «¡¿ ¡Ñ í뫨. VMT
- ßΓα«¿Γß∩ ¬«¼»¿½∩Γ«α«¼ áóΓ«¼áΓ¿τÑ߬¿ ¿ ¡¿¬«úñá »α∩¼« ¡Ñ
- «íαáíáΓδóáÑΓß∩ »α«úαá¼¼«⌐. èα«¼Ñ Γ«ú«, π¬áºáΓѽ¿ ¡á VMT
- áóΓ«¼áΓ¿τÑ߬¿ ºá»«¼¿¡áεΓß∩ ó φ¬ºÑ¼»½∩αÑ «íΩÑ¬Γ¡«ú« Γ¿»á
- ¬«¡ßΓαá¬Γ«α«¼ φΓ«ú« «íΩÑ¬Γ¡«ú« Γ¿»á ¿ ¡¿¬«úñá ¡Ñ «íαáíáΓδóáεΓß∩
- »α«úαá¼¼«⌐.
- ÅÑαó«Ñ ß½«ó« VMT ß«ñÑαª¿Γ αẼÑα φ¬ºÑ¼»½∩α«ó, áßß«µ¿¿α«óá¡¡δσ
- ß «íΩÑ¬Γ¡δ¼ Γ¿»«¼; φΓá ¿¡Σ«α¼áµ¿∩ ¿ß»«½∞ºπÑΓß∩ ¬«¡ßΓαá¬Γ«αἿ ¿
- ñÑßΓαá¬Γ«αἿ ñ½∩ «»αÑñѽѡ¿∩ ߬«½∞¬« íá⌐Γ ¡πª¡« αáß»αÑñѽ¿Γ∞ ¿½¿
- «ßó«í«ñ¿Γ∞, ¿ß»«½∞ºπ∩ αáßΦ¿αÑ¡¡δ⌐ ß¿¡Γá¬ß¿ß New ¿ Dispose.
- éΓ«α«Ñ ß½«ó« VMT ß«ñÑαª¿Γ «Γα¿µáΓѽ∞¡δ⌐ αẼÑα φ¬ºÑ¼»½∩α«ó,
- ßó∩ºá¡¡δσ ß «íΩÑ¬Γ¡δ¼ Γ¿»«¼; φΓá ¿¡Σ«α¼áµ¿∩ ¿ß»«½∞ºπÑΓß∩ ¼Ñσá¡¿º¼«¼
- óÑα¿Σ¿¬áµ¿¿ ó맮ó«ó ó¿αΓπá½∞¡δσ ¼ÑΓ«ñ«ó ñ½∩ «»αÑñѽѡ¿∩
- ¡Ñ¿¡¿µ¿á½¿º¿α«óá¡¡δσ «íΩÑ¬Γ«ó (φ¬ºÑ¼»½∩α«ó, ñ½∩ ¬«Γ«αδσ ¡Ñ í佫
- ó맮óá ¬«¡ßΓαá¬Γ«αá) ¿ ñ½∩ »α«óÑન µÑ½«ßΓ¡«ßΓ¿ VMT. è«úñá ¼Ñσá¡¿º¼
- óÑα¿Σ¿¬áµ¿¿ ó¿αΓπá½∞¡δσ ó맮ó«ó ó¬½ετÑ¡ (¿ß»«½∞ºπ∩ ñ¿αÑ¬Γ¿óπ
- ¬«¼»¿½∩Γ«αá {$R+}, ¬«Γ«αá∩ αáßΦ¿αÑ¡á ñ½∩ ó¬½ετÑ¡¿∩ »α«óÑન
- ó¿αΓπá½∞¡δσ ¼ÑΓ«ñ«ó), ¬«¼»¿½∩Γ«α úÑ¡Ñα¿απÑΓ ó맮ó »α«úαá¼¼δ
- óÑα¿Σ¿¬áµ¿¿ VMT »ÑαÑñ ¬áªñδ¼ ó¿αΓπá½∞¡δ¼ ó맮ó«¼. Åα«úαá¼¼á
- óÑα¿Σ¿¬áµ¿¿ VMT »α«óÑα∩ÑΓ, τΓ« »Ñαó«Ñ ß½«ó« VMT ¡Ñ αáó¡« 0 ¿ τΓ«
- ßπ¼¼á »Ñαó«ú« ¿ óΓ«α«ú« ß½«ó = 0. àß½¿ ¬á¬á∩-Γ« ¿º »α«óÑ᫬ ¡Ñ
- »α«σ«ñ¿Γ, úÑ¡Ñα¿απÑΓß∩ «Φ¿í¬á óαѼѡ¿ óδ»«½¡Ñ¡¿∩ 210.
-
- Åα¿¼Ñτá¡¿Ñ: 鬽ετÑ¡¿Ñ »α«óÑન ¡á ñ¿á»áº«¡ ¿ óÑα¿Σ¿¬áµ¿¿
- ó맮ó«ó ó¿αΓπá½∞¡δσ ¼ÑΓ«ñ«ó ºá¼Ññ½∩ÑΓ éáΦπ »α«úαá¼¼π ¿ ñѽáÑΓ ÑÑ
- º¡áτ¿Γѽ∞¡« í«½∞ΦÑ, »«φΓ«¼π ¿ß»«½∞ºπ⌐ΓÑ ß«ßΓ«∩¡¿Ñ {$R+} Γ«½∞¬« ó«
- óαѼ∩ «Γ½áñ¬¿ ¿ »ÑαÑσ«ñ¿ΓÑ ó ß«ßΓ«∩¡¿Ñ {$R-} ñ½∩ «¬«¡τáΓѽ∞¡«⌐
- óÑαß¿¿ »α«úαá¼¼δ.
-
- ê ¡á¬«¡Ñµ, ¡áτ¿¡á∩ ß« ß¼ÑΘÑ¡¿∩ 4 ó VMT ¡áσ«ñ¿Γß∩ ß»¿ß«¬ 32-σ
- í¿Γ¡δσ π¬áºáΓѽÑ⌐ ¡á ¼ÑΓ«ñ, »« «ñ¡«¼π ¡á ó¿αΓπá½∞¡δ⌐ ¼ÑΓ«ñ ó
- «íΩÑ¬Γ¡«¼ Γ¿»Ñ, ó »«α∩ñ¬Ñ «íΩ∩ó½Ñ¡¿∩. èáªñ«Ñ »«½Ñ ß«ñÑαª¿Γ áñαÑß
- Γ«τ¬¿ óσ«ñá ß««ΓóÑΓßΓóπεΘÑú« ó¿αΓπá½∞¡«ú« ¼ÑΓ«ñá.
- É¿ß.17.2 »«¬áºδóáÑΓ ß½«¿ VMT ñ½∩ Γ¿»«ó Point ¿ Circle (Æ¿»
- Location ¡Ñ ¿¼ÑÑΓ VMT Γᬠ¬á¬ ¡Ñ ß«ñÑαª¿Γ ó¿αΓπá½∞¡δσ ¼ÑΓ«ñ«ó,
- ¬«¡ßΓαá¬Γ«α«ó ¿ ñÑßΓαá¬Γ«α«ó); ¬áªñδ⌐ ¼á½Ñ¡∞¬¿⌐ »α∩¼«πú«½∞¡¿¬
- ß««ΓóÑΓßΓóπÑΓ «ñ¡«¼π ß½«óπ »á¼∩Γ¿, á ¬áªñδ⌐ í«½∞Φ«⌐ - ñóπ¼.
-
- É¿ß.17.2 潫¿ VMT ñ½∩ Point ¿ Circle.
-
- Point VMT Circle VMT
- ┌───────────────┐ ┌────────────────┐
- │ $0008 │ │ $000A │
- ├───────────────┤ ├────────────────┤
- │ $FFF8 │ │ $FFF6 │
- ├───────────────┤ ├────────────────┤
- │ @Point.Done │ │ @Point.Done │
- ├───────────────┤ ├────────────────┤
- │ @Point.Show │ │ @Circle.Show │
- ├───────────────┤ ├────────────────┤
- │ @Point.Hide │ │ @Circle.Hide │
- ├───────────────┤ ├────────────────┤
- │ @Point.MoveTo │ │ @Point.MoveTo │
- └───────────────┘ ├────────────────┤
- │ @Circle.Fill │
- └────────────────┘
-
-
- çá¼ÑΓ∞ΓÑ, ¬á¬ Circle ¡áß½ÑñπÑΓ ¼ÑΓ«ñδ MoveTo ¿ Down ¿º Point ¿
- ¬á¬ «¡ »ÑαѬαδóáÑΓ ¼ÑΓ«ñδ Show ¿ Hide.
- èá¬ π»«¼∩¡πΓ« αá¡ÑÑ, ¬«¡ßΓαá¬Γ«α «íΩÑ¬Γ¡«ú« Γ¿»á ß«ñÑনΓ
- ߻ѵ¿á½∞¡δ⌐ ¬«ñ, ¬«Γ«αδ⌐ ß«σαá¡∩ÑΓ ß¼ÑΘÑ¡¿Ñ VMT «íΩÑ¬Γ¡«ú« Γ¿»á ó
- ¿¡¿µ¿á½¿º¿απѼ«¼ φ¬ºÑ¼»½∩αÑ. ìá»α¿¼Ñα: »πßΓ∞ ñá¡ φ¬ºÑ¼»½∩α É Γ¿»á
- Point ¿ φ¬ºÑ¼»½∩α C Γ¿»á Circle, Γ«úñá ó맮ó P.Init íπñÑΓ
- áóΓ«¼áΓ¿τÑ߬¿ ß«σαá¡∩Γ∞ ß¼ÑΘÑ¡¿Ñ VMT ñ½∩ Point ó »«½Ñ VMT
- φ¬ºÑ¼»½∩αá P ¿ ó맮ó C.Init íπñÑΓ ß«σαá¡∩Γ∞ ß¼ÑΘÑ¡¿Ñ VMT ñ½∩ Circle
- ó »«½Ñ VMT φ¬ºÑ¼»½∩αá C. ¥Γá áóΓ«¼áΓ¿τÑ߬á∩ ¿¡¿µ¿á½¿ºáµ¿∩ ∩ó½∩ÑΓß∩
- τáßΓ∞ε óσ«ñ¡«ú« ¬«ñá ¬«¡ßΓαá¬Γ«αá Γá¬, τΓ« ó ëà ¼«¼Ñ¡Γ, ¬«úñá
- π»αáó½Ñ¡¿Ñ ñ«ßΓ¿úáÑΓ «»ÑαáΓ«αá begin ¬«¡ßΓαá¬Γ«αá, »«½Ñ Self VMT
- πªÑ πßΓá¡«ó½Ñ¡«. Å«φΓ«¼π, Ñß½¿ 󫺡¿¬½á ¡Ñ«íσ«ñ¿¼«ßΓ∞, ¬«¡ßΓαá¬Γ«α
- ¼«ªÑΓ ßñѽáΓ∞ ó맮ó ó¿αΓπá½∞¡«ú« ¼ÑΓ«ñá.
-
-
- æΓá¡ñáαΓ¡á∩ Σπ¡¬µ¿∩ SizeOf.
-
- è«úñá ßΓá¡ñáαΓ¡á∩ Σπ¡¬µ¿∩ SizeOf »α¿¼Ñ¡∩ÑΓß∩ ¬ φ¬ºÑ¼»½∩απ
- «íΩÑ¬Γ¡«ú« Γ¿»á, ¿¼ÑεΘÑú« VMT, «¡á ó«ºóαáΘáÑΓ αẼÑα, σαá¡∩Θ¿⌐ß∩ ó
- φΓ«⌐ VMT. Å«φΓ«¼π, ñ½∩ «íΩÑ¬Γ¡δσ Γ¿»«ó, ¿¼ÑεΘ¿σ VMT, SizeOf óßÑúñá
- ó«ºóαáΘáÑΓ ¡Ñ «íΩ∩ó½Ñ¡¡δ⌐, á ñÑ⌐ßΓó¿Γѽ∞¡δ⌐ αẼÑα φ¬ºÑ¼»½∩αá.
-
-
- æΓá¡ñáαΓ¡á∩ Σπ¡¬µ¿∩ TypeOf.
-
- Turbo Pascal ñ«íáó½∩ÑΓ ¡«óπε ßΓá¡ñáαΓ¡πε Σπ¡¬µ¿ε TypeOf,
- ¬«Γ«αá∩ ó«ºóαáΘáÑΓ π¬áºáΓѽ∞ ¡á VMT «íΩÑ¬Γ¡«ú« Γ¿»á. TypeOf ¿¼ÑÑΓ
- Ññ¿¡ßΓóÑ¡¡δ⌐ »áαá¼ÑΓα, ¬«Γ«αδ⌐ ¼«ªÑΓ íδΓ∞ ½¿í« ¿ñÑ¡Γ¿Σ¿¬áΓ«α«¼
- «íΩÑ¬Γ¡«ú« Γ¿»á, ½¿í« φ¬ºÑ¼»½∩α«¼ «íΩÑ¬Γ¡«ú« Γ¿»á. é «í«¿σ ß½πτá∩σ
- αѺπ½∞ΓáΓ Γ¿»á Pointer ∩ó½∩ÑΓß∩ π¬áºáΓѽѼ ¡á VMT «íΩÑ¬Γ¡«ú« Γ¿»á.
- TypeOf ¼«ªÑΓ íδΓ∞ »α¿¼Ñ¡Ñ¡ Γ«½∞¬« ¬ «íΩÑ¬Γ¡δ¼ Γ¿»á¼, ¿¼ÑεΘ¿¼ VMT -
- ñ½∩ óßÑσ ñαπú¿σ Γ¿»«ó φΓ« íπñÑΓ «Φ¿í¬«⌐.
- öπ¡¬µ¿∩ TypeOf ¼«ªÑΓ íδΓ∞ ¿ß»«½∞º«óá¡á ñ½∩ »α«óÑન
- ñÑ⌐ßΓó¿Γѽ∞¡«ú« Γ¿»á φ¬ºÑ¼»½∩αá. ìá»α¿¼Ñα:
-
- if TypeOf(Self) = ÆypeOf(Point) then ...
-
-
- é맮óδ ó¿αΓπá½∞¡δσ ¼ÑΓ«ñ«ó.
-
- ùΓ«íδ óδºóáΓ∞ ó¿αΓπá½∞¡δ⌐ ¼ÑΓ«ñ, ¬«¼»¿½∩Γ«α úÑ¡Ñα¿απÑΓ ¬«ñ,
- ¬«Γ«αδ⌐ π¬áºδóáÑΓ ¡á áñαÑß VMT ¿º »«½∩ VMT ó «íΩѬΓÑ, ¿ ºáΓѼ
- óδºδóáÑΓ τÑαѺ »«½Ñ, ßó∩ºá¡¡«Ñ ß φΓ¿¼ ¼ÑΓ«ñ«¼. ìá»α¿¼Ñα: ñ½∩
- »ÑαѼѡ¡«⌐ PP Γ¿»á PointPtr ó맮ó PP^.Show úÑ¡Ñα¿απÑΓ ß½ÑñπεΘ¿⌐
- ¬«ñ:
-
- les di,PP ; çáúαπº¿Γ∞ PP ó ES:DI
- push es ; »ÑαÑñáΓ∞ ¬á¬ Self »áαá¼ÑΓα
- push di
- mov di,es:[di + 6] ; «Γ¼ÑΓ¿Γ∞ ß¼ÑΘÑ¡¿Ñ VMT ¿º »«½∩ VMT
- call DWORD PTR [di+8] ; óδºóáΓ∞ Γ«τ¬π óσ«ñá ó VMT ñ½∩ Show
-
-
- Åαá󿽫 ß«ó¼ÑßΓ¿¼«ßΓ¿ ñ½∩ «íΩÑ¬Γ¡δσ Γ¿»«ó »«ºó«½∩ÑΓ PP
- π¬áºδóáΓ∞ ¡á Point ¿½¿ Circle, ¿½¿ ¡á ½εí«⌐ ñαπú«⌐ Γ¿», »«α«ªñÑ¡¡δ⌐
- «Γ Point. ê Ñß½¿ éδ »α«óÑα¿ΓÑ VMT, »«¬áºá¡¡πε ºñÑß∞, éδ πó¿ñ¿ΓÑ,
- τΓ« ñ½∩ Point Γ«τ¬á ó VMT ß« ß¼ÑΘÑ¡¿Ñ¼ 8 π¬áºδóáÑΓ ¡á Point.Show, ó
- Γ« óαѼ∩, ¬á¬ ñ½∩ Circle «¡á π¬áºδóáÑΓ ¡á Circle.Show. Æá¬¿¼
- «íαẫ¼, ó ºáó¿ß¿¼«ßΓ¿ «Γ á¬Γπá½∞¡«ú« (óαѼѡ¿ óδ»«½¡Ñ¡¿∩) Γ¿»á PP,
- ¿¡ßΓαπ¬µ¿∩ CALL óδºδóáÑΓ Point.Show ¿½¿ Circle.Show, ¿½¿ ¼ÑΓ«ñ Show
- ½εí«ú« ñαπú«ú« Γ¿»á, »«α«ªñÑ¡¡«ú« «Γ Point.
- àß½¿ Show - ßΓáΓ¿τÑ߬¿⌐ ¼ÑΓ«ñ, Γ« ñ½∩ ó맮óá PP^.Show íπñÑΓ
- úÑ¡Ñα¿α«óáΓ∞ß∩ ¬«ñ:
-
- les di,PP ; çáúαπº¿Γ∞ PP ó ES:DI
- push es ; »ÑαÑñáΓ∞ ¬á¬ Self »áαá¼ÑΓα
- push di
- call Point.Show ; »α∩¼«⌐ ó맮ó Point.Show
-
- çñÑß∞ ó¡Ñ ºáó¿ß¿¼«ßΓ¿ «Γ Γ«ú«, ¡á τΓ« π¬áºδóáÑΓ PP, ¬«ñ íπñÑΓ
- óßÑúñá íπñÑΓ óδºδóáΓ∞ ¼ÑΓ«ñ Point.Show.
-
-
- æ«ú½áΦÑ¡¿Ñ « ó맮óáσ ¼ÑΓ«ñ«ó.
-
- îÑΓ«ñδ ¿ß»«½∞ºπεΓ Γá¬¿Ñ ªÑ ß«ú½áΦÑ¡¿∩ « ó맮óáσ, ¬á¬ «íδτ¡δÑ
- »α«µÑñπαδ ¿ Σπ¡¬µ¿¿, ºá ¿ß¬½ετÑ¡¿Ñ¼ Γ«ú«, τΓ« ¬áªñδ⌐ ¼ÑΓ«ñ ¿¼ÑÑΓ
- ñ«»«½¡¿Γѽ∞¡δ⌐ ¡Ñ∩ó¡δ⌐ »áαá¼ÑΓα, ¡áºδóáѼδ⌐ Self, ¬«Γ«αδ⌐
- ß««ΓóÑΓßΓóπÑΓ var - »áαá¼ÑΓαπ Γ«ú« ªÑ Γ¿»á, ¬á¬ «íΩÑ¬Γ¡δ⌐ Γ¿»
- ¼ÑΓ«ñá. Åáαá¼ÑΓα Self óßÑúñá »ÑαÑñáÑΓß∩ ¬á¬ »«ß½Ññ¡¿⌐ »áαá¼ÑΓα ¿
- óßÑúñá ¿¼ÑÑΓ Σ«α¼π 32-σ í¿Γ«ó«ú« π¬áºáΓѽ∩ ¡á φ¬ºÑ¼»½∩α, τÑαѺ
- ¬«Γ«αδ⌐ ¼ÑΓ«ñ óδºδóáÑΓß∩. ìá»α¿¼Ñα, ñ½∩ »ÑαѼѡ¡«⌐ PP Γ¿»á
- PointPtr, «»αÑñѽѡ¡δ⌐ αá¡ÑÑ, ó맮ó PP^.MoveTo(10, 20) ¬«ñ¿απÑΓß∩:
-
- Mov ax,10 ; ºáúαπº¿Γ∞ 10 ó AX
- Push ax ; »ÑαÑñáΓ∞ ÉX ¬á¬ »áαá¼ÑΓα
- Mov ax,20 ; ºáúαπº¿Γ∞ 20 ó AX
- Push ax ; »ÑαÑñáΓ∞ ÉY ¬á¬ »áαá¼ÑΓα
- les di, pp ; çáúαπº¿Γ∞ PP ó ES:DI
- push es ; »ÑαÑñáΓ∞ ¬á¬ Self »áαá¼ÑΓα
- push di
- mov di,es:[di+6] ; «Γ¼ÑΓ¿Γ∞ ß¼ÑΘÑ¡¿Ñ VMT ¿º »«½∩ VMT
- call DWORD PTR [di+16] ; óδºóáΓ∞ Γ«τ¬π óσ«ñá ó VMT ñ½∩
- ; MoveTo
-
- ä« ó«ºóαáΓá ¼ÑΓ«ñ ñ«½ªÑ¡ πñ὿Γ∞ »áαá¼ÑΓα Self ¿º ßΓѬá Γá¬
- ªÑ, ¬á¬ «¡ ñ«½ªÑ¡ πñ὿Γ∞ ½εíδÑ «íδτ¡δÑ »áαá¼ÑΓαδ.
- îÑΓ«ñ óßÑúñá ¿ß»«½∞ºπÑΓ ñá½∞¡εε ¼«ñѽ∞ ó맮óá (FAR CALL) ó¡Ñ
- ºáó¿ß¿¼«ßΓ¿ «Γ πßΓá¡«ó½Ñ¡¿∩ ñ¿αÑ¬Γ¿óδ ¬«¼»¿½∩Γ«αá $F.
-
-
- è«¡ßΓαá¬Γ«αδ ¿ ñÑßΓαá¬Γ«αδ.
-
- è«¡ßΓαá¬Γ«αδ ¿ ñÑßΓαá¬Γ«αδ ¿ß»«½∞ºπεΓ ΓÑ ªÑ ß«ú½áΦÑ¡¿∩ «
- ó맮óáσ, τΓ« ¿ «íδτ¡δÑ ¼ÑΓ«ñδ, ºá ¿ß¬½ετÑ¡¿Ñ¼ Γ«ú«, τΓ«
- ñ«»«½¡¿Γѽ∞¡δ⌐ »áαá¼ÑΓα, αẼÑα«¼ ó ß½«ó«, ¡áºδóáѼδ⌐
- VMT-»áαá¼ÑΓα«¼, »ÑαÑñáÑΓß∩ ó ßΓѬ »ÑαÑñ »áαá¼ÑΓα«¼ Self.
- ä½∩ ¬«¡ßΓαá¬Γ«α«ó »áαá¼ÑΓα VMT ß«ñÑαª¿Γ ß¼ÑΘÑ¡¿Ñ VMT,
- »α¿¡áñ½ÑªáΘÑÑ Self, ñ½∩ Γ«ú«, τΓ«íδ ¿¡¿µ¿á½¿º¿α«óáΓ∞ φëà Self.
- è«úñá ¬«¡ßΓαá¬Γ«α óδºδóáÑΓß∩ ñ½∩ αáß»αÑñѽѡ¿∩ ñ¿¡á¼¿τÑ߬¿σ
- «íΩÑ¬Γ«ó, ¿ß»«½∞ºπ∩ αáßΦ¿αÑ¡¡δ⌐ ß¿¡Γá¬ß¿ß New, π¬áºáΓѽ∞ nil
- »ÑαÑñáÑΓß∩ ó »áαá¼ÑΓαÑ Self. ¥Γ« ºáßΓáó½∩ÑΓ ¬«¡ßΓαá¬Γ«α
- αáß»αÑñѽ∩Γ∞ ¡«óδ⌐ ñ¿¡á¼¿τÑ߬¿⌐ «íΩѬΓ, áñαÑß ¬«Γ«α«ú« »ÑαÑñáÑΓß∩
- ¡áºáñ ó DX:AX »α¿ ó«ºóαáΓÑ ¿º ¬«¡ßΓαá¬Γ«αá. àß½¿ ¬«¡ßΓαá¬Γ«α ¡Ñ
- ¼«ªÑΓ αáß»αÑñѽ¿Γ∞ «íΩѬΓ, π¬áºáΓѽ∞ nil ó«ºóαáΘáÑΓß∩ ó DX:AX (ß¼.
- "é«ßßΓá¡«ó½Ñ¡¿Ñ «Φ¿í«¬ ¬«¡ßΓαá¬Γ«αá" ó ß½ÑñπεΘѼ αáºñѽÑ).
- ìᬫ¡Ñµ, ¬«úñá ¬«¡ßΓαá¬Γ«α óδºδóáÑΓß∩, ¿ß»«½∞ºπ∩
- πΓ«τ¡Ñ¡¡δ⌐ ¿ñÑ¡Γ¿Σ¿¬áΓ«α ¼ÑΓ«ñá (Γ.Ñ. ¿ñÑ¡Γ¿Σ¿¬áΓ«α «íΩÑ¬Γ¡«ú«
- Γ¿»á), ß »«ß½ÑñπεΘÑ⌐ Γ«τ¬«⌐ ¿ ¿ñÑ¡Γ¿Σ¿¬áΓ«α«¼ ¼ÑΓ«ñá, º¡áτÑ¡¿Ñ ¡«½∞
- »ÑαÑñáÑΓß∩ ó »áαá¼ÑΓαÑ VMT. ¥Γ« π¬áºδóáÑΓ ¬«¡ßΓαá¬Γ«απ, τΓ« «¡ ¡Ñ
- ñ«½ªÑ¡ ¿¡¿µ¿á½¿º¿α«óáΓ∞ »«½Ñ VMT ñ½∩ Self.
- ä½∩ ñÑßΓαá¬Γ«αá ¡«½∞ ó »áαá¼ÑΓαÑ VMT π¬áºδóáÑΓ « ¡«α¼á½∞¡«¼
- ó맮óÑ, ¿ ¡Ñ¡π½Ñó«Ñ º¡áτÑ¡¿Ñ π¬áºδóáÑΓ, τΓ« ñÑßΓαá¬Γ«α íδ½ óδºóá¡,
- ¿ß»«½∞ºπ∩ αáßΦ¿αÑ¡¡δ⌐ ß¿¡Γá¬ß¿ß Dispose. ¥Γ« ºáßΓáó½∩ÑΓ ñÑßΓαá¬Γ«α
- «ßó«í«ªñáΓ∞ Self ßαáºπ »ÑαÑñ ó«ºóαáΓ«¼ (αẼÑα Self «»αÑñѽ∩ÑΓß∩
- »α«ß¼«Γα«¼ »Ñαó«ú« ß½«óá VMT ñ½∩ φΓ«ú« Self).
-
-
- ÉáßΦ¿αÑ¡¿∩ ñ½∩ New ¿ Dispose.
-
- æΓá¡ñáαΓ¡δÑ »α«µÑñπαδ New ¿ Dispose αáßΦ¿αÑ¡δ ñ½∩
- ¿ß»«½∞º«óá¡¿∩ ó맮óá ¬«¡ßΓαá¬Γ«αá ¿½¿ ñÑßΓαá¬Γ«αá ¬á¬ óΓ«α«ú«
- »áαá¼ÑΓαá, ñ½∩ αáß»αÑñѽѡ¿∩ ¿½¿ «ßó«í«ªñÑ¡¿∩ ñ¿¡á¼¿τÑ߬¿σ
- »ÑαѼѡ¡δσ «íΩÑ¬Γ¡«ú« Γ¿»á. æ¿¡Γá¬ß¿ß:
-
- New(P, Construct);
-
- ¿
-
- Dispose(P, Destruct);
-
- úñÑ P - »ÑαѼѡ¡á∩ π¬áºáΓѽ∞, π¬áºδóáεΘ¿⌐ ¡á «íΩÑ¬Γ¡δ⌐ Γ¿», á
- Construct ¿ Destruct óδºδóáεΓ ¬«¡ßΓαá¬Γ«αδ ¿ ñÑßΓαá¬Γ«αδ ñ½∩ φΓ«ú«
- «íΩÑ¬Γ¡«ú« Γ¿»á. ä½∩ New ñÑ⌐ßΓó¿Ñ αáßΦ¿αÑ¡¡«ú« ß¿¡Γá¬ß¿ßá
- αáó¡«ß¿½∞¡« óδ»«½¡Ñ¡¿ε
-
- New(P);
- P^.Construct;
-
- ¿ ñ½∩ Dispose
-
- P^.Destruct;
- Dispose(P);
-
- üѺ αáßΦ¿αÑ¡¡«ú« ß¿¡Γá¬ß¿ßá »«∩ó½Ñ¡¿Ñ Γᬿσ »áα ó맮óá New ß
- »«ß½ÑñπεΘ¿¼ óδº«ó«¼ ¬«¡ßΓαá¬Γ«αá ¿ ó맮óá ñÑßΓαá¬Γ«αá ß »«ß½ÑñπεΘ¿¼
- óδº«ó«¼ Dispose íπñπΓ ß½¿Φ¬«¼ τáßΓ묨. ÉáßΦ¿αÑ¡¡δ⌐ ß¿¡Γá¬ß¿ß
- π½πτΦáÑΓ τ¿Γáíѽ∞¡«ßΓ∞, á ΓᬠªÑ úÑ¡Ñα¿απÑΓ í«½ÑÑ ¬«α«Γ¬¿⌐ ¿
- φΣΣÑ¬Γ¿ó¡δ⌐ ¬«ñ. æ½ÑñπεΘÑÑ ¿½½εßΓα¿απÑΓ ¿ß»«½∞º«óá¡¿Ñ αáßΦ¿αÑ¡¡«ú«
- ß¿¡Γá¬ß¿ßá New ¿ Dispose.
-
- var
- SP: StrFieldPtr;
- ZP: ZipFieldPtr;
- begin
- New(SP, Init(1, 1, 25, 'FirstName'));
- New(ZP, Init(1, 2, 5, 'Zip Code', 0, 99999));
- SP^.Edit;
- ZP^.Edit;
- ...
- Dispose(ZP, Down);
- Dispose(SP, Down);
- end;
-
- ä«»«½¡¿Γѽ∞¡«Ñ αáßΦ¿αÑ¡¿Ñ »«ºó«½∩ÑΓ ¿ß»«½∞º«óáΓ∞ New ¬á¬
- Σπ¡¬µ¿ε, ¬«Γ«αá∩ αáß»αÑñѽ∩Γ ¿ ó«ºóαáΘáÑΓ ñ¿¡á¼¿τÑ߬πε »ÑαѼѡ¡πε
- π¬áºá¡¡«ú« Γ¿»á. æ¿¡Γá¬ß¿ß :
-
- New(T);
-
- ¿½¿
-
- New(T, Construct);
-
- é »Ñαó«⌐ Σ«α¼Ñ Æ ¼«ªÑΓ íδΓ∞ π¬áºáΓѽѼ ¡á ½εí«⌐ Γ¿». é« óΓ«α«⌐
- - Æ ñ«½ª¡« π¬áºδóáΓ∞ ¡á «íΩÑ¬Γ¡δ⌐ Γ¿» ¿ Construct ñ«½ªÑ¡ íδΓ∞
- óδºóá¡ ñ½∩ ß«ºñá¡¿∩ φΓ«ú« «íΩÑ¬Γ¡«ú« Γ¿»á. é «í«¿σ ß½πτá∩σ Σπ¡¬µ¿∩
- ó«ºóαáΘáÑΓ αѺπ½∞ΓáΓ Æ.
-
- Åα¿¼Ñα :
-
- var
- F1, F2: FieldPtr;
- begin
- F1 := New(StrFieldPtr, Init(1, 1, 25, 'FirstName'));
- F2 := New(ZipFieldPtr, Init(1, 2, 5, 'Zip Code', 0, 99999));
- ...
- Writeln(F1^.GetStr); {ó맮ó StrField.GetStr}
- Writeln(F2^.GetStr); {ó맮ó ZipField.GetStr}
- ...
- Dispose(F2, Down); {ó맮ó Field.Down}
- Dispose(F1, Down); {ó맮ó StrField.Down}
- end;
-
- çá¼ÑΓ¿¼, τΓ« ñáªÑ, σ«Γ∩ F1 ¿ F2 Γ¿»á FieldPtr, αáßΦ¿αÑ¡¡δÑ
- »αáó¿½á ß«ó¼ÑßΓ¿¼«ßΓ¿ »« »α¿ßóá¿óá¡¿ε π¬áºáΓѽÑ⌐ »«ºó«½∩εΓ F1 ¿ F2
- »α¿ßóá¿óáΓ∞ π¬áºáΓѽ¿ ¡á ½εí«⌐ »«α«ªñÑ¡¡δ⌐ Γ¿» «Γ Field; ¿
- »«ß¬«½∞¬π GetStr ¿ Down ∩ó½∩εΓß∩ ó¿αΓπá½∞¡δ¼¿ ¼ÑΓ«ñἿ, ¼Ñσá¡¿º¼
- ñ¿ß»ÑΓτÑα¿ºáµ¿¿ ó¿αΓπá½∞¡δσ ¼ÑΓ«ñ«ó íπñÑΓ ¬«ααÑ¬Γ¡« óδºδóáΓ∞
- StrField.GetStr, ZipField.GetStr, Field.Down ¿ StrField.Down
- ß««ΓóÑΓßΓóÑ¡¡«.
-
-
- îÑΓ«ñδ ¡á áßßѼí½ÑαÑ.
-
- îÑΓ«ñδ, αÑ὿º«óá¡¡δÑ ¡á ∩ºδ¬Ñ áßßѼí½Ñαá ¼«úπΓ íδΓ∞ ó¬½ετÑ¡δ
- ó »α«úαá¼¼π ¡á Turbo Pascal, ¿ß»«½∞ºπ∩ ñ¿αÑ¬Γ¿ó𠬫¼»¿½∩Γ«αá $L ¿
- ¬½ετÑó«Ñ ß½«ó« External. ÄíΩ∩ó½Ñ¡¿Ñ ó¡ÑΦ¡Ñú« ¼ÑΓ«ñá ó «íΩÑ¬Γ¡«¼
- Γ¿»Ñ ¡Ñ «Γ½¿τáÑΓß∩ «Γ «íδτ¡«ú« ¼ÑΓ«ñá; «ñ¡á¬«, αÑ὿ºáµ¿∩ ¼ÑΓ«ñá
- ß«ßΓ«¿Γ Γ«½∞¬« ¿º ºáú«½«ó¬á ¼ÑΓ«ñá ß »«ß½ÑñπεΘ¿¼ ºáαѺÑαó¿α«óá¡¡δ¼
- ß½«ó«¼ External.
- é ¿ßσ«ñ¡«¼ ΓѬßΓÑ ¡á áßßѼí½ÑαÑ, @ ¿ß»«½∞ºπÑΓß∩ ó¼ÑßΓ«
- Γ«τ¬¿ »α¿ ¡á»¿ßá¡¿¿ πΓ«τ¡Ñ¡¡«ú« ¿ñÑ¡Γ¿Σ¿¬áΓ«αá (Γ.¬. Γ«τ¬á ¿¼ÑÑΓ
- ñαπú«Ñ º¡áτÑ¡¿Ñ ó áßßѼí½ÑαÑ ¿ ¡Ñ ¼«ªÑΓ íδΓ∞ τáßΓ∞ε
- ¿ñÑ¡Γ¿Σ¿¬áΓ«αá). ìá»α¿¼Ñα, ¿ñÑ¡Γ¿Σ¿¬áΓ«α Åá߬á½∩ Rect.Init »¿ΦÑΓß∩
- ó áßßѼí½ÑαÑ ¬á¬ Rect@Init. æ¿¡Γá¬ß¿ß ß @ ¼«ªÑΓ íδΓ∞ ¿ß»«½∞º«óá¡
- ñ½∩ «íΩ∩ó½Ñ¡¿∩ ¿ PUBLIC ¿ EXTRN ¿ñÑ¡Γ¿Σ¿¬áΓ«α«ó.
- é ¬áτÑßΓóÑ »α¿¼Ñαá ¼ÑΓ«ñá ¡á áßßѼí½ÑαÑ ¼δ αÑ὿ºπѼ »α«ßΓ«⌐
- «íΩÑ¬Γ Rect.
-
- Type
- Rect = Object
- X1, X2, Y1, Y2: Integer;
- procedure Init(XA, YA, XB, YB: Integer);
- procedure Union(var R: Rect);
- function Contains(X, Y: Integer): Boolean;
- end;
-
- Rect »αÑñßΓáó½∩ÑΓ »α∩¼«πú«½∞¡¿¬, «úαá¡¿τÑ¡¡δ⌐ τÑΓδα∞¼∩
- ¬««αñ¿¡áΓἿ X1, Y1, X2, Y2. éÑασ¡¿⌐ ½Ñóδ⌐ πú«½ »α∩¼«πú«½∞¡¿¬á
- «»αÑñѽ∩ÑΓß∩ X1, Y1 ¿ ¡¿ª¡¿⌐ »αáóδ⌐ - X2, Y2. îÑΓ«ñ Init
- »α¿ßóá¿óáÑΓ º¡áτÑ¡¿Ñ ¬««αñ¿¡áΓá¼ »α∩¼«πú«½∞¡¿¬á; ¼ÑΓ«ñ Union
- óδτ¿ß½∩ÑΓ ¡á¿¼Ñ¡∞Φ¿⌐ »α∩¼«πú«½∞¡¿¬, ¬«Γ«αδ⌐ ß«ñÑαª¿Γ ¿ φΓ«Γ
- »α∩¼«πú«½∞¡¿¬, ¿ ñαπú«⌐ »α∩¼«πú«½∞¡¿¬; ¼ÑΓ«ñ Contains ó«ºóαáΘáÑΓ
- True, Ñß½¿ ñá¡¡á∩ Γ«τ¬á ½Ñª¿Γ ó¡πΓα¿ »α∩¼«πú«½∞¡¿¬á, ¿ False - Ñß½¿
- ¡ÑΓ. äαπú¿Ñ ¼ÑΓ«ñδ, Γá¬¿Ñ ¬á¬ »ÑαѼÑΘÑ¡¿Ñ, ¼áßΦΓáí¿α«óá¡¿Ñ,
- óδτ¿ß½Ñ¡¿Ñ »ÑαÑßÑτÑ¡¿⌐ ¿ ΓÑßΓ¿α«óá¡¿Ñ ¡á αáóÑ¡ßΓó« ¼«úπΓ íδΓ∞ ½Ñú¬«
- αÑ὿º«óá¡δ, τΓ«íδ ßñѽáΓ∞ Rect í«½ÑÑ »«½Ñº¡δ¼ «íΩÑ¬Γ«¼.
- ÉÑ὿ºáµ¿∩ ¼ÑΓ«ñ«ó ñ½∩ Rect ¡á Åá߬á½Ñ Γ«½∞¬« »ÑαÑτ¿ß½∩ÑΓ
- ºáú«½«ó¬¿ φΓ¿σ ¼ÑΓ«ñ«ó ß ¬½ετÑóδ¼ ß½«ó«¼ External.
-
- {$L Rect}
- procedure Rect.Init(XA, YA, XB, YB : Integer); External;
- procedure Rect.Union(var R : Rect); External;
- function Rect.Contains(X, Y : Integer) : Boolean; External;
-
- Éáºπ¼ÑÑΓß∩, ¡ÑΓ ¡¿¬á¬¿σ ΓαÑí«óá¡¿⌐, τΓ«íδ óßÑ ¼ÑΓ«ñδ í뫨
- αÑ὿º«óá¡δ ¬á¬ ó¡ÑΦ¡¿Ñ. ïεí«⌐ ¼ÑΓ«ñ ¼«ªÑΓ íδΓ∞ αÑ὿º«óá¡ ½¿í« ¡á
- Åá߬á½Ñ, ½¿í« ¡á ÇßßѼí½ÑαÑ, »« ¡Ñ«íσ«ñ¿¼«ßΓ¿.
- êßσ«ñ¡δ⌐ ΓѬßΓ »α«úαá¼¼δ ¡á áßßѼí½ÑαÑ Rect.Asm, ¬«Γ«αδ⌐
- αÑ὿ºπÑΓ φΓ¿ Γα¿ ó¡ÑΦ¡¿σ ¼ÑΓ«ñá:
-
- TITLE Rect
- LOCALS @@
-
- ; Rect Structure
-
- Rect STRUC
- X1 DW ?
- Y1 DW ?
- X2 DW ?
- Y2 DW ?
- Rect ENDS
-
- code SEGMENT BYTE PUBLIC
-
- ASSUME cs:code
-
- ; procedure Rect.Init(XA, YA, XB, YB: Integer)
-
- PUBLIC Rect@Init
-
- Rect@Init PROC FAR
-
- @XA EQU (WORD PTR[bp+16])
- @YA EQU (WORD PTR[bp+14])
- @XB EQU (WORD PTR[bp+12])
- @YB EQU (WORD PTR[bp+10])
- @Self EQU (DWORD PTR[bp+6])
-
- Push bp ; ß«σαá¡¿Γ∞ bp
- Mov bp,sp ; πßΓá¡«ó¿Γ∞ αẼÑα ßΓѬá
- les di,@Self ; ºáúαπº¿Γ∞ Self ó ES:DI
- cld ; ßñó¿¡πΓ∞ ó»ÑαÑñ
- mov ax,@XA ; X1 := XA
- stosw
- mov ax,@YA ; Y1 := YA
- stosw
- mov ax,@XB ; X2 := XB
- stosw
- mov ax,@YB ; Y2 := YB
- stosw
- pop bp ; ó«ßßΓá¡«ó¿Γ∞ bp
- ret 12 ; óδúαπº¿Γ∞ »áαá¼ÑΓαδ ¿ ó«ºóαáΓ
-
- Rect@Init ENDP
-
- ; procedure Rect.Union(var R: Rect)
-
- PUBLIC Rect@Union
-
- Rect@Union PROC FAR
-
- @R EQU (DWORD PTR [bp+10])
- @Sef EQU (DWORD PTR [bp+6])
-
- push bp ; ß«σαá¡¿Γ∞ bp
- mov bp,sp ; πßΓá¡«ó¿Γ∞ αẼÑα ßΓѬá
- push ds ; ß«σαá¡¿Γ∞ ds
- lds si,@R ; ºáúαπº¿Γ∞ R ó DS:SI
- les di,@Self ; ºáúαπº¿Γ∞ Self ó DS:SI
- cld ; »ÑαÑñó¿¡πΓ∞ ó»ÑαÑñ
- lodsw ; if R.X1 >= X1 goto @@1
- scasw
- jge @@1
- dec di ; X1 := R.X1
- dec di
- stosw
- @@1: lodsw ; if R.Y1 >= Y1 goto @@2
- scasw
- jge @@2
- dec di ; Y1 := R.Y1
- dec di
- stosw
- @@2: lodsw ; if R.X2 <= X2 goto @@3
- scasw
- jle @@3
- dec di ; X2 := R.X2
- dec di
- stosw
- @@3: lodsw ; if R.Y2 <= Y2 goto @@4
- scasw
- jle @@4
- dec di ; Y2 := R.Y2
- dec di
- stosw
- @@4 pop ds ; ó«ßßΓá¡«ó¿Γ∞ ds
- pop bp ; ó«ßßΓá¡«ó¿Γ∞ bp
- ret 8 ; óδúαπº¿Γ∞ »áαá¼ÑΓαδ ¿ ó«ºóαáΓ
-
- Rect@Union ENDP
-
- ; function Rect.Contains(X, Y: Integer): Boolean
-
- PUBLIC Rect@Contains
-
- Rect@Contains PROC FAR
-
- @X EQU (WORD PTR[BP+12])
- @Y EQU (WORD PTR[BP+10])
- @Self EQU (DWORD PTR[BP+6])
-
- push bp ; ß«σαá¡¿Γ∞ bp
- mov bp,sp ; πßΓá¡«ó¿Γ∞ αẼÑα ßΓѬá
- les di,@Self ; ºáúαπº¿Γ∞ Self ó ES:DI
- mov al,0 ; ó«ºóαáΘáÑΓ false
- mov dx,@X ; if (X<X1) or (X>X2) goto @@1
- cmp dx,es:[di].X1
- jl @@1
- cmp dx,es:[di].X2
- jg @@1
- mov dx,@Y ; if (Y<Y1) or (Y>Y2) goto @@2
- cmp dx,es:[di].Y1
- jl @@1
- cmp dx,es:[di].Y2
- jg @@1
- inc ax ; ó«ºóαáΘáÑΓ true
- @@1: pop bp ; ó«ßßΓá¡«ó¿Γ∞ bp
- ret 8 ; óδúαπº¿Γ∞ »áαá¼ÑΓαδ ¿ ó«ºóαáΓ
-
- Rect@Contains ENDP
-
- code ENDS
-
- END
-
-
-
- é«ßßΓá¡«ó½Ñ¡¿Ñ «Φ¿í«¬ ¬«¡ßΓαá¬Γ«αá.
-
- èᬠ«»¿ßá¡« ó ú½áóÑ 16, Turbo Pascal »«ºó«½∩ÑΓ éá¼
- πßΓá¡áó½¿óáΓ∞ Σπ¡¬µ¿¿ «íαáí«Γ¬¿ «Φ¿í«¬ ¬πτ¿ τÑαѺ »ÑαѼѡ¡πε
- HeapError, «íΩ∩ó½Ñ¡¡πε ó ¼«ñπ½Ñ System. ¥Γá 󫺼«ª¡«ßΓ∞
- »«ññÑনóáÑΓß∩ ΓᬠªÑ ó Turbo Pascal, ¡« ñ«»«½¡¿Γѽ∞¡« »«ºó«½∩ÑΓ
- ó«ºñÑ⌐ßΓó«óáΓ∞ ¡á αáí«Γ𠬫¡ßΓαá¬Γ«α«ó «íΩÑ¬Γ¡δσ Γ¿»«ó.
- Å« π¼«½τá¡¿ε, ¬«úñá ¡ÑΓ ñ«ßΓáΓ«τ¡« »á¼∩Γ¿ ñ½∩ αáß»αÑñѽѡ¿∩
- ñ¿¡á¼¿τÑ߬«ú« φ¬ºÑ¼»½∩αá «íΩÑ¬Γ¡«ú« Γ¿»á, óδº«ó ¬«¡ßΓαá¬Γ«αá,
- ¿ß»«½∞ºπεΘ¿⌐ αáßΦ¿αÑ¡¡δ⌐ ß¿¡Γá¬ß¿ß New, úÑ¡Ñα¿απÑΓ «Φ¿í¬π
- óαѼѡ¿ óδ»«½¡Ñ¡¿∩ 203. àß½¿ éδ πßΓá¡áó½¿óáÑΓÑ Σπ¡¬µ¿ε «íαáí«Γ¬¿
- «Φ¿í«¬ ¬πτ¿, ¬«Γ«αá∩ ó«ºóαáΘáÑΓ 1 (ó «Γ½¿τ¿Ñ «Γ ßΓá¡ñáαΓ¡«ú«
- αѺπ½∞ΓáΓá Σπ¡¬µ¿¿ - 0), óδº«ó ¬«¡ßΓαá¬Γ«αá τÑαѺ New íπñÑΓ
- ó«ºóαáΘáΓ∞ nil (ó¼ÑßΓ« áóáα¿⌐¡«ú« ºáóÑαΦÑ¡¿∩ »α«úαá¼¼δ) Ñß½¿ «¡ ¡Ñ
- ¼«ªÑΓ »«½¡«ßΓ∞ε «íαáí«ΓáΓ∞ ºá»α«ß ¡á óδñѽѡ¿Ñ »á¼∩Γ¿.
- è«ñ, ¬«Γ«αδ⌐ »α«¿ºó«ñ¿Γ αáß»αÑñѽѡ¿Ñ ¿ ¿¡¿µ¿á½¿ºáµ¿ε »«½∩ VMT
- ñ¿¡á¼¿τÑ߬«ú« φ¬ºÑ¼»½∩αá ∩ó½∩ÑΓß∩ τáßΓ∞ε óσ«ñ¡«⌐ »«ß½Ññ«óáΓѽ∞¡«ßΓ¿
- ¬«¡ßΓαá¬Γ«αá: ¬«úñá π»αáó½Ñ¡¿Ñ ñ«ßΓ¿úáÑΓ «»ÑαáΓ«αá begin
- ¬«¡ßΓαá¬Γ«αá, φ¬ºÑ¼»½∩α πªÑ αáß»αÑñѽѡ ¿ ¿¡¿µ¿á½¿º¿α«óá¡. àß½¿
- αáß»αÑñѽѡ¿Ñ ¡Ñπß»ÑΦ¡« ¿ Σπ¡¬µ¿∩ «íαáí«Γ¬¿ «Φ¿í«¬ ¬πτ¿ ó«ºóαáΓ¿½á
- 1, ¬«¡ßΓαá¬Γ«α »α«»π߬áÑΓ óδ»«½¡Ñ¡¿Ñ «»ÑαáΓ«α¡«⌐ τáßΓ¿ ¿ ó«ºóαáΘáÑΓ
- π¬áºáΓѽ∞ nil; π¬áºáΓѽ∞, ºáñá¡¡δ⌐ ó »α«µÑñπαÑ New, óδºδóáεΘÑ⌐
- ¬«¡ßΓαá¬Γ«α, πßΓá¡«ó¿Γß∩ ó nil.
-
- Åα¿¼Ñτá¡¿Ñ: éóÑñÑ¡á ¡«óá∩ ßΓá¡ñáαΓ¡á∩ »α«µÑñπαá Fail.
-
- è«úñá π»αáó½Ñ¡¿Ñ ñ«ßΓ¿úáÑΓ «»ÑαáΓ«αá begin ¬«¡ßΓαá¬Γ«αá,
- úáαá¡Γ¿απÑΓß∩, τΓ« φ¬ºÑ¼»½∩α «íΩÑ¬Γ¡«ú« Γ¿»á íδ½ αáß»αÑñѽѡ ¿
- ¿¡¿µ¿á½¿º¿α«óá¡ πß»ÑΦ¡«. Äñ¡á¬« ¬«¡ßΓαá¬Γ«α ßá¼ ¼«ªÑΓ αáß»αÑñѽ∩Γ∞
- ñ¿¡á¼¿τÑ߬¿Ñ »ÑαѼѡ¡δÑ ñ½∩ Γ«ú«, τΓ«íδ ¿¡¿µ¿á½¿º¿α«óáΓ∞ »«½∩
- π¬áºáΓѽÑ⌐ ó φ¬ºÑ¼»½∩αÑ ¿ φΓ¿ αáß»αÑñѽѡ¿∩ ¼«úπΓ ºáóÑαΦ¿Γ∞ß∩
- ¡Ñπß»ÑΦ¡«. àß½¿ φΓ« ß½πτ¿Γß∩, »αáó¿½∞¡« αáºαáí«Γá¡¡δ⌐ ¬«¡ßΓαá¬Γ«α
- ñ«½ªÑ¡ ßñѽáΓ∞ "«Γ¬áΓ" óßÑσ πß»ÑΦ¡δσ αáß»αÑñѽѡ¿⌐ ¿ ó ¬«¡µÑ
- «ßó«í«ñ¿Γ∞ φ¬ºÑ¼»½∩α «íΩÑ¬Γ¡«ú« Γ¿»á Γá¬, τΓ«íδ ó«ºóαáΘáѼδ⌐
- αѺπ½∞ΓáΓ »«½πτ¿½ π¬áºáΓѽ∞ nil. ùΓ«íδ ßñѽáΓ∞ Γᬫ⌐ «Γ¬áΓ
- 󫺼«ª¡δ¼, Turbo Pascal αÑ὿ºπÑΓ ¡«óπε ßΓá¡ñáαΓ¡πε »α«µÑñπαπ,
- ¡áºδóáѼπε Fail, ¬«Γ«αá∩ ¡Ñ ¿¼ÑÑΓ »áαá¼ÑΓα«ó ¿ ¬«Γ«αá∩ ¼«ªÑΓ íδΓ∞
- óδºóá¡á Γ«½∞¬« ¿º ¬«¡ßΓαá¬Γ«αá. é맮ó Fail ºáßΓáó½∩ÑΓ ¬«¡ßΓαá¬Γ«α
- «ßó«í«ªñáΓ∞ ñ¿¡á¼¿τÑ߬¿⌐ φ¬ºÑ¼»½∩α, ¬«Γ«αδ⌐ íδ½ αáß»αÑñѽѡ »α¿
- óσ«ñÑ ó ¬«¡ßΓαá¬Γ«α ¿ »α¿ φΓ«¼ ó«ºóαáΘáΓ∞ π¬áºáΓѽ∞ nil ñ½∩
- ¿¡ñ¿¬áµ¿¿ «Φ¿í¬¿.
- è«úñá ñ¿¡á¼¿τÑ߬¿⌐ φ¬ºÑ¼»½∩α αáß»αÑñѽѡ τÑαѺ αáßΦ¿αÑ¡¡δ⌐
- ß¿¡Γá¬ß¿ß New, º¡áτÑ¡¿Ñ nil ó ºáñá¡¡«¼ π¬áºáΓÑ½Ñ ú«ó«α¿Γ, τΓ«
- «»Ñαᵿ∩ ºá¬«¡τ¿½áß∞ ß «Φ¿í¬«⌐. è ß«ªá½Ñ¡¿ε ¡ÑΓ Γᬫú« π¬áºáΓѽ∩, ß
- »«¼«Θ∞ε ¬«Γ«α«ú« ¼«ª¡« í佫 íδ »α«óÑα¿Γ∞ «»Ñαᵿε ß«ºñá¡¿∩
- ßΓáΓ¿τÑ߬«ú« φ¬ºÑ¼»½∩αá, ¿½¿ ó맮ó π¡áß½Ññ«óá¡¡«ú« ¬«¡ßΓαá¬Γ«αá.
- é¼ÑßΓ« φΓ«ú« Turbo Pascal »«ºó«½∩ÑΓ ¿ß»«½∞º«óáΓ∞ ¬«¡ßΓαá¬Γ«α ó
- óδαáªÑ¡¿¿ ¬á¬ íπ½Ñó߬πε Σπ¡¬µ¿ε: ó«ºóαáΓ True ú«ó«α¿Γ «í πß»ÑσÑ, á
- ó«ºóαáΓ False ú«ó«α¿Γ «í «Φ¿í¬Ñ (í½áú«ñáα∩ ó맮óπ Fail ó¡πΓα¿
- ¬«¡ßΓαá¬Γ«αá).
- æ½ÑñπεΘá∩ »α«úαá¼¼á αÑ὿ºπÑΓ ñóá »α«ßΓδσ «íΩÑ¬Γ¡δσ Γ¿»á,
- ß«ñÑαªáΘ¿σ π¬áºáΓѽ¿. ÅÑαóá∩ óÑαß¿∩ »α«úαá¼¼δ ¡Ñ αÑ὿ºπÑΓ
- ó«ßßΓá¡«ó½Ñ¡¿Ñ «Φ¿í«¬ ¬«¡ßΓαá¬Γ«αá.
-
- type
- LinePtr = ^Line;
- Line = String[79];
- BasePtr = ^Base;
- Base = Object
- L1, L2: LinePtr;
- Constructor Init(S1, S2: Line);
- Destructor Done; virtual;
- procedure Dump; virtual;
- end;
-
- DerivedPtr = ^Derived;
- Derived = object(Base)
- L3, L4: LinePtr;
- Constructor Init(S1, S2, S3, S4: Line);
- Destructor Done; virtual;
- procedure Dump; virtual;
- end;
-
- var
- BP: BasePtr;
- DP: DerivedPtr;
-
- Constructor Base.Init(S1, S2: Line);
- begin
- New(L1);
- New(L2);
- L1^ := S1;
- L2^ := S2;
- end;
-
- Destructor Base.Done;
- begin
- Dispose(L2);
- Dispose(L1);
- end;
-
- procedure Base.Dump;
- begin
- Writeln('B: ', L1^, ',', L2^, '.');
- end;
-
- Constructor Derived.Init(S1, S2, S3, S4: Line);
- begin
- Base.Init(S1, S2);
- New(L3);
- New(L4);
- L3^ := S3;
- L4^ := S4;
- end;
-
- Destructor Derived.Done;
- begin
- Dispose(L4);
- Dispose(L3);
- Base.Done;
- end;
-
- procedure Derived.Dump;
- begin
- Writeln('D: ', L1^, ',', L2^, ',', L3^, ',', L4^, '.');
- end;
-
- begin
- New(BP, Init('Turbo', 'Pascal'));
- New(DP, Init('North', 'East', 'South', 'West'));
- BP^.Dump;
- DP^.Dump;
- Dispose(DP, Done);
- Dispose(BP, Done);
- end.
-
-
- æ½ÑñπεΘ¿⌐ »α¿¼Ñα ñѼ«¡ßΓα¿απÑΓ ¬á¬ »αÑñδñπΘ¿⌐ ¼«ªÑΓ íδΓ∞
- »ÑαÑ»¿ßá¡ ß ¿ß»«½∞º«óá¡¿Ñ ó«ßßΓá¡«ó½Ñ¡¿∩ «Φ¿í«¬. ÄíΩ∩ó½Ñ¡¿∩ Γ¿»«ó ¿
- »ÑαѼѡ¡δσ ¡Ñ »«óΓ«α∩εΓß∩, Γ.¬. «¡¿ «ßΓáεΓß∩ Γᬿ¼¿ ªÑ.
-
-
- Constructor Base.Init(S1, S2: Line);
- begin
- New(L1);
- New(L2);
- if (L1 = nil) or (L2 = nil) then
- begin
- Base.Done;
- Fail;
- end;
- L1^ := S1;
- L2^ := S2;
- end;
-
- Destructor Base.Done;
- begin
- if L2 <> nil then Dispose(L2);
- if L1 <> nil then Dispose(L1);
- end;
-
- Constructor Derived.Init(S1, S2, S3, S4: Line);
- begin
- if not Base.Init(S1, S2) then Fail;
- New(L3);
- New(L4);
- if (L3 = nil) or (L4 = nil) then
- begin
- Derived.Done;
- Fail;
- end;
- L3^ := S3;
- L4^ := S4;
- end;
-
- Destructor Derived.Done;
- begin
- if L4 <> nil then Dispose(L4);
- if L3 <> nil then Dispose(L3);
- Base.Done;
- end;
-
- {$F+}
- function HeapFunc(Size: Word): Integer;
- begin
- HeapFunc := 1;
- end;
- {$F-}
-
- begin
- HeapError := @HeapFunc; {πßΓá¡«ó¬á π»αáó½Ñ¡¿∩ «Φ¿í¬á¼¿
- ¬πτ¿}
- New(BP, Init('Turbo', 'Pascal'));
- New(DP, Init('North', 'East', 'South', 'West'));
- if (BP = nil) or (DP = nil) then
- Writeln('OΦ¿í¬á αáß»αÑñѽѡ¿∩')
- else
- begin
- BP^.Dump;
- DP^.Dump;
- end;
- if DP <> nil then Dispose(DP, Done);
- if BP <> nil then Dispose(BP, Done);
- end.
-
- çá¼ÑΓ∞ΓÑ ¬á¬ ß««ΓóÑΓßΓóπεΘ¿Ñ ñÑßΓαá¬Γ«αδ ó Base.Init ¿
- Derived.Init ¿ß»«½∞ºπεΓß∩ ñ½∩ «Γ¬áΓá »«ß½Ñ óßÑσ πß»ÑΦ¡δσ
- αáß»αÑñѽѡ¿⌐ »ÑαÑñ óδº«ó«¼ Fail. çá¼ÑΓ∞ΓÑ ΓᬠªÑ, ¬á¬ óδºδóáÑΓß∩
- Base.Init ó Derived.Init ñ½∩ Γ«ú«, τΓ«íδ »α«óÑα¿Γ∞ πß»ÑΦ¡δ⌐ ó맮ó
- π¡áß½Ññ«óá¡¡«ú« ¬«¡ßΓαá¬Γ«αá.
-