ãŸãã¯ãLazarusããã³FreePascalã®OOPã®åºæ¬ååã«ã€ããŠå¯èœãªéãã·ã³ãã«ã«
ããŒãI
OOPïŒãªããžã§ã¯ãæåããã°ã©ãã³ã°ïŒã2ã€ã®æ¹æ³ã§åŠç¿ã§ããŸãïŒã¯ã©ã¹ã®æ§é ãšç¶æ¿ã®ååã«é¢ãã裞ã®çè«ãå€æ æ§ãã«ãã»ã«åãäžãã100åã®æ¬ãèªãã§ãã ãããããšãã°ãæ¢è£œã®ã³ãŒããåŠçãããããŒãããäœããã·ã³ãã«ã ãçŸãããã®ã«ããã
Pascalãdelphiãããã³lazarusã«æ§ãããããã¹ãŠã®æ¬ïŒç§ã¯åŸè
ã«ã€ããŠ2ã€ãçºèŠããŸããïŒã§ãéåžžã«ãã䌌ãéšåãOOPã«æ§ããããŠããŸãã ãããã®æ¬ãããæ代é
ãã®æ§é çã¢ãããŒããã©ãã»ã©ã¯ãŒã«ãªOOPã§ãããã«ã€ããŠå€ããåŠã¶ããšãã§ããŸããããããå®è·µããã®ã«ååãªã¹ãã«ãåŸãããšãã§ããŸããã ãã¡ãããããžã¥ã¢ã«ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ã³ã³ããŒãã³ããšæ§é èŠçŽ ã¯ãªããžã§ã¯ãã§ãããããããžã¥ã¢ã«IDEã䜿çšããããã°ã©ããŒã¯æ¢ã«ããã©ã«ãã§OOPã䜿çšããŠããŸãããç¬èªã®æ§é ãšæœè±¡åãOOPãã©ãã€ã ã«è»¢éããããšã¯éåžžã«å°é£ã§ãã ãã¹ãŠã®é
åãç解ããæ°ããå±æãè©äŸ¡ããããã«ãç§ã¯å°ããªã¢ããªã±ãŒã·ã§ã³ãäœæããããšã«ããŸããã åæã«ãäžè§æ³ã®ååšãæãåºããŸããã
ã¢ããªã±ãŒã·ã§ã³ã¯ããµã€ãºãè²ãè±ã³ãã®æ°ãªã©ãããŸããŸãªç¹æ§ãæã€50åã®æ¥µãã©ãã©ã³ãã ãªå Žæã«ç»é¢ã«æç»ããŸãã ãã®åŸãããããããããæ°ãããã®ãæããªã©ã ãã¡ãããæ§é ããã°ã©ãã³ã°ã®åçã䜿çšããŠã50ã®ããªã¥ãŒã ãæã€éåžžã®å€æ¬¡å
é
åãäœæãããã®äžã«ãã¹ãŠã®åºæã®ç¹æ§ãæ ŒçŽã§ããŸãã ãã ããpascalã¯ããŒã¿ã®å³å¯ãªåæå®ãæå³ãããããé
åã¯ç°ãªãåã®èŠçŽ ã§æ§æã§ããªãããšã«æ³šæããŠãã ããã ã¬ã³ãŒãã®é
åïŒã¬ã³ãŒãïŒãäœæã§ããŸãããèšé²ããã¯ã©ã¹ãŸã§ãããããªããšã¯äœã§ãã-1ã¹ãããã ããã§è¡ããŸãã
OOPã®éèŠãªååã¯ã«ãã»ã«åã§ãã ããã¯ãã¯ã©ã¹ãèªèº«ã®å éšã§ãã®äœæ¥ã®ãã¹ãŠã®ããžãã¯ãé ããªããã°ãªããªãããšãæå³ããŸãã ã¯ã©ã¹ïŒTPetalãšåŒã³ãŸãïŒã«ã¯ãäžæã®ç¹æ§ïŒäžå¿åº§æšããµã€ãºãããŒã©ãŒããŒãºæ¹çšåŒã®ä¿æ°ãè²ïŒãããã³äœæ¥æ¹æ³ãå®çŸ©ããããŸããŸãªçš®é¡ã®ããŒã¿ãæã€ãã£ãŒã«ãããããŸãã ããã°ã©ã ã®ä»ã®èŠçŽ ã¯ãã¹ãŠããããã®ã¡ãœãããåŒã³åºãã ãã§ãå®è£ ã®è©³çŽ°ã詳ãã調ã¹ãå¿ èŠã¯ãããŸããã ã¯ã©ã¹ã¯èªåèªèº«ãæããŠæ¶å»ããããšãã§ããã¯ãã§ãã ãŸããååãªïŒ
{ TPetal } TPetal = class private R, phi: double; X, Y, CX, CY: integer; Scale, RColor, PetalI: integer; public constructor Create (Xmax, Ymax: integer); procedure Draw (Canvas: TCanvas; Erase: boolean = FALSE); end;
ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯2ã€ã®ãã©ã¡ãŒã¿ãŒããããŸãããããã¯æç»ãè¡ããããã£ã³ãã¹ã®å¢çç·ã§ãã ã³ã³ã¹ãã©ã¯ã¿ãŒã®å®è£ ã¯æ¬¡ã®ãšããã§ãã
constructor TPetal.Create(Xmax, Ymax: integer); begin inherited Create; CX:=Random(Xmax); CY:=Random(Ymax); RColor:=1+Random($FFFFFF); Scale:=2+Random(12); PetalI:=2+Random(6); end;
Delphi / Lazarusã®ãã¹ãŠã®äººå·¥ã¯ã©ã¹ã¯ãTObjectã¯ã©ã¹ã®çŽæ¥ãŸãã¯éæ¥ã®åå«ã§ãããã®ã¯ã©ã¹ã®ãªããžã§ã¯ããäœæããå Žåããªããžã§ã¯ããæ£ããäœæãããã³ã³ãã¥ãŒã¿ãŒã¡ã¢ãªãå²ãåœãŠãããããã«ã芪ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãå¿ èŠããããŸãã ãããã£ãŠãã³ã³ã¹ãã©ã¯ã¿ãŒã®éå§æã«ã芪ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããŸãã ãã®åŸãããŒã©ãŒããŒãºã®ãŠããŒã¯ãªç¹æ§ãã©ã³ãã ã«çæããŸããäžå¿ã®åº§æšãè²ãã¹ã±ãŒã«ä¿æ°ãããã³è±ã³ãã®æ°ã決å®ããä¿æ°ã§ãã
次ã¯æç»æ¹æ³ã§ãã ã芧ã®ãšããããªããžã§ã¯ããæç»ãŸãã¯æ¶å»ããããã«ã2çªç®ã®ãã©ã¡ãŒã¿ãŒããããããã©ã«ãã§ã¯å€ãFALSEã§ããå¯äžã®ã¡ãœãããèšè¿°ããŸããã ããã¯ãæç»ãšåé€ãåãæäœã§ããããªããžã§ã¯ãã®ã¿ãã©ã³ãã ãªè²ã§æç»ãããé»ã§æ¶å»ãããããã§ãã 2çªç®ã®ãã©ã¡ãŒã¿ãŒã䜿çšããã«ããã°ã©ã ããã¡ãœãããåŒã³åºããããšããªããžã§ã¯ããæç»ãããEraseãã©ã¡ãŒã¿ãŒã䜿çšãããšããªããžã§ã¯ããæ¶å»ãããŸãã
procedure TPetal.Draw(Canvas: TCanvas; Erase: boolean); begin phi:=0; if Erase then RColor:=clBlack; with Canvas do while phi < 2*pi do begin R:=10*sin(PetalI*phi); X:=CX+Trunc(Scale*R*cos(phi)); Y:=CY-Trunc(Scale*R*sin(phi)); Pixels[X,Y]:=RColor; phi+=pi/1800; end; end;
è±ã³ããæãããã«ã極座æšç³»ã§æ¥µãã©é¢æ°ã䜿çšãããŸã ïŒ

