Image
17.6.2016 0 Comments

Stretnutie s Pascalom II. /4. časť

Späť na úvod >> Späť na programovanie >> Späť na seriál

Dnes sa pozrieme na OOP z inej strany - zo strany grafiky. OOP sa skutočne najviac využíva v grafike a v práci s ňou. Vytvorme si najzákladnejší grafický objekt Figure, ktorý bude mať vlastnosti (dátové položky): súradnice x a y typu integer, booleovskú premennú Visible, ktorá bude definovať, či má byť objekt viditeľný alebo nie, a tieto schopnosti (metódy): Init, ktorá inicializuje celý objekt, GetX a GetY, ktoré vracajú aktuálnu pozíciu objektu, IsVisible udáva, či je objekt viditeľný, a metódy Draw na vykresľovanie, Show na ukazovanie, Hide na schovávanie a MoveTo na presun objektu. Zápis takéhoto objektu Figure bude vyzerať takto:

Figure = object
  X,Y : integer;
  Visible : boolean;
  procedure Init(InitX, InitY);
  function GetX : integer;
  function GetY : integer;
  function IsVisible : boolean;
  procedure Draw;
  procedure Show;
  procedure Hide;
  procedure MoveTo(NewX, NewY: integer);
end;

            Tento spôsob zápisu je nám už známy, a preto si vytvoríme prvého potomka objektu Figure - objekt Point. Jeho delarácia je:

Point = object(Figure)
  procedure Draw;
  procedure Show;
  procedure Hide;
  procedure MoveTo(NewX, NewY: integer);
end;

            Už vieme, že nemusíme uvádzať všetky dátové položky a metódy, tie objekt Point jednoducho zdedí od objektu Figure. Uvádzame len tie metódy, ktoré budeme predefinovávať.
Je dobrým zvykom prezentovať hierarchiu objektových typov v podobe unitu. Objektové typy sú deklarované v interfaceovej časti unitu, definície metód sa uvádzajú v neverejnej implementačnej časti. Na listingu č.1 je výpis unitu MyPoints.
            Podrobne ho preštudujte a snažte sa pochopiť čo najviac, na tomto unite budeme stavať svoje základy a príklady. Ak niektorému príkazu Turbo Pascalu nerozumiete, pozrite sa do manuálu alebo helpu. Ide spravidla o príkazy z jednotky Graph. Jednotku prepíšte v prostredí IDE a preložte pod menom MyPoints. Nezabudnite nastaviť cestu k jednotke Graph alebo ju prekopírujte z adresára BGI do vášho pracovného adresára, kde máte zdrojové texty! Pri prepisovaní sa snažte pochopiť, ako jednotka pracuje. Nič na tom, že metóda Figure.Draw je prázdna. Objekt Point ju predefinuje podľa svojho.
            Na listingu č. 2 je výpis unitu MyMouser, ktorý zabezpečuje prácu s myškou počítača. Aj táto jednotka je objektová. Objekt Mouse je takisto potomkom objektu Figure. Má veľmi podobný zápis ako objekt Point, len mu pribudli nové dátové položky LeftButton, RightButton a CentreButton typu boolean a niekoľko metód – Query, Left, Centre a Right. Implementačná časť je trochu zložitejšia ako pri jednotke MyPoints. Využívajú sa služby interruptu 33 BIOS-u počítača na prácu s myšou. Pre podrobnejšie informácie nazrite do príslušnej literatúry alebo to berte ako fakt. V interfaceovej časti sú deklarované aj dve premenné – logická MousePresent indikujúca prítomnosť myši a číselná MouseButtons, udávajúca počet tlačidiel myši. Veľmi dôležitou je metóda Query (otázka, Česi majú na to výstižnejší výraz "dotaz"), ktorá podá komplexné informácie o stave myšky. Na konci tohto unitu je jeho inicializačná časť. Tento unit tiež preložte pod názvom MyMouser.

            Prečo to všetko? No aby sme si mohli demonštrovať možnosti oboch jednotiek (ale hlavne MyPoints) v našom prvom aplikačnom programe MYSKA! Jeho výpis je na listingu č. 3.
            Že je akýsi krátky? Ja som vám hovoril, že hlavné časti programu vytvoreného v OOP bývajú len niekoľkoriadkové. Použijeme nami vytvorenú unitu MyMouser, ktorá zase volá unitu MyPoints. Premenná M je typu Mouse. Vymažeme obrazovku, zinicializujeme premennú (inštanciu) objektu M na súradnice 320 a 100 a volaním procedúry Show kurzor myši zobrazíme na obrazovke. Až do stlačenia ľubovoľného klávesu program volá metódu Query a na obrazovku vypisuje polohu kurzora myšky, stav stlačenia tlačidiel, počet tlačidiel a prítomnosť myšky. (Tu sa môžeme trochu pohrať - ak máme myš, kde je možné prepínať medzi dvoj- alebo trojtlačidlovým režimom, vyskúšajme to!) Nakoniec sa myška skryje a program sa ukončí.
            A na záver ako "pikošku” uvádzame výpis programu MyDemo na listingu č.4. Napíšte, preložte a skúšajte zmeniť parametre! (Znova upozorňujem na nastavenie správnych ciest pri preklade.) Krokujte a laďte! A uvidíte, v čom je krása objektov!

 
