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

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá