program kresli;
uses crt, obrazce;
type ukazatel=^xb;
     xb=record
          dalsi:ukazatel;
          pp:^bod;
        end;
var b:^bod;
    c:^cara;
    k:^elipsa;
    o:^obdelnik;
    zac,akt:ukazatel;
    kl:char;
    byl_pohyb, konec:boolean;
label cyklus_poprve;
const bakt=12;
      bostatni=14;
{**********************************************}
{**********************************************}
procedure zobrazto; {zobrazi vsechny objekty v zasobniku}
  var pom:ukazatel;
  begin
    pom:=zac;
    while pom<>nil do begin
                        if pom<>akt then pom^.pp^.svit(bostatni) else pom^.pp^.svit(bakt);
                        pom:=pom^.dalsi;
                      end;
  end;
procedure zobraz_cele; {Preview}
  var pom:ukazatel;
  begin
    vymaz;pom:=zac;
    while pom<>nil do begin pom^.pp^.svit(bostatni);pom:=pom^.dalsi;end;
    escejp;
  end;
procedure hejbej(pom:ukazatel); {pohybovani s objektem, navic se neprekresluje}
  var a:integer;
      poprve:boolean;
  begin
    a:=pom^.pp^.cojsem; vymaz2; menu;
    if a=1 then menub else menuo;    {vykresleni menu k danemu objektu}
    repeat                           {pohybovani s objektem}
      pom^.pp^.svit(bakt);
      pom^.pp^.svit(0);
      pom^.pp^.pohyb(kl);
      zobrazto;
      kl:=readkey; if ord(kl)=0 then kl:=readkey;
      byl_pohyb:=true;
    until not ((ord(kl)=72) or (ord(kl)=80) or (ord(kl)=75) or (ord(kl)=77) or (ord(kl)=50) or
          (ord(kl)=52) or (ord(kl)=54) or (ord(kl)=56) or (ord(kl)=43) or (ord(kl)=45));
    pom^.pp^.svit(bakt);
  end;
procedure zarad(q:ubod); {zaradi objekt do zasobniku}
  var pom:ukazatel;
  begin
    new(pom);
    new(pom^.pp);
    pom^.pp:=q;
    pom^.dalsi:=zac;
    zac:=pom;
    akt:=pom;
    zobrazto;
  end;
procedure kopiruj; {zkopiruje akualni objekt a zaradi do zasobniku}
  var pom:ukazatel;
      a0,a1,a2,a3,a4:integer;
  begin
    with akt^.pp^ do begin
      a0:=cojsem;a1:=ukazx+10;a2:=ukazy+10;a3:=ukazsx;a4:=ukazsy; end;
    case a0 of
      1: zarad(new(ubod,init(a1,a2,a3,a4)));
{      1: begin new(b,init(a1,a2,a3,a4)); zarad(b); end;}
      2: begin new(c,init(a1,a2,a3,a4)); zarad(c); end;
      3: begin new(k,init(a1,a2,a3,a4)); zarad(k); end;
      4: begin new(o,init(a1,a2,a3,a4)); zarad(o); end;
    end;
  zobrazto;
  end;
procedure smaz; {smazani objektu ze zasobniku}
  var pom,pomm:ukazatel;
  begin
  if akt<>nil then begin
             pom:=zac;
             if pom=akt then begin {smazani pokud je na vrcholu zasobniku}
                               pom^.pp^.svit(0);
                               zac:=pom^.dalsi;
                               akt:=zac;
                               dispose(pom^.pp);
                               dispose(pom);
                             end
                        else begin {smazani pokud neni na vrcholu zasobniku}
                               while pom^.dalsi<>akt do pom:=pom^.dalsi;
                               akt^.pp^.svit(0);
                               pomm:=akt;
                               pom^.dalsi:=akt^.dalsi;
                               akt:=pom;
                               dispose(pomm^.pp);
                               dispose(pomm);
                             end;
             end;
  end;