LISTING Č. l
 
unit MyPoints;
 
interface
 
uses Graph;
 
const FigColor = White;
{ Figure Color - farba objektu }
 
type
Figure = object
X, Y: Integer;
Visible: Boolean;
procedure Init(InitX, InitY: Integer);
function GetX: Integer;
function GetY: Integer;
function IsVisible: Boolean;
procedure Draw;
procedure Show;
procedure Hide;
procedure MoveTo(NewX, NewY: Integer} ;
end;
 
Point = object (Figure)
procedure Draw;
procedure Show;
procedure Hide;
procedure MoveTo(NawX, NewY:
Integer) ;                     
end;
 
implementation
 
{----------------}
(  Implementacia metod Figure:
)
{----------------}
procedure Figure.Init (InitX, InitY;
Integer) ;
begin
X := InitX;   
Y := InitY;
Visible := False; end;
 
function Figure. GetX: Integer; begin
GetX := X;. end;
 
function Figure.GetY: Integer; begin
GetY := Y; end;
 
function Figure.IsVisible: Boolean; begin
IsVisible := Visible; end;
 
procedure Figure. Draw;
begin
end;
 
procedure Figure . Show;
begin
Visible := True;
SetColor (FigColor) ;
Draw;
end;
 
procedure Figure.Hide; begin
Visible := False;
SetColor(GetBkColor);
Draw;
end;
 
procedure Figure. MoveTo(NewX, NewY:
Integer);
begin
Hide;
X := NewX;   Y := NewY;
Show;
end;
 
{----------------}
{ Implementacia metod Point:
}
{----------------}
 
procedure Point.Draw; 
begin
PutPixel(X, Y, GetColor);
end;
 
procedure Point.Snow;
begin
Visible := True;
SetColor(FigColor);
Draw;
end;
 
procedure Point.Hide;
begin
Visible := False;
SetColor(GetBkColor);
Draw;
end;
 
procedure Point.MoveTo(NewX, NewY:
Integer);
begin
Hide;
Init(NewX, NewY);
Show;
end;
 
END.
 
LISTING Č. 2
 
unit MyMouser;
 
INTERFACE
 
uses MyPoints, Dos;
type
Mouse = object (Figure)
LeftButton, CentreButton,
RightButton: Boolean;
procedure Init(InitX, InitY:
Integer);
procedure Show;
procedure Hide;
procedure MoveTo(NewX, NewY:
Integer);
procedure Query;
function Left: Boolean;
function Centre: Boolean;
 
function Right: Boolean;
end;
 
var MousePresent: Boolean;
{ Indikuje pritomnost mysi }
    MouseButtons: Byte;
{ Udava pocet tlacidiel mysi }
 
IMPLEMENTATION
 
var Regs: Registers;
 