ããã§ãÏã¯ååŸåº§æšã決å®ããÏã¯è§åºŠåº§æšã決å®ããŸãã αã¯ãè±ã³ãã®é·ãã決å®ããä¿æ°ã§ãã ç§ãã¡ã®åŒã§ã¯ããã©ãå°ãããªããããªãããã«ãä¿æ°ã¯ããã«10ã«çãããªããŸãã 360床ïŒwhileã«ãŒãïŒããã¹ãŠãã£ããã£ããããã«ãè§åºŠåº§æšã¯0ãã2ÏãŸã§ã®ç¯å²ã§ãã ãããŠãæŸå°ç¶åº§æšãååŸããåŸããã«ã«ãïŒxãšyãèšç®ããŠããã®ç¹ããã£ã³ãã¹ã«æç»ããŸãïŒçŸä»£ã®ã³ã³ãã¥ãŒã¿ãŒãèšç®ãå®è¡ããé床ãããäžåºŠé©ãããŸãïŒã¡ãœããå ã§ã¯ãäžè§é¢æ°èšç®ã®é·ããµã€ã¯ã«ããããŸãã Zx-ã¹ãã¯ãã«ïŒã åŒïŒããã°ã©ã å ã®PetalIïŒã®ä¿æ°kã¯ãè±ã³ãã®æ°ã決å®ããŸãã ãããŸã§ã®ãšãããç°¡åã«ããããã«ãæŽæ°ã®ã¿ã䜿çšããŠããããããã¹ãŠã®ãã©ã¯ããªãŒããŒã©ããããªãè±åŒãæã€ãã€ããã³ã€ãã§ãã
ãããã£ãŠãã¯ã©ã¹ã¯å®è£ ãããŠãããå¿ èŠãªã¹ãã«ããã¹ãŠåããŠããŸãã 䜿çšããæéã§ãã ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã¢ãžã¥ãŒã«ã§ã¯ããŸããTPetalã¯ã©ã¹ã®50åã®ãªããžã§ã¯ãã®é åã宣èšããå¿ èŠããããŸãã次ã«ããã©ãŒã ã«ImageãšTimerãã¹ããŒãããã©ãŒã å šäœïŒã¯ã©ã€ã¢ã³ãïŒã«ã€ã¡ãŒãžãã¹ãã¬ããããã¿ã€ããŒã«100ããªç§ã®å¿çæéãèšå®ããŸãã ã¿ã€ããŒã¡ãœããã¯æ¬¡ã®ããã«ãªããŸãã
var Form1: TForm1; Marg: boolean; Petals: array [0..49] of TPetal; CurPetal: smallint; //----------------------------------------------------------------------------------- procedure TForm1.Timer1Timer(Sender: TObject); begin if not Marg then begin Petals[CurPetal]:=TPetal.Create(img.Width,img.Height); Petals[CurPetal].Draw(img.Canvas); CurPetal+=1; if CurPetal=50 then Marg:=TRUE; end else begin Petals[50-CurPetal].Draw(img.Canvas,TRUE); Petals[50-CurPetal].Free; CurPetal-=1; if CurPetal=0 then Marg:=FALSE; end; img.Canvas.TextOut(10,10,IntToStr(CurPetal)+' '); end;
ã芧ã®ãšãããç§ã¯ããã€ãã®ã°ããŒãã«å€æ°ã䜿çšããŸãããCurPetal-ãªããžã§ã¯ãã«ãŠã³ã¿ãŒã¯ã0ã50ã®å€ãåããŸãã Margã¯ã«ãŠã³ã¿ãŒããŒããŒã€ã³ãžã±ãŒã¿ãŒã§ãããã¡ãœããã®ããžãã¯ãããã¹ãŠãéåžžã«æ確ã§ãªããã°ãªããŸããã
æ§é ããã°ã©ãã³ã°ã®ãã©ãã€ã ã䜿çšããå Žåãã¿ã€ããŒãã³ãã©ãŒå ã§ãäžæã®ãã©ã®ãã¹ãŠã®ç¹æ§ãåå¥ã«åæåãããããæç»ããŠããæ¶å»ããå¿ èŠããããŸãã ãã®æ¹æ³ã¯æé·ããæããã§ã¯ãªãã£ãã§ãããã ããããä»ã§ã¯ãã¹ãŠãåç¬ã§è¡ãã¯ã©ã¹ããããŸã-ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ããã«ãã¹ãŠã®ç¹æ§ãåæåããDrawPetalã¯ã©ã¹ã¡ãœããã¯ãã¹ãŠã®èšç®ããã³ã¬ã³ããªã³ã°ããžãã¯ãã«ãã»ã«åããCanvasããããã£ãæã€å¿ èŠãªãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãååŸããŸãïŒããã¯ä»»æã®ãã©ãŒã ã§ããããã³ã»ãŒãã¹ãŠã®ã³ã³ããŒãã³ãïŒã çµæã¯ããã®ãããªçŽ æŽãããã¹ã¯ãªãŒã³ã»ãŒããŒã§ãã
OOPã®æ¬¡ã®åå-ç¶æ¿ãæ¢æ±ããŠãåŸã§TetallappingPetalãªã©ã®TPetalã¯ã©ã¹ããåå«ãäœæã§ããŸãããã®å ŽåãããŒã©ãŒããŒãºã«ã¯è±ã³ããéãªããŸãã å ç¥ã¯ã©ã¹ã§ãããïŒãŠãããŒãµã«åããããã«ïŒè¡ãã«ã¯ãPetalIãã£ãŒã«ãã®ã¿ã€ããå®æ°ã«å€æŽããé¢é£ããã«ãŒã«ã«åŸã£ãŠãã®ãã£ãŒã«ããã©ã³ãã ãªå°æ°ã§åæåã§ããããã«åã®ã³ã³ã¹ãã©ã¯ã¿ãŒããªããŒãããå¿ èŠããããŸãã
ãããžã§ã¯ããã¡ã€ã«ãbitbucketãªããžããªã«ä¿åããã¹ããŒãžããšã«åå¥ã®ãã©ã³ããäœæããŸããã äžèšã®äŸã¯lesson1ãã©ã³ãã«ãããŸãã
ããŒãII
ä»ãç§ã¯ç§ãã¡ããã£ãããšãããããšãææ¡ããŸãã ãããã£ãŠãè±ã³ãã®æ°ã3ã16ã®ããŒã©ãŒããŒãºãæç»ã§ããTPetalã¯ã©ã¹ããããŸãããã ããéãªãåããªãè±ã³ãã§ååŸãããã¹ãŠã®ãªããžã§ã¯ãã äžæ¹ãäžã®ãã¬ãŒããèŠããšãããã«å€ãã®çš®é¡ãããããšãããããŸãã 圢ç¶ã¯ãn / dã«çããä¿æ°ã«ãã£ãŠæ±ºå®ãããŸãã