procedure smaz_vse; {smaze vsechny objekty ze zasobniku}
  var pom,pomm:ukazatel;
  begin
    if zac<>nil then begin
                       pom:=zac;
                       while pom<>nil do begin
                                           pomm:=pom;
                                           pom^.pp^.svit(0);
                                           zac:=pom^.dalsi;
                                           pom:=pom^.dalsi;
                                           dispose(pomm^.pp);
                                           dispose(pomm);
                                         end;
                     end;
    zac:=nil; akt:=nil;
  end;
procedure LoadSave(LS:byte; soubor:string); {Ulozeni/Otevreni souboru z disku}
var f:file of integer;
    pom:ukazatel;
    a0,a1,a2,a3,a4:integer;
begin
assign(f,soubor);
if ls=0 then begin {Cast0: Otevreni souboru z disku}
          reset(f);
          while not eof(f) do begin
                 read(f,a0,a1,a2,a3,a4);
                 case a0 of
                   1: begin new(b,init(a1,a2,a3,a4)); zarad(b); end;
                   2: begin new(c,init(a1,a2,a3,a4)); zarad(c); end;
                   3: begin new(k,init(a1,a2,a3,a4)); zarad(k); end;
                   4: begin new(o,init(a1,a2,a3,a4)); zarad(o); end;
                 end;
               end;
          end;
if ls=1 then begin {Cast1: Ulozeni souboru na disk}
          rewrite(f);
          pom:=zac;
          while pom<>nil do begin
                              with pom^.pp^ do begin
                                  a0:=cojsem; a1:=ukazx;
                                  a2:=ukazy; a3:=ukazsx; a4:=ukazsy;
                                  end;
                              write(f,a0,a1,a2,a3,a4);
                              pom:=pom^.dalsi;
                            end;
          end;
close(f);
end;
{*******************************************}
{ M A I N   P R O G R A M }
{*******************************************}
begin
 IniGra;
 zac:=nil; akt:=nil; byl_pohyb:=false; konec:=false;
 vymaz;vymaz2;menu; {nastaveni pocatecnich hodnot a obrazovky}
 repeat {smycka na zpracovani prikazu z klavesnice}
  kl:=readkey; if kl=#0 then kl:=readkey;
  cyklus_poprve: {projede jeste jednou smycku bez cekani na stisk klavesy}
  byl_pohyb:=false;
  case ord(kl) of
    59: begin {F1 bod}
          new(b,init(100,100,0,0)); zarad(b); hejbej(akt);
        end;
    60: begin {F2 cara}
          new(c,init(100,100,100,100)); zarad(c); hejbej(akt);
        end;
    61: begin {F3 elipsa}
          new(k,init(100,100,100,100)); zarad(k); hejbej(akt);
        end;
    62: begin {F4 obdelnik}
          new(o,init(100,100,100,100)); zarad(o); hejbej(akt);
        end;
    63: {F5 Kopirovani aktualniho objektu} kopiruj;
    64: {F6 smaze vsechny objekty ze zasobniku} smaz_vse;
    65: {nahrani z disku F7} loadsave(0,'data.dat');
    66: {ulozeni na disk F8} loadsave(1,'data.dat');
    67: {F9 Nahled} Zobraz_cele;
    68: {F10 Napoveda} Help;
    9:  {TAB zmena aktualniho objektu}
        if akt<>nil then if akt^.dalsi<>nil then akt:=akt^.dalsi else akt:=zac;
    79: konec:=true;
    83: {Del smazani aktualniho objektu} smaz;
    else begin if (akt<>nil) then hejbej(akt); end;
      {pokud je jina klavesa nez uvedena v casi Case, tak pohybuj s objektem}
  end; {End Case}
 vymaz2; menu; zobrazto;
 if byl_pohyb then goto cyklus_poprve;
 byl_pohyb:=false;
 until konec;
 CloGra;
end.
 
Zpět