procedure Mouse.Init(InitX, InitY:
Integer);
begin
Query;
Figure.Init(InitX, InitY);
regs.ax:=4;
regs.cx:=InitX;
regs.dx:=InitY;
intr($33,regs);
end;
 
procedure Mouse.Show;
begin
Visible:=true;
regs.ax:=4;
regs.cx:=X;
regs.dx:=Y;
intr($33,regs);
regs.ax:=1;
intr($33,regs);
end;
 
procedure Mouse.Hide;
begin
Visible:=false;
regs.ax:=2;
intr($33,regs);
end;
 
procedure Mouse.HoveTo(NewX, NewY:
Integer);
begin
Hide;
X := NewX;
Y := NewY;
Show;
end;
 
procedure Mouse.Query;
begin
regs.ax:=3;
intr($33,regs);
X:=regs.cx;.   
Y:=regs.dx;
LeftButton:=(regs.bx and 1)<>0;
RightButton:=(regs.bx and 2)<>0;
CentreButton:=(regs.bx and 4)<>0;
end;
 
function Mouse.Right: Boolean;
begin
Right:=RightButton;
end;
 
function Mouse.Left: Boolean;
begin
Left:=LeftButton;
end;
 
function Mouse.Centre: Boolean;
begin
 
Centre:=CentreButton;
end;
 
BEGIN
{Inicializacna cast}
regs.ax:=0;
intr($33,regs);
MousePresent:=regs.ax<>0;
MouseButtons:=regs.bx;
END.
 
LISTING Č.3  
program Myska; (demonstruje cinnost
MyPoints a MyMouser}
 
uses MyMouser, Crt;
 
var M :Mouse;
 
BEGIN
ClrScr;
M.Init(320, 100);
M.Show;
while nôt keypressed do
 with M do
  begin
   query;
write(#13, X:4, Y:4, Left:6,
Centre:6, Right:6,
MouseButtons:3,
MousePresent:6 );
 end;
M.Hide;
END.
 
LISTING Č. 4
 
program MyDemo;
 
uses Crt, Graph, MyPoints;
 
const N = 600;  { Skuste zmenit tieto
koeficienty !!! }
K = 4;
L = 2;
 
var B: Array[1..N] of Point;
i: integer;
dX, dY: integer;
gd, gm: integer;
 
BEGIN
gd := detect;
InitGraph(gd,gm,´´);
for i := l to N do
B[i].Init(320+round(i/L*cos(i/K)),240+ro
und(i/L*sin(i/K)));
for i := l to N do B[i].Show;
while not keypressed do
 begin
dX := random(20) - 10;   {aj tu!}
dY := random(20) - 10;
for i := l to N do with B[i] do
MoveTo(GetX+dX, GetY+dY);
delay(500);
end;
 
  for i := 1 to N do B[i].Hide;
  CloseGraph;
END.

 


Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

CES 2017: Lenovo predstavilo nové notebooky ThinkPad X1, Miix 720 a prvý smartfón s podporou Tango - Lenovo Phab 2

03.01.2017 00:09

Lenovo odštartovala ďalší ročník veľtrhu s celou škálou nových produktov. Nová generácia produktov radu ThinkPad X1 Carbon 2017 je najľahším 14-palcovým biznis notebookom, ktorý váži len 1,14kg a obsa ...

Ako na to

Tipy a triky: Ako správne poskytovať IT pomoc a ako o ňu správne žiadať?

14.12.2016 09:40

Či už ste pokročilý používateľ počítača, ktorý často poskytuje IT pomoc známym a rodine, alebo ste to vy, kto o takúto pomoc zvyčajne žiada, ľahko sa stanete nechcenou príčinou frustrácie a obrovskej ...

Ako na to

Tipy a triky: Ako diagnostikovať a opravovať neúspešné upgrady Windows 10

14.12.2016 09:37

Microsoft prešiel s Windows 10 do celkom novej éry vývoja. Namiesto samostatných verzií Windows, vydávaných zvyčajne s odstupom dvoch až piatich rokov (XP, Vista, 7 a podobne), začal svoj systém vyvíj ...

Žiadne komentáre

Vyhľadávanie

Kyocer TASK

Najnovšie videá