home *** CD-ROM | disk | FTP | other *** search
/ BBS 1 / BBS#1.iso / document / pas60pg.lzh / PG17.MY < prev    next >
Text File  |  1991-02-04  |  29KB  |  731 lines

  1.                              âïÇéÇ 17.
  2.  
  3.                     éìôÆÉàììêë öÄÉîÇÆ ÄüÜàèÆÄé.
  4.  
  5.      é¡πΓαÑ¡¡¿⌐ Σ«α¼áΓ  «íΩѬΓá  »«σ«ª  ¡á  ºá»¿ß∞.  Å«½∩   «íΩѬΓá
  6. ºá»«¼¿¡áεΓß∩     ó     »«α∩ñ¬Ñ    «íΩ∩ó½Ñ¡¿∩,    ¬á¬    ¡Ñ»αÑαδó¡á∩
  7. »«ß½Ññ«óáΓѽ∞¡«ßΓ∞ »ÑαѼѡ¡δσ.  ïεíδÑ »«½∩,  π¡áß½Ññ«óá¡¡δÑ «Γ Γ¿»á
  8. »αÑñ¬á  ºá»«¼¿¡áεΓß∩  ñ«  ¡«óδσ  »«½Ñ⌐,  «»αÑñѽѡ¡δσ ó »«α«ªñÑ¡¡«¼
  9. Γ¿»Ñ.
  10.      àß½¿ «íΩÑ¬Γ¡δ⌐ Γ¿» «»αÑñѽ∩ÑΓ ó¿αΓπá½∞¡δÑ ¼ÑΓ«ñδ, ¬«¡ßΓαá¬Γ«αδ
  11. ¿½¿ ñÑßΓαá¬Γ«αδ,    ¬«¼»¿½∩Γ«α  αáß»αÑñѽ∩ÑΓ  ñ«»«½¡¿Γѽ∞¡«Ñ »«½Ñ ó
  12. «íΩÑ¬Γ¡«¼ Γ¿»Ñ.  ¥Γ« 16-Γ¿ í¿Γ«ó«Ñ »«½Ñ,  ¡áºδóáѼ«Ñ »«½Ñ¼  Γáí½¿µδ
  13. ó¿αΓπá½∞¡«ú« ¼ÑΓ«ñá  (VMT)  ¿ ¿ß»«½∞ºπÑΓß∩ ñ½∩ ºá»«¼¿¡á¡¿∩ ß¼ÑΘÑ¡¿∩
  14. VMT φΓ«ú« «íΩÑ¬Γ¡«ú« Γ¿»á ó  ßÑú¼Ñ¡ΓÑ  ñá¡¡δσ.   Å«½Ñ  VMT  ß½ÑñπÑΓ
  15. ¡Ñ»«ßαÑñßΓóÑ¡¡« »«ß½Ñ   «íδτ¡δσ  »«½Ñ⌐  ó  «íΩÑ¬Γ¡«¼  Γ¿»Ñ.   è«úñá
  16. «íΩÑ¬Γ¡δ⌐ Γ¿»   ¡áß½ÑñπÑΓ  ó¿αΓπá½∞¡δÑ  ¼ÑΓ«ñδ,   ¬«¡ßΓαá¬Γ«αδ  ¿½¿
  17. ñÑßΓαá¬Γ«αδ, «¡  ΓᬠªÑ ¡áß½ÑñπÑΓ »«½Ñ VMT, »α¿ φΓ«¼ ñ«»«½¡¿Γѽ∞¡«Ñ
  18. »«½Ñ ¡Ñ αáß»αÑñѽ∩ÑΓß∩.
  19.      ê¡¿µ¿á½¿ºáµ¿∩ »«½∩ VMT φ¬ºÑ¼»½∩αá  »α«¿ºó«ñ¿Γß∩  ¬«¡ßΓαá¬Γ«α«¼
  20. «íΩÑ¬Γ¡«ú«  Γ¿»á.  Åα«úαἼᠠ¡¿¬«úñá  ∩ó¡«  ¡Ñ ¿¡¿µ¿á½¿º¿απÑΓ ¿ ¡Ñ
  21. «íαáΘáÑΓß∩ ¬ »«½ε VMT.
  22.      æ½ÑñπεΘ¿Ñ »α¿¼Ñαδ  ¿½½εßΓα¿απεΓ  ó¡πΓαÑ¡¡¿⌐  Σ«α¼áΓ  «íΩÑ¬Γ¡δσ
  23. Γ¿»«ó.
  24.  
  25.      type
  26.        LocationPtr = ^Location;
  27.        Location = object
  28.          X, Y: Integer;
  29.          procedure Init(PX, PY: Integer);
  30.          function GetX: Integer;
  31.          function GetY: Integer;
  32.        end;
  33.  
  34.        PointPtr = ^Point;
  35.        Point    = object(Location)
  36.          Color: Integer;
  37.          constructor Init(PX, PY, PColor: Integer);
  38.          destructor Done; virtual;
  39.          procedure Show; virtual;
  40.          procedure Hide; virtual;
  41.          procedure MoveTo(PX, PY: Integer);
  42.        end;
  43.  
  44.        CirclePtr = ^Circle;
  45.        Circle = object(Point)
  46.          Radius: Integer;
  47.          constructor Init(PX, PY: Integer;
  48.                           PColor, PRadius: Integer);
  49.          procedure Show; virtual;
  50.          procedure Hide; virtual;
  51.          procedure Fill; virtual;
  52.        end;
  53.  
  54.      É¿ß. 17.1   »«¬áºδóáÑΓ  ß½«¿  φ¬ºÑ¼»½∩α«ó  Location,  Point  ¿
  55. Circle; ¬áªñδ⌐ »α∩¼«πú«½∞¡¿¬ ß««ΓóÑΓßΓóπÑΓ «ñ¡«¼π ß½«óπ »á¼∩Γ¿.
  56.  
  57.        É¿ß. 17.1 æ½«¿ φ¬ºÑ¼»½∩α«ó Location, Point ¿ Circle.
  58.  
  59.  
  60.            Location           Point            Circle
  61.          ┌──────────┐     ┌───────────┐     ┌───────────┐
  62.          │ X        │     │ X         │     │ X         │
  63.          ├──────────┤     ├───────────┤     ├───────────┤
  64.          │ Y        │     │ Y         │     │ Y         │
  65.          └──────────┘     ├───────────┤     ├───────────┤
  66.                           │ Color     │     │ Color     │
  67.                           ├───────────┤     ├───────────┤
  68.                           │ VMT       │     │ VMT       │
  69.                           └───────────┘     ├───────────┤
  70.                                             │ Radius    │
  71.                                             └───────────┘
  72.  
  73.  
  74.      Å«ß¬«½∞¬π Point ∩ó½∩ÑΓß∩  »Ñαóδ¼  Γ¿»«¼  ó  ¿Ñαáασ¿¿,  ¬«Γ«αδ⌐
  75. óó«ñ¿Γ  ó¿αΓπá½∞¡δÑ  ¼ÑΓ«ñδ,  »«½Ñ  VMT  αáß»αÑñѽ∩ÑΓß∩  »«ß½Ñ »«½∩
  76. Color.
  77.  
  78.                      Æáí½¿µδ ó¿αΓπá½∞¡δσ ¼ÑΓ«ñ«ó.
  79.  
  80.      èáªñδ⌐ «íΩÑ¬Γ¡δ⌐  Γ¿»,    ¬«Γ«αδ⌐   ß«ñÑαª¿Γ   ¿½¿   ¡áß½ÑñπÑΓ
  81. ó¿αΓπá½∞¡δÑ ¼ÑΓ«ñδ,     ¬«¡ßΓαá¬Γ«αδ    ¿½¿   ñÑßΓαá¬Γ«αδ,    ¿¼ÑÑΓ
  82. ß««ΓóÑΓßΓóπεΘπε Ñ¼π VMT,   ¬«Γ«αá∩  σαá¡¿Γß∩  ó  ¿¡¿µ¿á½¿º¿α«óá¡¡«⌐
  83. τáßΓ¿ ßÑú¼Ñ¡Γá  ñá¡¡δσ  »α«úαá¼¼δ.   æπΘÑßΓóπÑΓ Γ«½∞¬« «ñ¡á VMT ñ½∩
  84. «íΩÑ¬Γ¡«ú« Γ¿»á (á ¡Ñ ñ½∩ φ¬ºÑ¼»½∩αá),  ¡« ñóá αẽ¿τ¡δσ  «íΩÑ¬Γ¡δσ
  85. Γ¿»á ¡¿¬«úñá  ¡Ñ  αáºñѽ∩εΓ  VMT,   ¬á¬ íδ »«σ«ª¿ «¡¿ ¡Ñ í뫨.  VMT
  86. ßΓα«¿Γß∩ ¬«¼»¿½∩Γ«α«¼   áóΓ«¼áΓ¿τÑ߬¿   ¿    ¡¿¬«úñá    »α∩¼«    ¡Ñ
  87. «íαáíáΓδóáÑΓß∩ »α«úαá¼¼«⌐.    èα«¼Ñ   Γ«ú«,    π¬áºáΓѽ¿   ¡á   VMT
  88. áóΓ«¼áΓ¿τÑ߬¿ ºá»«¼¿¡áεΓß∩    ó    φ¬ºÑ¼»½∩αÑ    «íΩÑ¬Γ¡«ú«    Γ¿»á
  89. ¬«¡ßΓαá¬Γ«α«¼ φΓ«ú«  «íΩÑ¬Γ¡«ú«  Γ¿»á  ¿  ¡¿¬«úñá ¡Ñ «íαáíáΓδóáεΓß∩
  90. »α«úαá¼¼«⌐.
  91.      ÅÑαó«Ñ ß½«ó« VMT ß«ñÑαª¿Γ αẼÑα φ¬ºÑ¼»½∩α«ó,  áßß«µ¿¿α«óá¡¡δσ
  92. ß «íΩÑ¬Γ¡δ¼ Γ¿»«¼; φΓá  ¿¡Σ«α¼áµ¿∩  ¿ß»«½∞ºπÑΓß∩  ¬«¡ßΓαá¬Γ«αἿ  ¿
  93. ñÑßΓαá¬Γ«αἿ ñ½∩  «»αÑñѽѡ¿∩  ß¬«½∞¬« íá⌐Γ ¡πª¡« αáß»αÑñѽ¿Γ∞ ¿½¿
  94. «ßó«í«ñ¿Γ∞, ¿ß»«½∞ºπ∩ αáßΦ¿αÑ¡¡δ⌐ ß¿¡Γá¬ß¿ß New ¿ Dispose.
  95.      éΓ«α«Ñ ß½«ó«  VMT  ß«ñÑαª¿Γ  «Γα¿µáΓѽ∞¡δ⌐ αẼÑα φ¬ºÑ¼»½∩α«ó,
  96. ßó∩ºá¡¡δσ ß «íΩÑ¬Γ¡δ¼ Γ¿»«¼; φΓá ¿¡Σ«α¼áµ¿∩ ¿ß»«½∞ºπÑΓß∩ ¼Ñσá¡¿º¼«¼
  97. óÑα¿Σ¿¬áµ¿¿ ó맮ó«ó       ó¿αΓπá½∞¡δσ   ¼ÑΓ«ñ«ó   ñ½∩   «»αÑñѽѡ¿∩
  98. ¡Ñ¿¡¿µ¿á½¿º¿α«óá¡¡δσ «íΩÑ¬Γ«ó (φ¬ºÑ¼»½∩α«ó,  ñ½∩  ¬«Γ«αδσ  ¡Ñ  í佫
  99. ó맮óá ¬«¡ßΓαá¬Γ«αá) ¿ ñ½∩ »α«óÑન µÑ½«ßΓ¡«ßΓ¿ VMT. è«úñá ¼Ñσá¡¿º¼
  100. óÑα¿Σ¿¬áµ¿¿ ó¿αΓπá½∞¡δσ  ó맮ó«ó   ó¬½ετÑ¡   (¿ß»«½∞ºπ∩   ñ¿αÑ¬Γ¿óπ
  101. ¬«¼»¿½∩Γ«αá   {$R+},   ¬«Γ«αá∩  αáßΦ¿αÑ¡á  ñ½∩  ó¬½ετÑ¡¿∩  »α«óÑન
  102. ó¿αΓπá½∞¡δσ  ¼ÑΓ«ñ«ó),  ¬«¼»¿½∩Γ«α   úÑ¡Ñα¿απÑΓ   óδº«ó   »α«úαá¼¼δ
  103. óÑα¿Σ¿¬áµ¿¿   VMT   »ÑαÑñ  ¬áªñδ¼  ó¿αΓπá½∞¡δ¼  ó맮ó«¼.  Åα«úαá¼¼á
  104. óÑα¿Σ¿¬áµ¿¿ VMT »α«óÑα∩ÑΓ,  τΓ« »Ñαó«Ñ ß½«ó« VMT ¡Ñ αáó¡« 0  ¿  τΓ«
  105. ßπ¼¼á  »Ñαó«ú«  ¿  óΓ«α«ú«  ß½«ó = 0.  àß½¿ ¬á¬á∩-Γ« ¿º »α«óÑ᫬ ¡Ñ
  106. »α«σ«ñ¿Γ, úÑ¡Ñα¿απÑΓß∩ «Φ¿í¬á óαѼѡ¿ óδ»«½¡Ñ¡¿∩ 210.
  107.  
  108.      Åα¿¼Ñτá¡¿Ñ: é¬½ετÑ¡¿Ñ  »α«óÑન  ¡á  ñ¿á»áº«¡  ¿   óÑα¿Σ¿¬áµ¿¿
  109. ó맮ó«ó  ó¿αΓπá½∞¡δσ  ¼ÑΓ«ñ«ó  ºá¼Ññ½∩ÑΓ éáΦπ »α«úαá¼¼π ¿ ñѽáÑΓ ÑÑ
  110. º¡áτ¿Γѽ∞¡« í«½∞ΦÑ,  »«φΓ«¼π ¿ß»«½∞ºπ⌐ΓÑ ß«ßΓ«∩¡¿Ñ {$R+} Γ«½∞¬«  ó«
  111. óαѼ∩  «Γ½áñ¬¿  ¿  »ÑαÑσ«ñ¿ΓÑ  ó  ß«ßΓ«∩¡¿Ñ {$R-} ñ½∩ «¬«¡τáΓѽ∞¡«⌐
  112. óÑαß¿¿ »α«úαá¼¼δ.
  113.  
  114.      ê ¡á¬«¡Ñµ,   ¡áτ¿¡á∩ ß« ß¼ÑΘÑ¡¿∩ 4 ó VMT ¡áσ«ñ¿Γß∩ ß»¿ß«¬ 32-σ
  115. í¿Γ¡δσ π¬áºáΓѽÑ⌐ ¡á ¼ÑΓ«ñ,   »«  «ñ¡«¼π  ¡á  ó¿αΓπá½∞¡δ⌐  ¼ÑΓ«ñ  ó
  116. «íΩÑ¬Γ¡«¼ Γ¿»Ñ,   ó »«α∩ñ¬Ñ «íΩ∩ó½Ñ¡¿∩.  èáªñ«Ñ »«½Ñ ß«ñÑαª¿Γ áñαÑß
  117. Γ«τ¬¿ óσ«ñá ß««ΓóÑΓßΓóπεΘÑú« ó¿αΓπá½∞¡«ú« ¼ÑΓ«ñá.
  118.      É¿ß.17.2 »«¬áºδóáÑΓ ß½«¿ VMT ñ½∩ Γ¿»«ó  Point  ¿  Circle  (Æ¿»
  119. Location  ¡Ñ  ¿¼ÑÑΓ  VMT  Γᬠ ¬á¬ ¡Ñ ß«ñÑαª¿Γ ó¿αΓπá½∞¡δσ ¼ÑΓ«ñ«ó,
  120. ¬«¡ßΓαá¬Γ«α«ó  ¿  ñÑßΓαá¬Γ«α«ó);  ¬áªñδ⌐  ¼á½Ñ¡∞¬¿⌐   »α∩¼«πú«½∞¡¿¬
  121. ß««ΓóÑΓßΓóπÑΓ «ñ¡«¼π ß½«óπ »á¼∩Γ¿, á ¬áªñδ⌐ í«½∞Φ«⌐ - ñóπ¼.
  122.  
  123.                É¿ß.17.2 æ½«¿ VMT ñ½∩ Point ¿ Circle.
  124.  
  125.               Point VMT                 Circle VMT
  126.           ┌───────────────┐         ┌────────────────┐
  127.           │ $0008         │         │ $000A          │
  128.           ├───────────────┤         ├────────────────┤
  129.           │ $FFF8         │         │ $FFF6          │
  130.           ├───────────────┤         ├────────────────┤
  131.           │ @Point.Done   │         │ @Point.Done    │
  132.           ├───────────────┤         ├────────────────┤
  133.           │ @Point.Show   │         │ @Circle.Show   │
  134.           ├───────────────┤         ├────────────────┤
  135.           │ @Point.Hide   │         │ @Circle.Hide   │
  136.           ├───────────────┤         ├────────────────┤
  137.           │ @Point.MoveTo │         │ @Point.MoveTo  │
  138.           └───────────────┘         ├────────────────┤
  139.                                     │ @Circle.Fill   │
  140.                                     └────────────────┘
  141.  
  142.  
  143.      çá¼ÑΓ∞ΓÑ, ¬á¬ Circle ¡áß½ÑñπÑΓ ¼ÑΓ«ñδ MoveTo ¿ Down ¿º Point ¿
  144. ¬á¬ «¡ »ÑαѬαδóáÑΓ ¼ÑΓ«ñδ Show ¿ Hide.
  145.      èá¬ π»«¼∩¡πΓ«  αá¡ÑÑ,  ¬«¡ßΓαá¬Γ«α  «íΩÑ¬Γ¡«ú«  Γ¿»á  ß«ñÑনΓ
  146. ߻ѵ¿á½∞¡δ⌐ ¬«ñ,  ¬«Γ«αδ⌐ ß«σαá¡∩ÑΓ ß¼ÑΘÑ¡¿Ñ VMT «íΩÑ¬Γ¡«ú« Γ¿»á  ó
  147. ¿¡¿µ¿á½¿º¿απѼ«¼ φ¬ºÑ¼»½∩αÑ.  ìá»α¿¼Ñα:  »πßΓ∞ ñá¡ φ¬ºÑ¼»½∩α É Γ¿»á
  148. Point  ¿  φ¬ºÑ¼»½∩α  C  Γ¿»á  Circle,  Γ«úñá  ó맮ó  P.Init   íπñÑΓ
  149. áóΓ«¼áΓ¿τÑ߬¿   ß«σαá¡∩Γ∞   ß¼ÑΘÑ¡¿Ñ  VMT  ñ½∩  Point  ó  »«½Ñ  VMT
  150. φ¬ºÑ¼»½∩αá P ¿ ó맮ó C.Init íπñÑΓ ß«σαá¡∩Γ∞ ß¼ÑΘÑ¡¿Ñ VMT ñ½∩ Circle
  151. ó »«½Ñ VMT φ¬ºÑ¼»½∩αá C.  ¥Γá áóΓ«¼áΓ¿τÑ߬á∩ ¿¡¿µ¿á½¿ºáµ¿∩ ∩ó½∩ÑΓß∩
  152. τáßΓ∞ε óσ«ñ¡«ú« ¬«ñá ¬«¡ßΓαá¬Γ«αá Γá¬,  τΓ«  ó  Γ«Γ  ¼«¼Ñ¡Γ,  ¬«úñá
  153. π»αáó½Ñ¡¿Ñ  ñ«ßΓ¿úáÑΓ  «»ÑαáΓ«αá begin ¬«¡ßΓαá¬Γ«αá,  »«½Ñ Self VMT
  154. πªÑ πßΓá¡«ó½Ñ¡«.  Å«φΓ«¼π, Ñß½¿ ó«º¡¿¬½á ¡Ñ«íσ«ñ¿¼«ßΓ∞, ¬«¡ßΓαá¬Γ«α
  155. ¼«ªÑΓ ßñѽáΓ∞ ó맮ó ó¿αΓπá½∞¡«ú« ¼ÑΓ«ñá.
  156.  
  157.  
  158.                     æΓá¡ñáαΓ¡á∩ Σπ¡¬µ¿∩ SizeOf.
  159.  
  160.      è«úñá ßΓá¡ñáαΓ¡á∩  Σπ¡¬µ¿∩  SizeOf  »α¿¼Ñ¡∩ÑΓß∩  ¬  φ¬ºÑ¼»½∩απ
  161. «íΩÑ¬Γ¡«ú« Γ¿»á,  ¿¼ÑεΘÑú« VMT, «¡á ó«ºóαáΘáÑΓ αẼÑα, σαá¡∩Θ¿⌐ß∩ ó
  162. φΓ«⌐ VMT.  Å«φΓ«¼π, ñ½∩ «íΩÑ¬Γ¡δσ Γ¿»«ó, ¿¼ÑεΘ¿σ VMT, SizeOf óßÑúñá
  163. ó«ºóαáΘáÑΓ ¡Ñ «íΩ∩ó½Ñ¡¡δ⌐, á ñÑ⌐ßΓó¿Γѽ∞¡δ⌐ αẼÑα φ¬ºÑ¼»½∩αá.
  164.  
  165.  
  166.                     æΓá¡ñáαΓ¡á∩ Σπ¡¬µ¿∩ TypeOf.
  167.  
  168.      Turbo Pascal  ñ«íáó½∩ÑΓ  ¡«óπε  ßΓá¡ñáαΓ¡πε  Σπ¡¬µ¿ε   TypeOf,
  169. ¬«Γ«αá∩  ó«ºóαáΘáÑΓ π¬áºáΓѽ∞ ¡á VMT «íΩÑ¬Γ¡«ú« Γ¿»á.  TypeOf ¿¼ÑÑΓ
  170. Ññ¿¡ßΓóÑ¡¡δ⌐ »áαá¼ÑΓα,  ¬«Γ«αδ⌐  ¼«ªÑΓ  íδΓ∞  ½¿í«  ¿ñÑ¡Γ¿Σ¿¬áΓ«α«¼
  171. «íΩÑ¬Γ¡«ú« Γ¿»á,  ½¿í« φ¬ºÑ¼»½∩α«¼ «íΩÑ¬Γ¡«ú« Γ¿»á. é «í«¿σ ß½πτá∩σ
  172. αѺπ½∞ΓáΓ Γ¿»á  Pointer ∩ó½∩ÑΓß∩ π¬áºáΓѽѼ ¡á VMT «íΩÑ¬Γ¡«ú« Γ¿»á.
  173. TypeOf ¼«ªÑΓ íδΓ∞ »α¿¼Ñ¡Ñ¡ Γ«½∞¬« ¬ «íΩÑ¬Γ¡δ¼ Γ¿»á¼,  ¿¼ÑεΘ¿¼ VMT -
  174. ñ½∩ óßÑσ ñαπú¿σ Γ¿»«ó φΓ« íπñÑΓ «Φ¿í¬«⌐.
  175.      öπ¡¬µ¿∩ TypeOf    ¼«ªÑΓ   íδΓ∞   ¿ß»«½∞º«óá¡á   ñ½∩   »α«óÑન
  176. ñÑ⌐ßΓó¿Γѽ∞¡«ú« Γ¿»á φ¬ºÑ¼»½∩αá. ìá»α¿¼Ñα:
  177.  
  178.      if TypeOf(Self) = ÆypeOf(Point) then ...
  179.  
  180.  
  181.                     é맮óδ ó¿αΓπá½∞¡δσ ¼ÑΓ«ñ«ó.
  182.  
  183.      ùΓ«íδ óδºóáΓ∞  ó¿αΓπá½∞¡δ⌐  ¼ÑΓ«ñ,  ¬«¼»¿½∩Γ«α úÑ¡Ñα¿απÑΓ ¬«ñ,
  184. ¬«Γ«αδ⌐ π¬áºδóáÑΓ ¡á áñαÑß VMT ¿º  »«½∩  VMT  ó  «íΩѬΓÑ,  ¿  ºáΓѼ
  185. óδºδóáÑΓ  τÑαѺ  »«½Ñ,  ßó∩ºá¡¡«Ñ  ß  φΓ¿¼ ¼ÑΓ«ñ«¼.  ìá»α¿¼Ñα:  ñ½∩
  186. »ÑαѼѡ¡«⌐ PP Γ¿»á PointPtr  ó맮ó  PP^.Show  úÑ¡Ñα¿απÑΓ  ß½ÑñπεΘ¿⌐
  187. ¬«ñ:
  188.  
  189.      les    di,PP              ; çáúαπº¿Γ∞ PP ó ES:DI
  190.      push   es                 ; »ÑαÑñáΓ∞ ¬á¬ Self »áαá¼ÑΓα
  191.      push   di
  192.      mov    di,es:[di + 6]     ; «Γ¼ÑΓ¿Γ∞ ß¼ÑΘÑ¡¿Ñ VMT ¿º »«½∩ VMT
  193.      call   DWORD PTR [di+8]   ; óδºóáΓ∞ Γ«τ¬π óσ«ñá ó VMT ñ½∩ Show
  194.  
  195.  
  196.      Åαá󿽫 ß«ó¼ÑßΓ¿¼«ßΓ¿   ñ½∩   «íΩÑ¬Γ¡δσ   Γ¿»«ó  »«ºó«½∩ÑΓ  PP
  197. π¬áºδóáΓ∞ ¡á Point ¿½¿ Circle, ¿½¿ ¡á ½εí«⌐ ñαπú«⌐ Γ¿», »«α«ªñÑ¡¡δ⌐
  198. «Γ Point.  ê Ñß½¿ éδ »α«óÑα¿ΓÑ VMT,  »«¬áºá¡¡πε ºñÑß∞,  éδ πó¿ñ¿ΓÑ,
  199. τΓ« ñ½∩ Point Γ«τ¬á ó VMT ß« ß¼ÑΘÑ¡¿Ñ¼ 8 π¬áºδóáÑΓ ¡á Point.Show, ó
  200. Γ«  óαѼ∩,  ¬á¬  ñ½∩  Circle  «¡á  π¬áºδóáÑΓ ¡á Circle.Show.  Æᬿ¼
  201. «íαẫ¼, ó ºáó¿ß¿¼«ßΓ¿ «Γ á¬Γπá½∞¡«ú« (óαѼѡ¿ óδ»«½¡Ñ¡¿∩) Γ¿»á PP,
  202. ¿¡ßΓαπ¬µ¿∩ CALL óδºδóáÑΓ Point.Show ¿½¿ Circle.Show, ¿½¿ ¼ÑΓ«ñ Show
  203. ½εí«ú« ñαπú«ú« Γ¿»á, »«α«ªñÑ¡¡«ú« «Γ Point.
  204.      àß½¿ Show  -  ßΓáΓ¿τÑ߬¿⌐ ¼ÑΓ«ñ,  Γ« ñ½∩ ó맮óá PP^.Show íπñÑΓ
  205. úÑ¡Ñα¿α«óáΓ∞ß∩ ¬«ñ:
  206.  
  207.      les      di,PP               ; çáúαπº¿Γ∞ PP ó ES:DI
  208.      push     es                  ; »ÑαÑñáΓ∞ ¬á¬ Self »áαá¼ÑΓα
  209.      push     di
  210.      call     Point.Show          ; »α∩¼«⌐ ó맮ó Point.Show
  211.  
  212.      çñÑß∞ ó¡Ñ ºáó¿ß¿¼«ßΓ¿ «Γ Γ«ú«,  ¡á τΓ« π¬áºδóáÑΓ PP, ¬«ñ íπñÑΓ
  213. óßÑúñá íπñÑΓ óδºδóáΓ∞ ¼ÑΓ«ñ Point.Show.
  214.  
  215.  
  216.                    æ«ú½áΦÑ¡¿Ñ « ó맮óáσ ¼ÑΓ«ñ«ó.
  217.  
  218.      îÑΓ«ñδ ¿ß»«½∞ºπεΓ ΓᬿѠªÑ ß«ú½áΦÑ¡¿∩ « ó맮óáσ,  ¬á¬  «íδτ¡δÑ
  219. »α«µÑñπαδ ¿  Σπ¡¬µ¿¿,  ºá ¿ß¬½ετÑ¡¿Ñ¼ Γ«ú«,  τΓ« ¬áªñδ⌐ ¼ÑΓ«ñ ¿¼ÑÑΓ
  220. ñ«»«½¡¿Γѽ∞¡δ⌐ ¡Ñ∩ó¡δ⌐   »áαá¼ÑΓα,    ¡áºδóáѼδ⌐   Self,    ¬«Γ«αδ⌐
  221. ß««ΓóÑΓßΓóπÑΓ var  -  »áαá¼ÑΓαπ  Γ«ú«  ªÑ  Γ¿»á,  ¬á¬ «íΩÑ¬Γ¡δ⌐ Γ¿»
  222. ¼ÑΓ«ñá. Åáαá¼ÑΓα Self óßÑúñá »ÑαÑñáÑΓß∩ ¬á¬  »«ß½Ññ¡¿⌐  »áαá¼ÑΓα  ¿
  223. óßÑúñá ¿¼ÑÑΓ  Σ«α¼π  32-σ  í¿Γ«ó«ú«  π¬áºáΓѽ∩ ¡á φ¬ºÑ¼»½∩α,  τÑαѺ
  224. ¬«Γ«αδ⌐ ¼ÑΓ«ñ  óδºδóáÑΓß∩.   ìá»α¿¼Ñα,   ñ½∩  »ÑαѼѡ¡«⌐  PP   Γ¿»á
  225. PointPtr, «»αÑñѽѡ¡δ⌐ αá¡ÑÑ, ó맮ó PP^.MoveTo(10, 20) ¬«ñ¿απÑΓß∩:
  226.  
  227.      Mov     ax,10             ; ºáúαπº¿Γ∞ 10 ó AX
  228.      Push    ax                ; »ÑαÑñáΓ∞ ÉX ¬á¬ »áαá¼ÑΓα
  229.      Mov     ax,20             ; ºáúαπº¿Γ∞ 20 ó AX
  230.      Push    ax                ; »ÑαÑñáΓ∞ ÉY ¬á¬ »áαá¼ÑΓα
  231.      les     di, pp            ; çáúαπº¿Γ∞ PP ó ES:DI
  232.      push    es                ; »ÑαÑñáΓ∞ ¬á¬ Self »áαá¼ÑΓα
  233.      push    di
  234.      mov     di,es:[di+6]      ; «Γ¼ÑΓ¿Γ∞ ß¼ÑΘÑ¡¿Ñ VMT ¿º »«½∩ VMT
  235.      call    DWORD PTR [di+16] ; óδºóáΓ∞ Γ«τ¬π óσ«ñá ó VMT ñ½∩
  236.                                ; MoveTo
  237.  
  238.      ä« ó«ºóαáΓá  ¼ÑΓ«ñ  ñ«½ªÑ¡  πñ὿Γ∞ »áαá¼ÑΓα Self ¿º ßΓѬá Γá¬
  239. ªÑ, ¬á¬ «¡ ñ«½ªÑ¡ πñ὿Γ∞ ½εíδÑ «íδτ¡δÑ »áαá¼ÑΓαδ.
  240.      îÑΓ«ñ óßÑúñá  ¿ß»«½∞ºπÑΓ  ñá½∞¡εε ¼«ñѽ∞ ó맮óá (FAR CALL) ó¡Ñ
  241. ºáó¿ß¿¼«ßΓ¿ «Γ πßΓá¡«ó½Ñ¡¿∩ ñ¿αÑ¬Γ¿óδ ¬«¼»¿½∩Γ«αá $F.
  242.  
  243.  
  244.                     è«¡ßΓαá¬Γ«αδ ¿ ñÑßΓαá¬Γ«αδ.
  245.  
  246.      è«¡ßΓαá¬Γ«αδ ¿  ñÑßΓαá¬Γ«αδ  ¿ß»«½∞ºπεΓ  ΓÑ  ªÑ  ß«ú½áΦÑ¡¿∩  «
  247. ó맮óáσ, τΓ«  ¿  «íδτ¡δÑ  ¼ÑΓ«ñδ,   ºá   ¿ß¬½ετÑ¡¿Ñ¼   Γ«ú«,    τΓ«
  248. ñ«»«½¡¿Γѽ∞¡δ⌐ »áαá¼ÑΓα,     αẼÑα«¼    ó    ß½«ó«,     ¡áºδóáѼδ⌐
  249. VMT-»áαá¼ÑΓα«¼, »ÑαÑñáÑΓß∩ ó ßΓѬ »ÑαÑñ »áαá¼ÑΓα«¼ Self.
  250.      ä½∩ ¬«¡ßΓαá¬Γ«α«ó   »áαá¼ÑΓα   VMT   ß«ñÑαª¿Γ   ß¼ÑΘÑ¡¿Ñ  VMT,
  251. »α¿¡áñ½ÑªáΘÑÑ Self, ñ½∩ Γ«ú«, τΓ«íδ ¿¡¿µ¿á½¿º¿α«óáΓ∞ φëàSelf.
  252.      è«úñá ¬«¡ßΓαá¬Γ«α  óδºδóáÑΓß∩  ñ½∩  αáß»αÑñѽѡ¿∩ ñ¿¡á¼¿τÑ߬¿σ
  253. «íΩÑ¬Γ«ó, ¿ß»«½∞ºπ∩  αáßΦ¿αÑ¡¡δ⌐  ß¿¡Γá¬ß¿ß  New,   π¬áºáΓѽ∞   nil
  254. »ÑαÑñáÑΓß∩ ó    »áαá¼ÑΓαÑ   Self.    ¥Γ«   ºáßΓáó½∩ÑΓ   ¬«¡ßΓαá¬Γ«α
  255. αáß»αÑñѽ∩Γ∞ ¡«óδ⌐ ñ¿¡á¼¿τÑ߬¿⌐ «íΩѬΓ,  áñαÑß ¬«Γ«α«ú«  »ÑαÑñáÑΓß∩
  256. ¡áºáñ ó  DX:AX  »α¿  ó«ºóαáΓÑ ¿º ¬«¡ßΓαá¬Γ«αá.  àß½¿ ¬«¡ßΓαá¬Γ«α ¡Ñ
  257. ¼«ªÑΓ αáß»αÑñѽ¿Γ∞ «íΩѬΓ,  π¬áºáΓѽ∞ nil ó«ºóαáΘáÑΓß∩ ó DX:AX (ß¼.
  258. "é«ßßΓá¡«ó½Ñ¡¿Ñ «Φ¿í«¬ ¬«¡ßΓαá¬Γ«αá" ó ß½ÑñπεΘѼ αáºñѽÑ).
  259.      ìᬫ¡Ñµ, ¬«úñá     ¬«¡ßΓαá¬Γ«α     óδºδóáÑΓß∩,       ¿ß»«½∞ºπ∩
  260. πΓ«τ¡Ñ¡¡δ⌐ ¿ñÑ¡Γ¿Σ¿¬áΓ«α   ¼ÑΓ«ñá  (Γ.Ñ.  ¿ñÑ¡Γ¿Σ¿¬áΓ«α  «íΩÑ¬Γ¡«ú«
  261. Γ¿»á), ß »«ß½ÑñπεΘÑ⌐ Γ«τ¬«⌐ ¿ ¿ñÑ¡Γ¿Σ¿¬áΓ«α«¼ ¼ÑΓ«ñá, º¡áτÑ¡¿Ñ ¡«½∞
  262. »ÑαÑñáÑΓß∩ ó »áαá¼ÑΓαÑ VMT.  ¥Γ« π¬áºδóáÑΓ ¬«¡ßΓαá¬Γ«απ,  τΓ« «¡ ¡Ñ
  263. ñ«½ªÑ¡ ¿¡¿µ¿á½¿º¿α«óáΓ∞ »«½Ñ VMT ñ½∩ Self.
  264.      ä½∩ ñÑßΓαá¬Γ«αá  ¡«½∞  ó  »áαá¼ÑΓαÑ VMT π¬áºδóáÑΓ « ¡«α¼á½∞¡«¼
  265. ó맮óÑ, ¿ ¡Ñ¡π½Ñó«Ñ º¡áτÑ¡¿Ñ π¬áºδóáÑΓ,  τΓ« ñÑßΓαá¬Γ«α íδ½ óδºóá¡,
  266. ¿ß»«½∞ºπ∩ αáßΦ¿αÑ¡¡δ⌐ ß¿¡Γá¬ß¿ß Dispose.  ¥Γ« ºáßΓáó½∩ÑΓ ñÑßΓαá¬Γ«α
  267. «ßó«í«ªñáΓ∞ Self ßαáºπ »ÑαÑñ ó«ºóαáΓ«¼  (αẼÑα  Self  «»αÑñѽ∩ÑΓß∩
  268. »α«ß¼«Γα«¼ »Ñαó«ú« ß½«óá VMT ñ½∩ φΓ«ú« Self).
  269.  
  270.  
  271.                    ÉáßΦ¿αÑ¡¿∩ ñ½∩ New ¿ Dispose.
  272.  
  273.      æΓá¡ñáαΓ¡δÑ »α«µÑñπαδ   New   ¿    Dispose    αáßΦ¿αÑ¡δ    ñ½∩
  274. ¿ß»«½∞º«óá¡¿∩  ó맮óá  ¬«¡ßΓαá¬Γ«αá  ¿½¿  ñÑßΓαá¬Γ«αá  ¬á¬  óΓ«α«ú«
  275. »áαá¼ÑΓαá,  ñ½∩   αáß»αÑñѽѡ¿∩   ¿½¿   «ßó«í«ªñÑ¡¿∩   ñ¿¡á¼¿τÑ߬¿σ
  276. »ÑαѼѡ¡δσ «íΩÑ¬Γ¡«ú« Γ¿»á. æ¿¡Γá¬ß¿ß:
  277.  
  278.      New(P, Construct);
  279.  
  280.      ¿
  281.  
  282.      Dispose(P, Destruct);
  283.  
  284.      úñÑ P - »ÑαѼѡ¡á∩ π¬áºáΓѽ∞,  π¬áºδóáεΘ¿⌐ ¡á «íΩÑ¬Γ¡δ⌐ Γ¿», á
  285. Construct ¿ Destruct óδºδóáεΓ ¬«¡ßΓαá¬Γ«αδ ¿ ñÑßΓαá¬Γ«αδ  ñ½∩ φΓ«ú«
  286. «íΩÑ¬Γ¡«ú« Γ¿»á.   ä½∩   New   ñÑ⌐ßΓó¿Ñ   αáßΦ¿αÑ¡¡«ú«   ß¿¡Γá¬ß¿ßá
  287. αáó¡«ß¿½∞¡« óδ»«½¡Ñ¡¿ε
  288.  
  289.      New(P);
  290.      P^.Construct;
  291.  
  292.      ¿ ñ½∩ Dispose
  293.  
  294.      P^.Destruct;
  295.      Dispose(P);
  296.  
  297.      üѺ αáßΦ¿αÑ¡¡«ú« ß¿¡Γá¬ß¿ßá »«∩ó½Ñ¡¿Ñ Γᬿσ »áα ó맮óá  New  ß
  298. »«ß½ÑñπεΘ¿¼ óδº«ó«¼ ¬«¡ßΓαá¬Γ«αá ¿ ó맮óá ñÑßΓαá¬Γ«αá ß »«ß½ÑñπεΘ¿¼
  299. óδº«ó«¼  Dispose  íπñπΓ  ß½¿Φ¬«¼  τáßΓ묨.  ÉáßΦ¿αÑ¡¡δ⌐   ß¿¡Γá¬ß¿ß
  300. π½πτΦáÑΓ  τ¿Γáíѽ∞¡«ßΓ∞,  á  Γᬠ ªÑ  úÑ¡Ñα¿απÑΓ  í«½ÑÑ  ¬«α«Γ¬¿⌐ ¿
  301. φΣΣÑ¬Γ¿ó¡δ⌐ ¬«ñ.  æ½ÑñπεΘÑÑ ¿½½εßΓα¿απÑΓ ¿ß»«½∞º«óá¡¿Ñ αáßΦ¿αÑ¡¡«ú«
  302. ß¿¡Γá¬ß¿ßá New ¿ Dispose.
  303.  
  304.      var
  305.         SP: StrFieldPtr;
  306.         ZP: ZipFieldPtr;
  307.      begin
  308.         New(SP, Init(1, 1, 25, 'FirstName'));
  309.         New(ZP, Init(1, 2, 5, 'Zip Code', 0, 99999));
  310.         SP^.Edit;
  311.         ZP^.Edit;
  312.         ...
  313.         Dispose(ZP, Down);
  314.         Dispose(SP, Down);
  315.      end;
  316.  
  317.      ä«»«½¡¿Γѽ∞¡«Ñ αáßΦ¿αÑ¡¿Ñ  »«ºó«½∩ÑΓ  ¿ß»«½∞º«óáΓ∞   New   ¬á¬
  318. Σπ¡¬µ¿ε,  ¬«Γ«αá∩  αáß»αÑñѽ∩Γ ¿ ó«ºóαáΘáÑΓ ñ¿¡á¼¿τÑ߬πε »ÑαѼѡ¡πε
  319. π¬áºá¡¡«ú« Γ¿»á. æ¿¡Γá¬ß¿ß :
  320.  
  321.      New(T);
  322.  
  323.      ¿½¿
  324.  
  325.      New(T, Construct);
  326.  
  327.      é »Ñαó«⌐ Σ«α¼Ñ Æ ¼«ªÑΓ íδΓ∞ π¬áºáΓѽѼ ¡á ½εí«⌐ Γ¿». é« óΓ«α«⌐
  328. -  Æ  ñ«½ª¡«  π¬áºδóáΓ∞  ¡á  «íΩÑ¬Γ¡δ⌐  Γ¿» ¿ Construct ñ«½ªÑ¡ íδΓ∞
  329. óδºóá¡ ñ½∩ ß«ºñá¡¿∩ φΓ«ú« «íΩÑ¬Γ¡«ú« Γ¿»á.  é «í«¿σ ß½πτá∩σ Σπ¡¬µ¿∩
  330. ó«ºóαáΘáÑΓ αѺπ½∞ΓáΓ Æ.
  331.  
  332.      Åα¿¼Ñα :
  333.  
  334.      var
  335.         F1, F2: FieldPtr;
  336.      begin
  337.         F1 := New(StrFieldPtr, Init(1, 1, 25, 'FirstName'));
  338.         F2 := New(ZipFieldPtr, Init(1, 2, 5, 'Zip Code', 0, 99999));
  339.         ...
  340.         Writeln(F1^.GetStr);  {ó맮ó StrField.GetStr}
  341.         Writeln(F2^.GetStr);  {ó맮ó ZipField.GetStr}
  342.         ...
  343.         Dispose(F2, Down);    {ó맮ó Field.Down}
  344.         Dispose(F1, Down);    {ó맮ó StrField.Down}
  345.      end;
  346.  
  347.      çá¼ÑΓ¿¼, τΓ« ñáªÑ,  σ«Γ∩ F1 ¿ F2  Γ¿»á  FieldPtr,  αáßΦ¿αÑ¡¡δÑ
  348. »αáó¿½á  ß«ó¼ÑßΓ¿¼«ßΓ¿ »« »α¿ßóá¿óá¡¿ε π¬áºáΓѽÑ⌐ »«ºó«½∩εΓ F1 ¿ F2
  349. »α¿ßóá¿óáΓ∞  π¬áºáΓѽ¿  ¡á  ½εí«⌐  »«α«ªñÑ¡¡δ⌐  Γ¿»  «Γ  Field;   ¿
  350. »«ß¬«½∞¬π  GetStr  ¿ Down ∩ó½∩εΓß∩ ó¿αΓπá½∞¡δ¼¿ ¼ÑΓ«ñἿ,  ¼Ñσá¡¿º¼
  351. ñ¿ß»ÑΓτÑα¿ºáµ¿¿  ó¿αΓπá½∞¡δσ  ¼ÑΓ«ñ«ó  íπñÑΓ   ¬«ααÑ¬Γ¡«   óδºδóáΓ∞
  352. StrField.GetStr, ZipField.GetStr,    Field.Down   ¿   StrField.Down
  353. ß««ΓóÑΓßΓóÑ¡¡«.
  354.  
  355.  
  356.                        îÑΓ«ñδ ¡á áßßѼí½ÑαÑ.
  357.  
  358.      îÑΓ«ñδ, αÑ὿º«óá¡¡δÑ  ¡á ∩ºδ¬Ñ áßßѼí½Ñαá ¼«úπΓ íδΓ∞ ó¬½ετÑ¡δ
  359. ó »α«úαá¼¼π ¡á Turbo Pascal,  ¿ß»«½∞ºπ∩ ñ¿αÑ¬Γ¿ó𠬫¼»¿½∩Γ«αá $L  ¿
  360. ¬½ετÑó«Ñ  ß½«ó«  External.  ÄíΩ∩ó½Ñ¡¿Ñ  ó¡ÑΦ¡Ñú« ¼ÑΓ«ñá ó «íΩÑ¬Γ¡«¼
  361. Γ¿»Ñ ¡Ñ «Γ½¿τáÑΓß∩ «Γ «íδτ¡«ú« ¼ÑΓ«ñá;  «ñ¡á¬«,  αÑ὿ºáµ¿∩  ¼ÑΓ«ñá
  362. ß«ßΓ«¿Γ  Γ«½∞¬« ¿º ºáú«½«ó¬á ¼ÑΓ«ñá ß »«ß½ÑñπεΘ¿¼ ºáαѺÑαó¿α«óá¡¡δ¼
  363. ß½«ó«¼ External.
  364.      é ¿ßσ«ñ¡«¼   ΓѬßΓÑ   ¡á  áßßѼí½ÑαÑ,  @  ¿ß»«½∞ºπÑΓß∩  ó¼ÑßΓ«
  365. Γ«τ¬¿ »α¿ ¡á»¿ßá¡¿¿ πΓ«τ¡Ñ¡¡«ú« ¿ñÑ¡Γ¿Σ¿¬áΓ«αá  (Γ.¬.  Γ«τ¬á  ¿¼ÑÑΓ
  366. ñαπú«Ñ   º¡áτÑ¡¿Ñ   ó   áßßѼí½ÑαÑ   ¿   ¡Ñ   ¼«ªÑΓ   íδΓ∞   τáßΓ∞ε
  367. ¿ñÑ¡Γ¿Σ¿¬áΓ«αá).  ìá»α¿¼Ñα, ¿ñÑ¡Γ¿Σ¿¬áΓ«α Åá߬á½∩ Rect.Init »¿ΦÑΓß∩
  368. ó  áßßѼí½ÑαÑ  ¬á¬ Rect@Init.  æ¿¡Γá¬ß¿ß ß @ ¼«ªÑΓ íδΓ∞ ¿ß»«½∞º«óá¡
  369. ñ½∩ «íΩ∩ó½Ñ¡¿∩ ¿ PUBLIC ¿ EXTRN ¿ñÑ¡Γ¿Σ¿¬áΓ«α«ó.
  370.      é ¬áτÑßΓóÑ  »α¿¼Ñαá  ¼ÑΓ«ñá ¡á áßßѼí½ÑαÑ ¼δ αÑ὿ºπѼ »α«ßΓ«⌐
  371. «íΩÑ¬Γ Rect.
  372.  
  373.      Type
  374.         Rect = Object
  375.           X1, X2, Y1, Y2: Integer;
  376.           procedure Init(XA, YA, XB, YB: Integer);
  377.           procedure Union(var R: Rect);
  378.           function Contains(X, Y: Integer): Boolean;
  379.         end;
  380.  
  381.      Rect »αÑñßΓáó½∩ÑΓ   »α∩¼«πú«½∞¡¿¬,    «úαá¡¿τÑ¡¡δ⌐    τÑΓδα∞¼∩
  382. ¬««αñ¿¡áΓἿ X1,   Y1,  X2,  Y2.  éÑασ¡¿⌐ ½Ñóδ⌐ πú«½ »α∩¼«πú«½∞¡¿¬á
  383. «»αÑñѽ∩ÑΓß∩ X1,  Y1  ¿  ¡¿ª¡¿⌐  »αáóδ⌐  -  X2,   Y2.   îÑΓ«ñ  Init
  384. »α¿ßóá¿óáÑΓ º¡áτÑ¡¿Ñ   ¬««αñ¿¡áΓá¼   »α∩¼«πú«½∞¡¿¬á;   ¼ÑΓ«ñ  Union
  385. óδτ¿ß½∩ÑΓ ¡á¿¼Ñ¡∞Φ¿⌐  »α∩¼«πú«½∞¡¿¬,   ¬«Γ«αδ⌐  ß«ñÑαª¿Γ   ¿   φΓ«Γ
  386. »α∩¼«πú«½∞¡¿¬, ¿  ñαπú«⌐  »α∩¼«πú«½∞¡¿¬;  ¼ÑΓ«ñ Contains ó«ºóαáΘáÑΓ
  387. True, Ñß½¿ ñá¡¡á∩ Γ«τ¬á ½Ñª¿Γ ó¡πΓα¿ »α∩¼«πú«½∞¡¿¬á, ¿ False - Ñß½¿
  388. ¡ÑΓ. äαπú¿Ñ   ¼ÑΓ«ñδ,   ΓᬿѠ ¬á¬  »ÑαѼÑΘÑ¡¿Ñ,   ¼áßΦΓáí¿α«óá¡¿Ñ,
  389. óδτ¿ß½Ñ¡¿Ñ »ÑαÑßÑτÑ¡¿⌐ ¿ ΓÑßΓ¿α«óá¡¿Ñ ¡á αáóÑ¡ßΓó« ¼«úπΓ íδΓ∞ ½Ñú¬«
  390. αÑ὿º«óá¡δ, τΓ«íδ ßñѽáΓ∞ Rect í«½ÑÑ »«½Ñº¡δ¼ «íΩÑ¬Γ«¼.
  391.      ÉÑ὿ºáµ¿∩ ¼ÑΓ«ñ«ó ñ½∩  Rect  ¡á  Åá߬á½Ñ  Γ«½∞¬«  »ÑαÑτ¿ß½∩ÑΓ
  392. ºáú«½«ó¬¿ φΓ¿σ ¼ÑΓ«ñ«ó ß ¬½ετÑóδ¼ ß½«ó«¼ External.
  393.  
  394.      {$L Rect}
  395.      procedure Rect.Init(XA, YA, XB, YB : Integer); External;
  396.      procedure Rect.Union(var R : Rect); External;
  397.      function Rect.Contains(X, Y : Integer) : Boolean; External;
  398.  
  399.      Éáºπ¼ÑÑΓß∩, ¡ÑΓ ¡¿¬á¬¿σ  ΓαÑí«óá¡¿⌐,  τΓ«íδ  óßÑ  ¼ÑΓ«ñδ  í뫨
  400. αÑ὿º«óá¡δ ¬á¬ ó¡ÑΦ¡¿Ñ.  ïεí«⌐ ¼ÑΓ«ñ ¼«ªÑΓ íδΓ∞ αÑ὿º«óá¡ ½¿í« ¡á
  401. Åá߬á½Ñ, ½¿í« ¡á ÇßßѼí½ÑαÑ, »« ¡Ñ«íσ«ñ¿¼«ßΓ¿.
  402.      êßσ«ñ¡δ⌐ ΓѬßΓ   »α«úαá¼¼δ  ¡á  áßßѼí½ÑαÑ  Rect.Asm,  ¬«Γ«αδ⌐
  403. αÑ὿ºπÑΓ φΓ¿ Γα¿ ó¡ÑΦ¡¿σ ¼ÑΓ«ñá:
  404.  
  405.      TITLE   Rect
  406.      LOCALS  @@
  407.  
  408.      ; Rect Structure
  409.  
  410.      Rect     STRUC
  411.      X1       DW        ?
  412.      Y1       DW        ?
  413.      X2       DW        ?
  414.      Y2       DW        ?
  415.      Rect     ENDS
  416.  
  417.      code     SEGMENT   BYTE PUBLIC
  418.  
  419.               ASSUME    cs:code
  420.  
  421.      ; procedure Rect.Init(XA, YA, XB, YB: Integer)
  422.  
  423.               PUBLIC    Rect@Init
  424.  
  425.      Rect@Init          PROC       FAR
  426.  
  427.      @XA                EQU        (WORD PTR[bp+16])
  428.      @YA                EQU        (WORD PTR[bp+14])
  429.      @XB                EQU        (WORD PTR[bp+12])
  430.      @YB                EQU        (WORD PTR[bp+10])
  431.      @Self              EQU        (DWORD PTR[bp+6])
  432.  
  433.               Push      bp         ; ß«σαá¡¿Γ∞ bp
  434.               Mov       bp,sp      ; πßΓá¡«ó¿Γ∞ αẼÑα ßΓѬá
  435.               les       di,@Self   ; ºáúαπº¿Γ∞ Self ó ES:DI
  436.               cld                  ; ßñó¿¡πΓ∞ ó»ÑαÑñ
  437.               mov       ax,@XA     ; X1 := XA
  438.               stosw
  439.               mov       ax,@YA     ; Y1 := YA
  440.               stosw
  441.               mov       ax,@XB     ; X2 := XB
  442.               stosw
  443.               mov       ax,@YB     ; Y2 := YB
  444.               stosw
  445.               pop       bp         ; ó«ßßΓá¡«ó¿Γ∞ bp
  446.               ret       12         ; óδúαπº¿Γ∞ »áαá¼ÑΓαδ ¿ ó«ºóαáΓ
  447.  
  448.      Rect@Init          ENDP
  449.  
  450.      ; procedure Rect.Union(var R: Rect)
  451.  
  452.               PUBLIC    Rect@Union
  453.  
  454.      Rect@Union         PROC       FAR
  455.  
  456.      @R                 EQU        (DWORD PTR [bp+10])
  457.      @Sef               EQU        (DWORD PTR [bp+6])
  458.  
  459.               push      bp         ; ß«σαá¡¿Γ∞ bp
  460.               mov       bp,sp      ; πßΓá¡«ó¿Γ∞ αẼÑα ßΓѬá
  461.               push      ds         ; ß«σαá¡¿Γ∞ ds
  462.               lds       si,@R      ; ºáúαπº¿Γ∞ R ó DS:SI
  463.               les       di,@Self   ; ºáúαπº¿Γ∞ Self ó DS:SI
  464.               cld                  ; »ÑαÑñó¿¡πΓ∞ ó»ÑαÑñ
  465.               lodsw                ; if R.X1 >= X1 goto @@1
  466.               scasw
  467.               jge       @@1
  468.               dec       di         ; X1 := R.X1
  469.               dec       di
  470.               stosw
  471.      @@1:     lodsw                ; if R.Y1 >= Y1 goto @@2
  472.               scasw
  473.               jge       @@2
  474.               dec       di         ; Y1 := R.Y1
  475.               dec       di
  476.               stosw
  477.      @@2:     lodsw                ; if R.X2 <= X2 goto @@3
  478.               scasw
  479.               jle       @@3
  480.               dec       di         ; X2 := R.X2
  481.               dec       di
  482.               stosw
  483.      @@3:     lodsw                ; if R.Y2 <= Y2 goto @@4
  484.               scasw
  485.               jle       @@4
  486.               dec       di         ; Y2 := R.Y2
  487.               dec       di
  488.               stosw
  489.      @@4      pop       ds         ; ó«ßßΓá¡«ó¿Γ∞ ds
  490.               pop       bp         ; ó«ßßΓá¡«ó¿Γ∞ bp
  491.               ret       8          ; óδúαπº¿Γ∞ »áαá¼ÑΓαδ ¿ ó«ºóαáΓ
  492.  
  493.      Rect@Union         ENDP
  494.  
  495.      ; function Rect.Contains(X, Y: Integer): Boolean
  496.  
  497.               PUBLIC    Rect@Contains
  498.  
  499.      Rect@Contains      PROC        FAR
  500.  
  501.      @X                 EQU         (WORD PTR[BP+12])
  502.      @Y                 EQU         (WORD PTR[BP+10])
  503.      @Self              EQU         (DWORD PTR[BP+6])
  504.  
  505.                push     bp          ; ß«σαá¡¿Γ∞ bp
  506.                mov      bp,sp       ; πßΓá¡«ó¿Γ∞ αẼÑα ßΓѬá
  507.                les      di,@Self    ; ºáúαπº¿Γ∞ Self ó ES:DI
  508.                mov      al,0        ; ó«ºóαáΘáÑΓ false
  509.                mov      dx,@X       ; if (X<X1) or (X>X2) goto @@1
  510.                cmp      dx,es:[di].X1
  511.                jl       @@1
  512.                cmp      dx,es:[di].X2
  513.                jg       @@1
  514.                mov      dx,@Y       ; if (Y<Y1) or (Y>Y2) goto @@2
  515.                cmp      dx,es:[di].Y1
  516.                jl       @@1
  517.                cmp      dx,es:[di].Y2
  518.                jg       @@1
  519.                inc      ax          ; ó«ºóαáΘáÑΓ true
  520.      @@1:      pop      bp          ; ó«ßßΓá¡«ó¿Γ∞ bp
  521.                ret      8           ; óδúαπº¿Γ∞ »áαá¼ÑΓαδ ¿ ó«ºóαáΓ
  522.  
  523.      Rect@Contains      ENDP
  524.  
  525.      code      ENDS
  526.  
  527.                END
  528.  
  529.  
  530.  
  531.                 é«ßßΓá¡«ó½Ñ¡¿Ñ «Φ¿í«¬ ¬«¡ßΓαá¬Γ«αá.
  532.  
  533.      èᬠ«»¿ßá¡«  ó  ú½áóÑ   16,   Turbo   Pascal   »«ºó«½∩ÑΓ   éá¼
  534. πßΓá¡áó½¿óáΓ∞   Σπ¡¬µ¿¿  «íαáí«Γ¬¿  «Φ¿í«¬  ¬πτ¿  τÑαѺ  »ÑαѼѡ¡πε
  535. HeapError,   «íΩ∩ó½Ñ¡¡πε   ó   ¼«ñπ½Ñ   System.   ¥Γá   ó«º¼«ª¡«ßΓ∞
  536. »«ññÑনóáÑΓß∩ Γᬠ ªÑ  ó Turbo Pascal,  ¡« ñ«»«½¡¿Γѽ∞¡« »«ºó«½∩ÑΓ
  537. ó«ºñÑ⌐ßΓó«óáΓ∞ ¡á αáí«Γ𠬫¡ßΓαá¬Γ«α«ó «íΩÑ¬Γ¡δσ Γ¿»«ó.
  538.      Å« π¼«½τá¡¿ε,   ¬«úñá  ¡ÑΓ ñ«ßΓáΓ«τ¡« »á¼∩Γ¿ ñ½∩ αáß»αÑñѽѡ¿∩
  539. ñ¿¡á¼¿τÑ߬«ú« φ¬ºÑ¼»½∩αá   «íΩÑ¬Γ¡«ú«  Γ¿»á,   óδº«ó  ¬«¡ßΓαá¬Γ«αá,
  540. ¿ß»«½∞ºπεΘ¿⌐ αáßΦ¿αÑ¡¡δ⌐     ß¿¡Γá¬ß¿ß   New,    úÑ¡Ñα¿απÑΓ  «Φ¿í¬π
  541. óαѼѡ¿ óδ»«½¡Ñ¡¿∩ 203.  àß½¿ éδ πßΓá¡áó½¿óáÑΓÑ  Σπ¡¬µ¿ε  «íαáí«Γ¬¿
  542. «Φ¿í«¬  ¬πτ¿,  ¬«Γ«αá∩  ó«ºóαáΘáÑΓ  1  (ó  «Γ½¿τ¿Ñ  «Γ ßΓá¡ñáαΓ¡«ú«
  543. αѺπ½∞ΓáΓá  Σπ¡¬µ¿¿  -  0),  óδº«ó  ¬«¡ßΓαá¬Γ«αá  τÑαѺ  New  íπñÑΓ
  544. ó«ºóαáΘáΓ∞  nil (ó¼ÑßΓ« áóáα¿⌐¡«ú« ºáóÑαΦÑ¡¿∩ »α«úαá¼¼δ) Ñß½¿ «¡ ¡Ñ
  545. ¼«ªÑΓ »«½¡«ßΓ∞ε «íαáí«ΓáΓ∞ ºá»α«ß ¡á óδñѽѡ¿Ñ »á¼∩Γ¿.
  546.      è«ñ, ¬«Γ«αδ⌐ »α«¿ºó«ñ¿Γ αáß»αÑñѽѡ¿Ñ ¿ ¿¡¿µ¿á½¿ºáµ¿ε »«½∩ VMT
  547. ñ¿¡á¼¿τÑ߬«ú« φ¬ºÑ¼»½∩αá ∩ó½∩ÑΓß∩ τáßΓ∞ε óσ«ñ¡«⌐ »«ß½Ññ«óáΓѽ∞¡«ßΓ¿
  548. ¬«¡ßΓαá¬Γ«αá: ¬«úñá    π»αáó½Ñ¡¿Ñ    ñ«ßΓ¿úáÑΓ    «»ÑαáΓ«αá   begin
  549. ¬«¡ßΓαá¬Γ«αá, φ¬ºÑ¼»½∩α πªÑ αáß»αÑñѽѡ  ¿  ¿¡¿µ¿á½¿º¿α«óá¡.   àß½¿
  550. αáß»αÑñѽѡ¿Ñ ¡Ñπß»ÑΦ¡«  ¿ Σπ¡¬µ¿∩ «íαáí«Γ¬¿ «Φ¿í«¬ ¬πτ¿ ó«ºóαáΓ¿½á
  551. 1, ¬«¡ßΓαá¬Γ«α »α«»π߬áÑΓ óδ»«½¡Ñ¡¿Ñ «»ÑαáΓ«α¡«⌐ τáßΓ¿ ¿ ó«ºóαáΘáÑΓ
  552. π¬áºáΓѽ∞ nil;  π¬áºáΓѽ∞,   ºáñá¡¡δ⌐  ó »α«µÑñπαÑ New,  óδºδóáεΘÑ⌐
  553. ¬«¡ßΓαá¬Γ«α, πßΓá¡«ó¿Γß∩ ó nil.
  554.  
  555.      Åα¿¼Ñτá¡¿Ñ: éóÑñÑ¡á ¡«óá∩ ßΓá¡ñáαΓ¡á∩ »α«µÑñπαá Fail.
  556.  
  557.      è«úñá π»αáó½Ñ¡¿Ñ  ñ«ßΓ¿úáÑΓ  «»ÑαáΓ«αá   begin   ¬«¡ßΓαá¬Γ«αá,
  558. úáαá¡Γ¿απÑΓß∩, τΓ«  φ¬ºÑ¼»½∩α  «íΩÑ¬Γ¡«ú«  Γ¿»á  íδ½  αáß»αÑñѽѡ ¿
  559. ¿¡¿µ¿á½¿º¿α«óá¡ πß»ÑΦ¡«.  Äñ¡á¬« ¬«¡ßΓαá¬Γ«α ßá¼ ¼«ªÑΓ αáß»αÑñѽ∩Γ∞
  560. ñ¿¡á¼¿τÑ߬¿Ñ »ÑαѼѡ¡δÑ  ñ½∩  Γ«ú«,   τΓ«íδ  ¿¡¿µ¿á½¿º¿α«óáΓ∞  »«½∩
  561. π¬áºáΓѽÑ⌐ ó  φ¬ºÑ¼»½∩αÑ  ¿  φΓ¿  αáß»αÑñѽѡ¿∩  ¼«úπΓ  ºáóÑαΦ¿Γ∞ß∩
  562. ¡Ñπß»ÑΦ¡«. àß½¿  φΓ« ß½πτ¿Γß∩,  »αáó¿½∞¡« αáºαáí«Γá¡¡δ⌐ ¬«¡ßΓαá¬Γ«α
  563. ñ«½ªÑ¡ ßñѽáΓ∞  "«Γ¬áΓ"  óßÑσ  πß»ÑΦ¡δσ  αáß»αÑñѽѡ¿⌐  ¿  ó  ¬«¡µÑ
  564. «ßó«í«ñ¿Γ∞ φ¬ºÑ¼»½∩α   «íΩÑ¬Γ¡«ú«  Γ¿»á  Γá¬,   τΓ«íδ  ó«ºóαáΘáѼδ⌐
  565. αѺπ½∞ΓáΓ »«½πτ¿½  π¬áºáΓѽ∞  nil.   ùΓ«íδ  ßñѽáΓ∞   Γᬫ⌐   «Γ¬áΓ
  566. 󫺼«ª¡δ¼, Turbo  Pascal  αÑ὿ºπÑΓ  ¡«óπε  ßΓá¡ñáαΓ¡πε  »α«µÑñπαπ,
  567. ¡áºδóáѼπε Fail,  ¬«Γ«αá∩ ¡Ñ ¿¼ÑÑΓ »áαá¼ÑΓα«ó ¿ ¬«Γ«αá∩ ¼«ªÑΓ  íδΓ∞
  568. óδºóá¡á  Γ«½∞¬« ¿º ¬«¡ßΓαá¬Γ«αá.  é맮ó Fail ºáßΓáó½∩ÑΓ ¬«¡ßΓαá¬Γ«α
  569. «ßó«í«ªñáΓ∞ ñ¿¡á¼¿τÑ߬¿⌐ φ¬ºÑ¼»½∩α,  ¬«Γ«αδ⌐  íδ½  αáß»αÑñѽѡ  »α¿
  570. óσ«ñÑ  ó  ¬«¡ßΓαá¬Γ«α  ¿  »α¿  φΓ«¼  ó«ºóαáΘáΓ∞  π¬áºáΓѽ∞  nil ñ½∩
  571. ¿¡ñ¿¬áµ¿¿ «Φ¿í¬¿.
  572.      è«úñá ñ¿¡á¼¿τÑ߬¿⌐  φ¬ºÑ¼»½∩α  αáß»αÑñѽѡ  τÑαѺ  αáßΦ¿αÑ¡¡δ⌐
  573. ß¿¡Γá¬ß¿ß New,  º¡áτÑ¡¿Ñ nil  ó  ºáñá¡¡«¼  π¬áºáΓѽѠ ú«ó«α¿Γ,  τΓ«
  574. «»Ñαᵿ∩ ºá¬«¡τ¿½áß∞ ß «Φ¿í¬«⌐. è ß«ªá½Ñ¡¿ε ¡ÑΓ Γᬫú« π¬áºáΓѽ∩, ß
  575. »«¼«Θ∞ε  ¬«Γ«α«ú«  ¼«ª¡«  í佫  íδ  »α«óÑα¿Γ∞   «»Ñαáµ¿ε   ß«ºñá¡¿∩
  576. ßΓáΓ¿τÑ߬«ú«  φ¬ºÑ¼»½∩αá,  ¿½¿  ó맮ó π¡áß½Ññ«óá¡¡«ú« ¬«¡ßΓαá¬Γ«αá.
  577. é¼ÑßΓ« φΓ«ú« Turbo  Pascal  »«ºó«½∩ÑΓ  ¿ß»«½∞º«óáΓ∞  ¬«¡ßΓαá¬Γ«α  ó
  578. óδαáªÑ¡¿¿ ¬á¬ íπ½Ñó߬πε Σπ¡¬µ¿ε:  ó«ºóαáΓ True ú«ó«α¿Γ «í πß»ÑσÑ, á
  579. ó«ºóαáΓ False ú«ó«α¿Γ  «í  «Φ¿í¬Ñ  (í½áú«ñáα∩  ó맮óπ  Fail  ó¡πΓα¿
  580. ¬«¡ßΓαá¬Γ«αá).
  581.      æ½ÑñπεΘá∩ »α«úαἼᠠαÑ὿ºπÑΓ  ñóá  »α«ßΓδσ  «íΩÑ¬Γ¡δσ  Γ¿»á,
  582. ß«ñÑαªáΘ¿σ   π¬áºáΓѽ¿.   ÅÑαóá∩   óÑαß¿∩  »α«úαá¼¼δ  ¡Ñ  αÑ὿ºπÑΓ
  583. ó«ßßΓá¡«ó½Ñ¡¿Ñ «Φ¿í«¬ ¬«¡ßΓαá¬Γ«αá.
  584.  
  585.      type
  586.         LinePtr = ^Line;
  587.         Line = String[79];
  588.         BasePtr = ^Base;
  589.         Base = Object
  590.           L1, L2: LinePtr;
  591.           Constructor Init(S1, S2: Line);
  592.           Destructor Done; virtual;
  593.           procedure Dump; virtual;
  594.         end;
  595.  
  596.         DerivedPtr = ^Derived;
  597.         Derived = object(Base)
  598.           L3, L4: LinePtr;
  599.           Constructor Init(S1, S2, S3, S4: Line);
  600.           Destructor Done; virtual;
  601.           procedure Dump; virtual;
  602.         end;
  603.  
  604.      var
  605.         BP: BasePtr;
  606.         DP: DerivedPtr;
  607.  
  608.      Constructor Base.Init(S1, S2: Line);
  609.      begin
  610.         New(L1);
  611.         New(L2);
  612.         L1^ := S1;
  613.         L2^ := S2;
  614.      end;
  615.  
  616.      Destructor Base.Done;
  617.      begin
  618.         Dispose(L2);
  619.         Dispose(L1);
  620.      end;
  621.  
  622.      procedure Base.Dump;
  623.      begin
  624.         Writeln('B: ', L1^, ',', L2^, '.');
  625.      end;
  626.  
  627.      Constructor Derived.Init(S1, S2, S3, S4: Line);
  628.      begin
  629.         Base.Init(S1, S2);
  630.         New(L3);
  631.         New(L4);
  632.         L3^ := S3;
  633.         L4^ := S4;
  634.      end;
  635.  
  636.      Destructor Derived.Done;
  637.      begin
  638.        Dispose(L4);
  639.        Dispose(L3);
  640.        Base.Done;
  641.      end;
  642.  
  643.      procedure Derived.Dump;
  644.      begin
  645.         Writeln('D: ', L1^, ',', L2^, ',', L3^, ',', L4^, '.');
  646.      end;
  647.  
  648.      begin
  649.         New(BP, Init('Turbo', 'Pascal'));
  650.         New(DP, Init('North', 'East', 'South', 'West'));
  651.         BP^.Dump;
  652.         DP^.Dump;
  653.         Dispose(DP, Done);
  654.         Dispose(BP, Done);
  655.      end.
  656.  
  657.  
  658.          æ½ÑñπεΘ¿⌐ »α¿¼Ñα  ñѼ«¡ßΓα¿απÑΓ  ¬á¬ »αÑñδñπΘ¿⌐ ¼«ªÑΓ íδΓ∞
  659. »ÑαÑ»¿ßá¡ ß ¿ß»«½∞º«óá¡¿Ñ ó«ßßΓá¡«ó½Ñ¡¿∩ «Φ¿í«¬. ÄíΩ∩ó½Ñ¡¿∩ Γ¿»«ó ¿
  660. »ÑαѼѡ¡δσ ¡Ñ »«óΓ«α∩εΓß∩, Γ.¬. «¡¿ «ßΓáεΓß∩ Γᬿ¼¿ ªÑ.
  661.  
  662.  
  663.      Constructor Base.Init(S1, S2: Line);
  664.      begin
  665.         New(L1);
  666.         New(L2);
  667.         if (L1 = nil) or (L2 = nil) then
  668.         begin
  669.            Base.Done;
  670.            Fail;
  671.         end;
  672.         L1^ := S1;
  673.         L2^ := S2;
  674.      end;
  675.  
  676.      Destructor Base.Done;
  677.      begin
  678.         if L2 <> nil then Dispose(L2);
  679.         if L1 <> nil then Dispose(L1);
  680.      end;
  681.  
  682.      Constructor Derived.Init(S1, S2, S3, S4: Line);
  683.      begin
  684.         if not Base.Init(S1, S2) then Fail;
  685.         New(L3);
  686.         New(L4);
  687.         if (L3 = nil) or (L4 = nil) then
  688.         begin
  689.            Derived.Done;
  690.            Fail;
  691.         end;
  692.         L3^ := S3;
  693.         L4^ := S4;
  694.      end;
  695.  
  696.      Destructor Derived.Done;
  697.      begin
  698.        if L4 <> nil then Dispose(L4);
  699.        if L3 <> nil then Dispose(L3);
  700.        Base.Done;
  701.      end;
  702.  
  703.      {$F+}
  704.      function HeapFunc(Size: Word): Integer;
  705.      begin
  706.         HeapFunc := 1;
  707.      end;
  708.      {$F-}
  709.  
  710.      begin
  711.         HeapError := @HeapFunc;  {πßΓá¡«ó¬á π»αáó½Ñ¡¿∩ «Φ¿í¬á¼¿
  712.                                   ¬πτ¿}
  713.         New(BP, Init('Turbo', 'Pascal'));
  714.         New(DP, Init('North', 'East', 'South', 'West'));
  715.         if (BP = nil) or (DP = nil) then
  716.           Writeln('OΦ¿í¬á αáß»αÑñѽѡ¿∩')
  717.         else
  718.         begin
  719.           BP^.Dump;
  720.           DP^.Dump;
  721.         end;
  722.         if DP <> nil then Dispose(DP, Done);
  723.         if BP <> nil then Dispose(BP, Done);
  724.      end.
  725.  
  726.      çá¼ÑΓ∞ΓÑ ¬á¬  ß««ΓóÑΓßΓóπεΘ¿Ñ  ñÑßΓαá¬Γ«αδ   ó   Base.Init   ¿
  727. Derived.Init ¿ß»«½∞ºπεΓß∩    ñ½∩   «Γ¬áΓá   »«ß½Ñ   óßÑσ   πß»ÑΦ¡δσ
  728. αáß»αÑñѽѡ¿⌐ »ÑαÑñ óδº«ó«¼ Fail.  çá¼ÑΓ∞ΓÑ ΓᬠªÑ,  ¬á¬ óδºδóáÑΓß∩
  729. Base.Init  ó Derived.Init ñ½∩ Γ«ú«,  τΓ«íδ »α«óÑα¿Γ∞ πß»ÑΦ¡δ⌐ ó맮ó
  730. π¡áß½Ññ«óá¡¡«ú« ¬«¡ßΓαá¬Γ«αá.
  731.