home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BBS 1
/
BBS#1.iso
/
document
/
pas60pg.lzh
/
PG17.MY
< prev
next >
Wrap
Text File
|
1991-02-04
|
29KB
|
731 lines
âïÇéÇ 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 ñ½∩ Γ«ú«, τΓ«íδ »α«óÑα¿Γ∞ πß»ÑΦ¡δ⌐ ó맮ó
π¡áß½Ññ«óá¡¡«ú« ¬«¡ßΓαá¬Γ«αá.