TPetalã¯ã©ã¹ããåãçæããŸãã
{ TPetal } TPetal = class protected R, phi, PetalI: double; X, Y, CX, CY: integer; Scale, RColor: integer; public constructor Create (Xmax, Ymax: integer); procedure Draw (Canvas: TCanvas; Erase: boolean = FALSE); overload; end; { TOverlappedPetal } TOverlappedPetal = class (TPetal) public constructor Create (Xmax, Ymax: integer); procedure Draw (Canvas: TCanvas; Erase: boolean = FALSE); overload; end;
TOverlappedPetalã¯ã©ã¹ã§ã¯ãç¥å ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãšãªãŒããŒããŒããããDrawPetalã¡ãœãããšäžç·ã«åäœããç¬èªã®ã³ã³ã¹ãã©ã¯ã¿ãŒãè¿œå ããŸãïŒå®éãæçµçã«ã¯ããããŸã£ãã䜿çšããŸããããçŸæç¹ã§ã¯ã¯ã©ã¹ã®åå«ã§ã¡ãœããã®ãªãŒããŒããŒãã瀺ãè¯ãæ¹æ³ã§ãïŒã å®è£ ã¯æ¬¡ã®ãšããã§ãã
{ TOverlappedPetal } constructor TOverlappedPetal.Create(Xmax, Ymax: integer); begin inherited Create (Xmax,Ymax); while PetalI=Round(PetalI) do PetalI:=(1+Random(6))/(1+Random(6)); end; procedure TOverlappedPetal.Draw(Canvas: TCanvas; Erase: boolean); begin phi:=0; if Erase then RColor:=clBlack; with Canvas do while phi < 12*pi do begin R:=10*sin(PetalI*phi); X:=CX+Trunc(Scale*R*cos(phi)); Y:=CY-Trunc(Scale*R*sin(phi)); Pixels[X,Y]:=RColor; phi+=pi/1800; end; end;
TOverlappedPetalã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ç¶æ¿ãããã¡ãœããã䜿çšããŸãããPetalIãã£ãŒã«ãã®å€ãå€æŽãããã©ã®åœ¢ã«åœ±é¿ããä¿æ°ãèšå®ããããšãããããŸãã ãã£ãŒã«ããèšç®ãããšããTPetalã®å ç¥ããã§ã«æã£ãŠãããã©ãŒã ãè€è£œããªãããã«æŽæ°ãé€å€ããŸãã
ãã®äŸã®ãã¡ã€ã«ã¯ããªããžããªã®lesson2ãã©ã³ãã«ãããŸãã
ããŠãããèŠããšãOOãèããŠããããã°ã©ããŒã§ãã£ãŠããç¥å ãšåå«ã®DrawPetalã¡ãœããã®å®è£ ã¯ã»ãŒåãã§ããããããbutthurtãšåŒã°ããçšåºŠãæåã§ãããããOOããã°ã©ããŒã§ããã«ããããããããŸã åŽååã®ããã°ã©ããŒãäžè¶³ããŠããããšãæããã«ãªããŸããªãã¡ã¯ã¿ãªã³ã°ã®ç¬¬äžäººè -ç¹°ãè¿ã

å®è£ ã®éãã¯ãä¿æ°ã«æ°ÏïŒ2ãŸãã¯12ïŒãæãããã®ã®ã¿ã§ãã ãã®ä¿æ°ãç¥å TPetalã®å¥ã®ãã£ãŒã«ãïŒãã£ãŒã«ãKïŒã«åã蟌ã¿ãDrawPetalã¡ãœããã®äžèŠãªãªãŒããŒããŒããä»ããåé€ããŠãã¯ã©ã¹ã®æ¬¡ã®æ§é ãååŸããŸãã
{ TPetal } TPetal = class protected R, phi, PetalI: double; X, Y, K, CX, CY: integer; Scale, RColor: integer; public constructor Create (Xmax, Ymax: integer); procedure Draw (Canvas: TCanvas; Erase: boolean = FALSE); end; { TOverlappedPetal } TOverlappedPetal = class (TPetal) public constructor Create (Xmax, Ymax: integer); end;
TOverlappedPetalã®åå«ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã®ã¿ãTPetalã®ç¥å
ãšç°ãªããŸããããªããžã§ã¯ãæåããã°ã©ãã³ã°ã®ãã¹ãŠã®ååãæ確ãã€å®å
šã«å®èšŒããŸããã
- ã«ãã»ã«å ïŒã¯ã©ã¹ã®ãã¹ãŠã®äœæ¥ã¯ããèªäœã®å
éšã«ãããã¯ã©ã¹ãšã®å€éšéä¿¡ã¯ã¡ãœããã®ã«ããã«ãšå¿
èŠãªæå°éã®ãã©ã¡ãŒã¿ãŒã®è»¢éã®ã¿ã§ãïŒ;
- ç¶æ¿ ïŒéè€ããªãè±ã³ããæã€ãã©ã®ã¯ã©ã¹ããéè€ããè±ã³ããæã€ãã©ã®ã¯ã©ã¹ãåºç£ããŸããïŒ;
-æå°éã ããªã¢ãŒãã£ãºã ïŒã¡ãœããã®ãªãŒããŒããŒãã瀺ããŸãã-1ã€ã®ååã§ãããå®è£
ã¯ç°ãªããŸãããããªã¢ãŒãã£ãºã ã®çã®åãåŸã§ç€ºãã€ããã§ãïŒã
çµæãšããŠã®ã¯ã©ã¹ã®å®è£ ã¯æ¬¡ã®ãšããã§ãã
constructor TOverlappedPetal.Create(Xmax, Ymax: integer); begin inherited Create (Xmax,Ymax); K:=12; while PetalI=Round(PetalI) do PetalI:=(1+Random(6))/(1+Random(6)); end; { TPetal } constructor TPetal.Create(Xmax, Ymax: integer); begin inherited Create; CX:=Random(Xmax); CY:=Random(Ymax); K:=2; RColor:=1+Random($FFFFF0); Scale:=2+Random(12); PetalI:=2+Random(6); end; procedure TPetal.Draw(Canvas: TCanvas; Erase: boolean); begin phi:=0; if Erase then RColor:=clBlack; with Canvas do while phi < K*pi do begin R:=10*sin(PetalI*phi); X:=CX+Trunc(Scale*R*cos(phi)); Y:=CY-Trunc(Scale*R*sin(phi)); Pixels[X,Y]:=RColor; phi+=pi/1800; end; end;
次ã®ããã«æ°ããæ§æã䜿çšããŸããïŒTOverlappedPatelã¯ã©ã¹ã®50åã®ãªããžã§ã¯ãã®2çªç®ã®é åã§ããã°ã©ã ãè£è¶³ãã166ããªç§ã®ããªã¬ãŒæéã§2çªç®ã®ã¿ã€ããŒãã¹ããŒããæåã®ã¿ã€ããŒãšåããã³ãã©ãŒã®ã³ãŒããèšè¿°ããŸããã ã¿ã€ããŒéã®é 延ã«ãããèŠèŠçã«ã¹ã¯ãªãŒã³ã»ãŒããŒã¯å°ãããŸãåäœãå§ããŸããïŒ
ããã°ã©ã ãæ¹åããã«ã¯ã©ãããã°ããã§ããïŒ 3çªç®ã®OOPã¯ãžã©-ããªã¢ãŒãã£ãºã ã®å©ããåããŠã çŸåšãç§ãã¡ã®ããã°ã©ã ã¯äºéã®ä»äºãããŠãããããã»ããµã¯ãã®åŸæ±ãæµããäžè§é¢æ°èšç®ãç¶ç¶çã«å®è¡ããŠããŸãïŒããããããã®ãããªäººã§ãïŒã ãªããžã§ã¯ãã®åäžã®é åãäœæããããšã¯ã§ããŸãããã¯ã©ã¹ã¯ç°ãªããŸããïŒ ããã¯æ¬¡ã®ããŒãã«ãªããäžèšã®äŸã®ã³ãŒãã¯lesson2-1ãã©ã³ãã«ãããŸãã
ããŒãIII
éåžžãpascalãdelphiãããã³lazarusã®æ¬ã¯ãã³ãŒããªã¹ããæ°ããã«ïŒããããæ°ããŒãžã§ã¯ãªãããããã®ãªã¹ãã®ç解ã¯æ°ããŒãžã®ããã¹ãããåŸãããªãããïŒæ°ããŒãžã®ããªã¢ãŒãã£ãºã ã«ã€ããŠèª¬æããŸãã ãŸãããã¹ã«ã«ã®æ¬ã¯äŒçµ±çã«åŠçåãã«æžãããŠããããããã¹ãŠã®äŸã¯åºçç©ããå¥ã®åºçç©ãããŸãããã®ã§ãããæœè±¡çãªã¯ã©ã¹Manãšãã®2人ã®çžç¶äººãStudentãšTeacherã®èª¬æã«é¢é£ä»ããããŠããŸãã ç§ã¯ã©ã¡ãã§ããªãã®ã§ããããã®æ¬ããå€åã®ç¥èãåŒãåºãããšã¯ã§ããŸããã§ããã ããªã¢ãŒãã£ãºã ã®æ¬è³ªãç解ããããã«çåŸãšæåž«ã®ã¯ã©ã¹ãå®è·µããããšãã§ããã®ã«ãç§ã¯æãã€ããªãã£ãã®ã§ãå
¥åããããšã§ãã¹ãŠãããäžåºŠç解ããå¿
èŠããããŸããã
ããããã¹ãŠã®æ¬ã®éåžžã«é倧ãªæ¬ ç¹ã¯ãããªã¢ãŒãã£ãºã ã®ç« ã§ã¯ãäž»ãªè³ªåã¯ããªããã§ãããããã«å¯Ÿããçãã¯ããªã¢ãŒãã£ãºã ã®æ¬è³ªå
šäœã®99ïŒ
ãåžåããããããã©ãããŠããšããããšã§ãã ãã®ãããªçãã¯ããšã³ãã«ããããã°ïŒçŸåšã®ææè
ãã«ãã¡ã€ã®ååïŒã®Vsevolod Leonovã«ããçŽ æŽãããèšäºã§èŠã€ãããŸããã ãããŠãäžè¬çã«èšãã°ãå€åã¯ãããšãã°æ¬¡ã®ããã«æ瀺ãããŸããåºæ¬çãªæœè±¡ç«ã¯ã©ã¹ããããããããå€æ°ã®çžç¶äººãçæãããŸã-KotikãLeopardikãTigraãLyovaãªã©ã ãããã¯ãã¹ãŠåæ§ã®ããããã£ãæã£ãŠããŸããããããã®ååšæ¹æ³ã¯ç°ãªããŸãã ããšãã°ããã£ãŒã¡ãœããã¯ç«ãšãã©ã§ã¯ç°ãªããŸãã ç«ã®ããŒã¹ãã¬ã€ããã¬ã€ãã¡ãœããã¯ãã足ãããããå®è£
ã®ã¡ãœãããšãªãŒããŒã©ããããŸãããå·Šã®å Žåã¯ãæãæ¡ããå®è£
ã«ãã£ãŠãããã¯ãããŸãã ãã ããç¹å®ã®ç«ã¯ãã¹ãŠãã³ç§ã®ãªããžã§ã¯ãã§ãããçµéšã®ãªãåã¯ãéããèªèããã«ããã¹ãŠã®ç«ã«å¯ŸããŠãåçãã¡ãœãããæ°žç¶çã«åŒã³åºããŸãã
ããŒã©ããŒãºã®å¥åŠãªåãæãç·Žç¿ã«æ»ããŸãããã ç°ãªãã¯ã©ã¹ã®50åã®ãªããžã§ã¯ãã®2ã€ã®é
åãšãã»ãŒåããã³ãã©ãŒãæã€ç°ãªãå¿çæéãæã€2ã€ã®ã¿ã€ããŒãåæã«äœæããããšã«ãããããã°ã©ã ã®äœæ¥ãè€éã«ããŠãããšããäºå®ã«ç«ã¡æ¢ãŸããŸããã
procedure TForm1.Timer1Timer(Sender: TObject); begin if not Marg then begin Petals[CurPetal]:=TPetal.Create(img.Width,img.Height); Petals[CurPetal].Draw(img.Canvas); CurPetal+=1; if CurPetal=50 then Marg:=TRUE; end else begin Petals[50-CurPetal].Draw(img.Canvas,TRUE); Petals[50-CurPetal].Free; CurPetal-=1; if CurPetal=0 then Marg:=FALSE; end; img.Canvas.TextOut(10,10,IntToStr(CurPetal)+' '); end; procedure TForm1.Timer2Timer(Sender: TObject); begin if not MargO then begin OPetals[CurOPetal]:=TOverlappedPetal.Create(img.Width,img.Height); OPetals[CurOPetal].Draw(img.Canvas); CurOPetal+=1; if CurOPetal=50 then MargO:=TRUE; end else begin OPetals[50-CurOPetal].Draw(img.Canvas,TRUE); OPetals[50-CurOPetal].Free; CurOPetal-=1; if CurOPetal=0 then MargO:=FALSE; end; img.Canvas.TextOut(50,10,IntToStr(CurOPetal)+' '); end;
åŽåè ã®ãšã³ã³ãŒããŒãããã®ãããªã³ãŒãããæ§ããã«ãæžããæã飲ã¿èŸŒãã§ããŸãããšãèªããªããã°ãªããŸããã æ¬ç©ã®ããã°ã©ããŒã«é²åããããšã決ããã®ã§ãå埩ã³ãŒããåãé€ããããã°ã©ã ãç°¡åã«ãããšããåé¡ã解決ããŸãã
ããã§ãTPetalãšãã®åå«ã®TOverlappedPetalã®2ã€ã®ã¯ã©ã¹ãã§ããŸããã ãã ããããã¯å°ãééã£ãŠãããããç¶æ³ãä¿®æ£ããŸãã è±åŒãéãªãããŒã©ãŒããŒãºãšéãªããªãè±ã³ããæã€ããŒã©ãŒããŒãºã¯ãã¯ã©ã¹çè«ã®èŠ³ç¹ããåçã§ãããããåãã¬ãã«ã®ã¯ã©ã¹ã§ããå¿ èŠããããŸãã ããé«ãã¬ãã«ã®æœè±¡åã«åãã£ãŠãããŒã©ãŒããŒãºã®åºæ¬ã¯ã©ã¹ãå°å ¥ããå¿ èŠãããããšãç解ããŠããŸãããããããäžèšã®2ã€ããã§ã«çæããå¿ èŠããããŸãã åã®2ã€ã®ã¯ã©ã¹ã«ãã£ããã¹ãŠã®é¡äŒŒç¹ã¯ãããŒã¹ã«è»¢éãããããã2ã€ã®åå«ã¯æãå¿ èŠãªãã®ã®ã¿ãç°ãªããŸãã
{ TCustomPetal } TCustomPetal = class protected R, phi, PetalI: double; X, Y, K, CX, CY: integer; Scale, RColor: integer; public constructor Create (Xmax, Ymax: integer); virtual; procedure Draw (Canvas: TCanvas; Erase: boolean = FALSE); end; { TPetal } TPetal = class (TCustomPetal) public constructor Create (Xmax, Ymax: integer); override; end; { TOverlappedPetal } TOverlappedPetal = class (TCustomPetal) public constructor Create (Xmax, Ymax: integer); override; end;
ããªã¢ãŒãã£ãºã ã¯ãåºæ¬ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåå«ã®å®è£ ã§ãªãŒããŒã©ãããããšããäºå®ã§è¡šçŸãããŸãïŒãªããžã§ã¯ããã¹ã«ã«ã®å€ä»£ããŒãžã§ã³ã§ã¯ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒããªãŒããŒã©ããããããšã¯äžå¯èœã ã£ããšããäžçäžã®äŒèª¬ããããŸãããç§ã¯ä¿¡ããŠããŸããïŒã ãã®ææ³ã¯ãäºçŽæžã¿ã®ä»®æ³ ãã£ã¬ã¯ãã£ãããã³ãªãŒããŒã©ã€ããã£ã¬ã¯ãã£ãã䜿çšããŠå®è£ ãããŸã ã åºæ¬ã¯ã©ã¹virtualã®createã¡ãœããã宣èšããããšã«ãããã³ã³ã¹ãã©ã¯ã¿ãŒã®å®è£ ãïŒå¿ ãããããã§ã¯ãªããïŒåå«ã§éè€ããå¯èœæ§ãããããšãæ確ã«ããŸãã æœè±¡ãã£ã¬ã¯ãã£ãã®ä»®æ³ãã£ã¬ã¯ãã£ãã«ïŒãã®å Žåã¯ããªãå¯èœã§ãããããã¯ã³ãŒããè€éã«ããŸãïŒãè¿œå ããå Žåãåºæ¬ã¯ã©ã¹ã«ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒå®è£ ããªãããšãæå³ããŸãããåå«ã«ã¯ãã®ãããªå®è£ ãå¿ èŠã§ãã å®è£ ã«ã¯åå«ã«å ±éã®æ©èœããããããåºæ¬ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãæœè±¡åããŸããã
constructor TCustomPetal.Create(Xmax, Ymax: integer); begin inherited Create; CX:=Random(Xmax); CY:=Random(Ymax); RColor:=1+Random($FFFFF0); Scale:=2+Random(12); end; constructor TOverlappedPetal.Create(Xmax, Ymax: integer); begin inherited Create (Xmax,Ymax); K:=12; while PetalI=Round(PetalI) do PetalI:=(1+Random(6))/(1+Random(6)); end; constructor TPetal.Create(Xmax, Ymax: integer); begin inherited Create (Xmax,Ymax); K:=2; PetalI:=1+Random(8); end;
ãã®ãããåºæ¬ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãåå«ã«å ±éã®ãã£ãŒã«ãïŒäžå¿åº§æšãè²ãã¹ã±ãŒã«ïŒãåæåããŸãã ããããåå«ã®èšèšè ã¯æåã«åºæ¬ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãã次ã«æ®ãã®ãã£ãŒã«ãã®ç°ãªãåæåãå®è¡ããŸã-è§åºŠåº§æšã®ä¿æ°ãšããŒã©ãŒããŒãºã®åœ¢ç¶ã決å®ããä¿æ°ã
次ã«ãã¡ã€ã³ããã°ã©ã ã³ãŒããã©ã®ããã«ç°¡ç¥åãããŠããããèŠãŠãã ããã ç°ãªãã¯ã©ã¹ã®50åã®ãªããžã§ã¯ããæã€2ã€ã®é åã®ä»£ããã«ãTCustomPetalã¯ã©ã¹ã®ãªããžã§ã¯ããæã€1ã€ã®é åã宣èšããã¿ã€ããŒã®ã€ãã³ããã³ãã©ãŒã次ã®ããã«æžãæããŸãã
procedure TForm1.Timer1Timer(Sender: TObject); begin if not Marg then begin if Random(2)=1 then Petals[CurPetal]:=TPetal.Create(img.Width,img.Height) else Petals[CurPetal]:=TOverlappedPetal.Create(img.Width,img.Height); Petals[CurPetal].Draw(img.Canvas); CurPetal+=1; if CurPetal=50 then Marg:=TRUE; end else begin Petals[50-CurPetal].Draw(img.Canvas,TRUE); Petals[50-CurPetal].Free; CurPetal-=1; if CurPetal=0 then Marg:=FALSE; end; img.Canvas.TextOut(10,10,IntToStr(CurPetal)+' '); end;
åäœããžãã¯ïŒ0ãã3ãŸã§ã®ä¹±æ°ãååŸããã1ã®å Žåãåã¯ã©ã¹TPetalã®ã³ã³ã¹ãã©ã¯ã¿ãŒãCustomPetalé åãã次ã®ãªããžã§ã¯ãã«å¯ŸããŠåŒã³åºãããŸããããã§ãªãå Žåãåå«ã¯ã©ã¹TOverlappedPetalã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããŸãã ããã¯ãããªã¢ãŒãã£ãºã ãçŸããå Žæã§ããåãã¿ã€ãã®TCustomPetalã®ãªããžã§ã¯ãã®é åãããã«ãããããããå®éã«ã¯ããªããžã§ã¯ãã¯åå«ã¿ã€ãã§äœæãããŸãã ãããã¯åããã£ãŒã«ããæã£ãŠããã®ã§ãåãæ¹æ³-ãããã§ã®äœæ¥ã¯ããã°ã©ã ã«ãšã£ãŠéãã¯ãããŸããã åãDrawPetalã¡ãœãããåŒã³åºããŸããããªããžã§ã¯ãã®ã¿ã€ãã«ãã£ãŠåäœãç°ãªããŸãã ããã°ã©ã ã³ãŒããå€§å¹ ã«ç°¡çŽ åãããèŠèŠçã«ãªããŸããïŒããã§ãOOPãã©ãã€ã ãå³ãã£ã人ã«ãšã£ãŠïŒã
å€æŽãããæ°ããäŸã¯ã lersson3ãã©ã³ãã«ãããŸãã
ä»ã«ã©ã®ããã«äœæ¥ãæ¹åã§ããŸããïŒ ç§ã®å¥œã¿ãšããŠã¯ã50æ¬ã®ãã©ãé£ç¶ããŠæããããäžæžãããããããããããé£ç¶çã«çºçãããªãã·ã§ã³ãããé åçã§ãã ãããè¡ãã«ã¯ãã¿ã€ããŒãã³ãã©ãŒããããã«å€æŽããå¿ èŠããããŸããããã¯ãOOPã«é¢é£ä»ããããªããªããŸããããè³ãåããããšãã§ããŸãã
procedure TForm1.Timer1Timer(Sender: TObject); begin if Assigned (Petals[CurPetal]) then begin Petals[CurPetal].Draw(img.Canvas,TRUE); Petals[CurPetal].Free; end; if Random(2)=1 then Petals[CurPetal]:=TPetal.Create(img.Width,img.Height) else Petals[CurPetal]:=TOverlappedPetal.Create(img.Width,img.Height); Petals[CurPetal].Draw(img.Canvas); CurPetal+=1; if CurPetal=PetalC then CurPetal:=0; img.Canvas.TextOut(10,10,IntToStr(CurPetal)+' '); end;
ããã°ã©ã ãããã«æ¹åããããã«ããã©ã®é åãåçã«ãïŒPetalsïŒTCustomPetalã®é åïŒããã©ãŒã ãäœæãããšãã®ã€ãã³ããã³ãã©ãŒã§ããµã€ãºãèšå®ããŸã-ç»é¢äžã®50åã®ãã©ãèãããããã«èŠããããã70ã«å¢ãããŸããã ã¿ã€ããŒãã³ãã©ãŒã®ããžãã¯ãå€æŽãããåæã«ç°¡ç¥åãããŸãããCurPetalã¯ãé åå ã®çŸåšã®ããŒãºæ°ãžã®ãã€ã³ã¿ãŒã§ããã0ãã70ãŸã§ç¡éã«å®è¡ãããŸãïŒåçé åã¯åžžã«ãŒãããçªå·ä»ããéå§ããããïŒã æåã«ãCurPetalçªå·ãæã€roseé åã®èŠçŽ ã以åã«äœæããããã©ããã確èªãããäœæãããŠããå Žåã¯äžæžããããŠç Žæ£ãããŸãã 次ã«ãã©ã³ãã ãªæ¹æ³ã§ãåãçªå·ãæã€åãèŠçŽ ãäœæãããŸãã é åçªå·ãžã®ãã€ã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ããããé åã®å¢çããã倧ãããªããšãªã»ãããããŸãïŒãã®å Žåãé åã®æåŸã®æ¢åã®èŠçŽ ã¯èŠçŽ çªå·69ã«ãªããŸãã ã¹ã¯ãªãŒã³ã»ãŒããŒã®æçµãã¥ãŒïŒããããããããããã«äžéš-ã«ãŠã³ã¿ãŒïŒïŒ
æçµãããžã§ã¯ãã¯lesson3-1ãã©ã³ãã«ãããŸãã
ææ°ããŒãžã§ã³ã§ã¯ãåäœäžã«äœ¿çšãããã³ã³ãã¥ãŒã¿ãŒã¡ã¢ãªã®éã¯å°ããªMBã§7ã«åæžãããŸããããæåã¯ã¢ããªã±ãŒã·ã§ã³ã30 MBã§éåžžã«æ¥œããã£ãã§ãã OOPã䜿çšããŠãã³ãŒããªãã¡ã¯ã¿ãªã³ã°ãšæ°åŠã®ç¥èã«ãããçŸããå¹ççãªã³ãŒããäœæã§ããŸããåžžã«ãããèŠããŠãããŠãã ããã
PSã¢ããããŒã
å®éã®ã³ã¡ã³ãã«é¢é£ããŠãç§ã¯äžæ£ç¢ºããšã°ãªãããä¿®æ£ãããã©ãããã³ã®äœæ¥ãTPetalsã¯ã©ã¹ïŒå¥ã®ããŒãžã§ã³ã§ã¯TQPEtalsïŒã«è»¢éããŸãããTPetalsã¯ã©ã¹ã¯ãªããžã§ã¯ãã®ãªã¹ãïŒTObjectListïŒãŸãã¯ãªããžã§ã¯ãã®ãã¥ãŒïŒTObjectQueueïŒã䜿çšããŠããã»ã¹å šäœããæ瞊ãããŸãã ã¿ã€ããŒã¡ãœããã¯ç°¡æœã«ãªããŸããã
procedure TForm1.Timer1Timer(Sender: TObject); begin P.DrawNext; end;
ãŸããDrawã¡ãœããã§ã¯ããã©ãæ¶å»ããããšãã§ãã¯ããªã³ã«ãªããŸã-ä»ã®ãã©ãé»ãç¹ã§ãæãªãããããã©ããã ææ°ã®ãããžã§ã¯ãã³ãŒãã¯lesson4-1ïŒãªã¹ãïŒããã³lesson 4-2ïŒãã¥ãŒïŒ ãã©ã³ãã«ãããŸãã