Los programas a qui incluidos son los que se usan con el proposito de ilustar mejor la explicacion de la seccion de tutoriales, estos programas estan documentados para un mayor entendimiento.

PROGRAMAS:

MODULO 1

Programa Modotexto

Programa ejemplo

Programa pcxx

MODULO 2

Programa LineaHoriz

Programa LineaVer

Programa Linea (usando la inst. putpixel).

Programa Linea (usando la función Random( ))

Programa linea (usando la función. Linerel( ))

Programa Rectangulo

Programa Circulo

Programa Circulo_ecuación

Programa Rect_circulo

Programa Elipse

Programa Barras

Programa Barras3

Programa Sectores

Programa Pastel_Graph

MODULO 3

Programa Present

Programa Avionazo

MODULO 4

Programa Importa_del_PM


(*                       UNIVERSIDAD DE GUADALAJARA



                    Coordinación de Sistemas

                    Unidad de Cómputo Académico



    El siguiente programa esta echo en modo texto, el cual escribe en

 el centro de la pantalla la leyenda "UNIVERSIDAD DE GUADALAJARA", en

 seguida una doble línea para separar una gráfica echa con

caracteres

 ASCII, con dos categorias "PERSONAS" y "MES".



    Todo el texto esta en color #7 (Gris Claro), que es el color por

 defecto en modo texto, ya que no se indico ningun color, con la

 función " TEXTCOLOR ".

                                                               

    *)

Program ModoTexto;

Uses

   Crt;

Var

   x : integer;

(* Procedimiento por el cual se escribe en el centro de la pantalla la

leyenda "UNIVERSIDAD DE GUADALAJARA" y en seguida una línea doble.

 *)

Procedure presentacion;

begin

   gotoxy (25,2);

   write(' UNIVERSIDAD DE GUADALAJARA ');

   gotoxy (1,3);

   for x:=1 to 80 do

      write(chr(205));

   readln

end;



(* Procedimiento que asigna las categorias a la gráfica, las categorias

son: "PERSONAS" y "MES" *)

Procedure letras;

begin

   gotoxy(1,10);

   write('PERSONAS');

   gotoxy(45,23);

   write('MES');

end;



(* Procedimiento que dibuja la gráfica (en modo texto), con los

caracteres

del códio ASCII, el caraceter #179 "³", el #192 "À" y

el catacter #196 "Ä" *)

Procedure Lineas;

Var

   a,b : integer;

begin

   for b := 10 to 22 do

      begin

        gotoxy(9,b);

        write(chr(179));

      end;

   gotoxy(9,22);

   write(chr(192));

   For a := 10 to 50 do

      begin

         gotoxy(a,22);

         write(chr(196));

      end;

end;

Begin

   (* Llamada al procedimiento que escribe la leyenda y la doble línea

*)

   presentación;

   (* Llamada al procedimiento que indica las categorias de la gráfica

*)

   letras;

   (* Llamada al procedimiento que dibuja la gráfica *)

   lineas;

end.


(* UNIVERSIDAD DE GUADALAJARA Coordinación de Sistemas Unidad de Cómputo Académico El siguiente programa realiza un ejemplo de la función "RECTANGLE" la cual dibuja un rectangulo o cuadrado en la pantalla, se especifican las coordenadas ( x , y ) del punto superior izquierdo del rectangulo así como el inferior derecho. El color por defecto es el color blanco, si no se especifica otro. *) Program Rectangulo; Uses CRT, GRAPH; Var Gd, Gm : Integer; begin (* Detección del modo gráfico *) Gd := Detect; (* inicialización del modo gráfico *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificación de error en el modo gráfico *) if GraphResult <> grOk then Halt(1); Rectangle(280,150,40,30); Delay (5000); CloseGraph; (* Cerrar modo gráfico *) End.


(*                          UNIVERSIDAD DE GUADALAJARA



                       Coordinación de Sistemas

                       Unidad de Cómputo Académico



   Este programa abre archivos "*.PCX", es decir, cualquier archivo

   de gráficos con esa extensión es este programa es capaz de abrirlo

   y mostrar ese gráfico.

                                                                           *)

program pcxx;

uses crt,graph,dos;

(* Procedimiento para inicializar gráficos*)

 PROCEDURE INICIAR_GRAFICOS;

    VAR MONITOR,MODO,ERROR:INTEGER;

    BEGIN

      (* Detección del tipo de adaprador gráfico de su PC *)

      MONITOR:=DETECT;

      (* Inicializando el modo gráfico *)

      INITGRAPH(MONITOR,MODO,'c:\tp\bgi ');

      (* Verificación de errores en el modo gráfico*)

      ERROR:=GRAPHRESULT;

      IF ERROR<>GROK THEN

        BEGIN

          WRITELN('ERROR EN GRAFICOS ');DELAY(3000);

          HALT;

        END;

      CLEARDEVICE;

    END;

(* Procedimiento para contener los colores en los registros de proposito

   general de su PC*)

Procedure SetRGBPalette(Col,R,G,B:byte);

Var Regs:registers;

 begin

 Fillchar(Regs,sizeof(Regs),0);

   Regs.AX:=$1010;

   Regs.BX:=col;

   Regs.Dh:=R;

   Regs.Ch:=G;

   Regs.Cl:=B;

   Intr ($10,Regs);

 end;

Procedure Graba_Pcx(xmin,ymin,xmax,ymax:integer;nombre:string);

type

    maping=arraY[0..15,1..3] of byte;

    pcxinit=record

           manufactura,version,codigofin,bitsporpixel:byte;

           xmin,ymin,xmax,ymax,hres,vres:integer;

           mapacolor:maping;

           reservado,nplanes:byte;

           bytesporlinea,typopaleta:integer;

           sheet:array[1..58] of byte;

          end;

const

    Colors:maping=

                ( (0,0,0),(0,0,2),(0,2,0),

                  (0,2,2),(2,0,0),(2,0,2),

                  (2,2,0),(2,2,2),(1,1,1),

                  (1,1,3),(1,3,1),(1,3,3),

                  (3,1,1),(3,1,3),(3,3,1),

                   (3,3,3)  );

   Var

      archi1:file of pcxinit;

      archi:file of byte;

      Hdr:pcxinit;

      punto,contador,l:byte;

      i,j,k,x,y:integer;



(* Esta función lee el color de una coordenada específica del archivo *.PCX

   y debuelve el valor del color. *)

 Function Lee_color(var x,y:integer):byte;

 var co:byte;

    begin

     if y<=ymax then co:=Getpixel(x,y);

     inc(x);

     if x>xmax then begin

            x:=xmin;

            inc(y)

          end;

    Lee_color:=co

   end;

 Function Lee_byte:byte;

 var l:byte;

   begin

    l:=Lee_color(x,y);

    l:=l mod 16;

    l:=Lee_color(x,y)+(16*l);

    Lee_byte:=l

   end;

    Begin

      Hdr.manufactura:=10;

      Hdr.version:=5;

      Hdr.codigofin:=1;

      Hdr.bitsporpixel:=4;

      Hdr.hres:=26;

      Hdr.vres:=26;

      Hdr.reservado:=0;

      Hdr.nplanes:=1;

      if odd(xmax-xmin+1) then Hdr.bytesporlinea:=(xmax-xmin+1) div 2

                          else Hdr.bytesporlinea:=((xmax-xmin+1) div 2)+1;

      Hdr.typopaleta:=0;

      for i:=0 to 15 do

       for j:=1 to 3 do

           Hdr.mapacolor[i,j]:=Colors[i,j]*85;

      Hdr.xmin:=xmin;

      Hdr.xmax:=xmax;

      Hdr.ymin:=ymin;

      Hdr.ymax:=ymax;

     {$i-}

     assign(archi1,nombre);

     rewrite(archi1);

     write(archi1,Hdr);

     close(archi1);

     {$i+}

     assign(archi,nombre);

     reset(archi);

     seek(archi,128);

     x:=xmin;

     y:=ymin;

     contador:=1;

     l:=Lee_byte;

     punto:=Lee_byte;

     repeat

     While (l=punto) and (contador<63) do

      begin

       inc(contador);

       punto:=Lee_byte

      end;

     if ((contador=1) and (l<192)) then write(archi,l)

                       else begin

                         contador:=contador+192;

                         write(archi,contador);

                         write(archi,l);

                         end;

     l:=punto;

     contador:=1;

     punto:=Lee_byte;

     Until (y>ymax);

     close(archi);

   {$i+}

  end;

Procedure Lee_Pcx_16(nombre:string);

{$r-}{$v-}

type

    plano=^tplano;

    tplano=array[0..38399] of byte;

    maping=Array[0..15,1..3] of byte;

    pcxinit=record

           manufactura,version,codigofin,bitsporpixel:byte;

           xmin,ymin,xmax,ymax,hires,vres:integer;

           mapacolor:maping;

           reservado,nplanes:byte;

           bytesporlinea,typopaleta:integer;

           sheet:array[1..58] of byte;

          end;

   Var

      p:Array[0..5] of word;

      archi1:file of pcxinit;

      archi:file of byte;

      Hdr:pcxinit;

      punto,contador,l,npl:byte;

      i,j,k,x,y:integer;

      xmax,ymax,xmin,ymin,bpl:integer;

      plane,color:word;

      count,cuantos:longint;

      plano0,plano1,plano2,plano3:plano;

Procedure Configura_Paleta(Colors:maping);

var i:byte;

Begin

 for i:=0 to 5 do

 SetRgbPalette(i,Colors[i,1] div 4,Colors[i,2] div 4,Colors[i,3] div 4);

 for i:=6 to 15 do

 begin

 SetRgbPalette(21+i,Colors[i,1] div 4,Colors[i,2] div 4,Colors[i,3] div 4);

 SetPalette(i,21+i);

 end;

end;

 Procedure Pon_Punto(var x,y:integer;co:byte);

    begin

     if y<=ymax then Putpixel(x,y,co);

     inc(x);

     if x>xmax then begin

            x:=xmin;

            inc(y)

          end;

   end;

  Begin

     {$i-}

     assign(archi1,nombre);

     reset(archi1);

     read(archi1,Hdr);

     close(archi1);

     {$i+}

     {$i-}

     xmin:=Hdr.xmin;

     ymin:=Hdr.ymin;

     xmax:=Hdr.xmax;

     ymax:=Hdr.ymax;

     assign(archi,nombre);

     reset(archi);

     seek(archi,128);

{     Configura_Paleta(Hdr.mapacolor);}

     x:=0;

     y:=0;

     case Hdr.bitsporpixel of

    4: begin

     repeat

     contador:=1;

     read(archi,l);

     if (l and $c0)=$c0 then begin

                         contador:=l and $3f;

                         read(archi,punto)

                         end

                          else punto:=l;

     for i:=1 to contador do

     begin

      pon_punto(x,y,punto div 16);

      pon_punto(x,y,punto mod 16)

     end;

    until (Eof(Archi)) or (y>=ymax);

     end;

    1:begin

     new(plano0);

     new(plano1);

     new(plano2);

     new(plano3);

     count:=0;plane:=0;

     bpl:=Hdr.bytesporlinea;

     npl:=Hdr.nplanes;

     cuantos:=bpl* npl*(1+ymax-ymin);

     for i:=0 to 3 do p[i]:=0;

     repeat

     contador:=1;

     read(archi,l);

     if (l and $c0)=$c0 then begin

                         contador:=l and $3f;

                         read(archi,punto)

                         end

                          else punto:=l;

     for i:=1 to contador do

     begin

      while (p[plane]>=38399) do inc(plane);

       case plane of

        0: plano0^[p[0]]:=punto;

        1: plano1^[p[1]]:=punto;

        2: plano2^[p[2]]:=punto;

        3: plano3^[p[3]]:=punto;

       end;

       inc(p[plane]);

       if (p[plane] mod bpl)=(bpl-1) then begin

                                             if plane=3 then inc(y);

                                             plane:=(plane+1) mod npl;

                                            end;

     end;

    count:=count+contador;

    until (Eof(Archi)) or (plane>3) or (count=cuantos);

    cleardevice;

  for y:=0 to ymax  do

   for x:=24 to xmax-20 do  begin

      color:=(plano0^[(bpl*y)+(x div 8)] shr (7-(x mod 8))) and 1 ;

      color:=color+2*((plano1^[bpl*y+(x div 8)] shr (7-(x mod 8))) and 1);

      color:=color+4*((plano2^[bpl*y+(x div 8)] shr (7-(x mod 8))) and 1);

      color:=color+8*((plano3^[bpl*y+(x div 8)] shr (7-(x mod 8))) and 1);

      putpixel(x,y,color);

    end;

  dispose(plano0);dispose(plano1);dispose(plano2);dispose(plano3);

     End;

     End;

    close(archi);

   {$i+}

 end;

Begin

iniciar_graficos;

readln;

Lee_Pcx_16('btete.pcx');{es importante que el archivo pcx este en el mismo}

SETCOLOR(0);              {directorio que el programa ejecutable}

{CIRCLE(100,100,40);

SETFILLSTYLE(1,14);

FLOODFILL(100,100,0);

SETCOLOR(0);

LINE(0,450,150,450);}

{SETFILLSTYLE(1,LIGHTCYAN);

FLOODFILL(200,100,0);}

readln;

End.


(* UNIVERSIDAD DE GUADALAJARA Coordinación de Sistemas Unidad de Cómputo Académico El siguiente ejemplo escribe en la pantalla una línea horizontal con solo proyectar pixeles mediante la función "PUTPIXEL", y sin utilizar alguna función tal como: "LINE", "LINETO", "LINEREL" etc. El color por defecto es el color blanco. si no se especifica otro. *) Program LineaHoriz; uses Crt, Graph; var xi,xf,x,y : integer; Gd, Gm : Integer; begin (* Detección del modo gráfico de su PC*) Gd := Detect; (* Inicialización del modo gráfico*) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificación de errores en el modo gráfico*) if GraphResult <> grOk then Halt(1); xi:=10; xf:=100; y:=250; For x:= xi to xf do putpixel (x,y,15); (* Aquí, se escriben los pixeles, formando una línea*) delay(5000); end.


(* UNIVERSIDAD DE GUADALAJARA Coordinación de Sistemas Unidad de Cómputo Académico El siguiente ejemplo muestra como hacer una línea solo utiliznado la función "PUTPIXEL", sin utilizar la función "LINE","LINETO","LINEREL" etc. El color por defecto es el color blanco, si no se especifica otro. *) Program LineaVer; uses Crt, Graph; var yi,yf,x,y : integer; Gd, Gm : Integer; begin (* Detección del adaptador gráfico de su PC *) Gd := Detect; (* Inicialización del modo gráfico *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificación de errores en el modo gráfico *) if GraphResult<>grOk then Halt(1); yi:=10; yf:=100; x:=250; For y:= yi to yf do putpixel (x,y,15); (* Aquí se escriben los pixeles en la pantalla *) delay(5000); end.


(* UNIVERSIDAD DE GUADALAJARA Coordinación de Sistemas Unidad de Cómputo Académico Este programa realiza una tarea simple, dibuja una línea a partir de la unidad gráfica básica, el pixel, hace una llamada a la función "PUTPIXEL" la cual coloca un pixel en la pantalla y por medio de un ciclo se colocan pixeles en la pantalla de tal forma que producen una línea. El color por defecto es el color blanco, si no se especifica otro color. *) Program Linea; Uses Graph, Crt; var x1,y1, x2,y2, i:integer; (* Función por la cual se inicializa el modo gráfico *) Procedure Iniciar; var gD : Integer; gM : Integer; ErrCode : Integer; begin gD := Detect; (* Detección del adaptador gráfico de su PC *) InitGraph(gD,gM,'c:\tp\bgi'); (* Inicialización del modo gráfico *) ErrCode := GraphResult; if ErrCode<>grOk then (* Verificación de error en el modo gráfico *) Halt(1); End; Begin Iniciar; i:=0; x1:=50; y1:=50; x2:=100; y2:= 100; PutPixel(x1,y1,15); (* Se dibujan un par de pixeles *) PutPixel(x2,y2,15); (* Que son el punto inicial y final de la línea *) while (x1+i <x2) do Begin PutPixel(x1+i,y1+i,15); (* Aquí se dibujan los pixeles *) i:=i+1; (* siguientes para completar una línea *) End; readln; CloseGraph; End.


(*                          UNIVERSIDAD DE GUADALAJARA



                        Coordinación de Sistemas

                        Unidad de Cómputo Académico



        El siguiente programa realiza un ejemplo de como dibujar líneas

     aleatorias en una cierta zona de la pantalla, utilizando al función

     "RANDOMIZE".

        El color por defecto es el color blanco, si no se dice lo contrario

                                                                           *)

Program Linea;

uses

  Crt, Graph;

var

  Gd, Gm : Integer;

begin

  (* Detección del modo gráfico de su PC*)

  Gd := Detect;

  (* Inicialización del modo gráfico *)

  InitGraph(Gd, Gm, 'c:\tp\bgi');

  (* Verificación de errores en el modo gráfico*)

  if GraphResult<>grOk then

     Halt(1);



  Randomize;  (* Inicialización de números aleatorios *)

  repeat

    Line (Random(200), Random(200), (* Dibuja aleatoriamente una línea en *)

         Random(200), Random(200)); (* en espacio 0-200. tanto para x como*)

  until KeyPressed;                 (* para y. *)

  ReadLn;

  CloseGraph;

end.


(* UNIVERSIDAD DE GUADALAJARA Coordinación de Sistemas Unidad de Cómputo Académico Este programa dibuja una línea con la función "LINEREL", la cual pone la figura a partir de las coordenadas anteriores, es decir las coordenadas que se utilizaron en el último proceso antes de llamar a esta función, hasta las coordenadas relativas (dx , dy) que son pasadas como par metro de la función. El color por defecto es el color blanco, si no se dice lo contrario. *) Program Linea; uses Graph; var Gd, Gm : Integer; begin Gd := Detect; (* Detección del modo gráfico de su PC *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Inicialización del modo gráfico *) if GraphResult<>grOk then (* Verificación de error en el modo *) Halt(1); MoveTo(1,2); (* "Nos movemos" hacia la posición (1,2) *) LineRel(100, 100); (* Se dibuja la línea a partir de la posición (1,2) *) ReadLn; (* hasta la posición (101,102) *) CloseGraph; end.


(*                         UNIVERSIDAD DE GUADALAJARA



                     Coordinación de Sistemas

                     Unidad de Cómputo Académico



        El siguiente programa realiza un ejemplo de la función "RECTANGLE"

     la cual dibuja un rectangulo o cuadrado en la pantalla, se

     especifican las coordenadas ( x , y ) del punto superior izquierdo

     del rectangulo así como el inferior derecho.



        El color por defecto es el color blanco, si no se especifica otro.



                                                                         *)

Program Rectangulo;



Uses CRT, GRAPH;



Var

  Gd, Gm : Integer;



begin

  (* Detección del modo gráfico *)

  Gd := Detect;

  (* inicializaión del modo gráfico *)

  InitGraph(Gd, Gm, 'c:\tp\bgi');

  (* Verificación de error en el modo gráfico *)

  if GraphResult<>grOk then

       Halt(1);



   Rectangle(280,150,40,30);

   Delay (5000);

   CloseGraph; (* Cerrar modo gráfico *)

End.


(*                       UNIVERSIDAD DE GUADALAJARA



                      Coordinación de Sistemas

                      Unidad de Computo Académico



      El siguiente programa realiza un ejemplo de la función "CIRCLE"

   la cual dibuja un círculo con coordenadas especificadas en los

   par metros de la función, así también el radio.

      El color por defecto es el color blanco, si no se especifica otro.

                                                                         *)

Program circulo;

uses

  Graph;

var

  Gd, Gm: Integer;

  Radius: Integer;

begin

  (* Detección del modo gráfico de su PC *)

  Gd := Detect;

  (* Inicialización del modo gráfico *)

  InitGraph(Gd, Gm, 'c:\tp\bgi');

  (* Verificación de error en el modo gráfico *)

  if GraphResult<>grOk then

        Halt(1);

  for Radius := 1 to 5 do

    Circle(100, 100, Radius*10);

  ReadLn;

  CloseGraph;

end.


(*                        UNIVERSIDAD DE GUADALAJARA



                        Coordinación de Sistemas

                        Unidad de Cómputo Académico



   El siguiente programa dibuja un circulo en la pantalla y dos líneas

 que atraviezan el circulo por el centro, llama primeramente al

 procedimiento "Circulo".  El procedimiento dibuja un circulo, realizando

 los calculos  necesarios para poder dibujar tal figura.

   El color por defecto es el color blanco, si no se especifica otro.



                                                                           *)



Program circulo_ecuacion;



Uses Graph, crt;



Var



xc, yc, radio : integer;





Procedure iniciar;



Var

   Gd, Gm : Integer;



begin

  (* Detección del adatpador gráfico de su PC *)

  Gd := Detect;

  (* Inicialización del modo gráfico *)

  InitGraph(Gd, Gm, 'c:\tp\bgi');

  (* Verificación de error en el modo gráfico *)

  if GraphResult<>grOk then

       Halt(1);

end;



(* Este procedimiento inicializa primeramente el modo gráfico, llamado

al procedimiento " iniciar ", posteriormente, realiza los calculos

necesarios para dibujar una circunferencia en la pantalla, con dos

líneas que pasan por el centro de ella.



*)

Procedure circulo (xc, yc, radio : integer);



Const

   fi = 1.33;



Var

   dtheta, ct,st,x,y,xtemp : real;



Begin

   iniciar;

   radio:=20;

   dtheta := 1/radio;

   ct:=cos(dtheta);

   st:=sin(dtheta);

   x:=0; xc:=150; yc:=150;

   y:=radio;

   while y >= x do

      begin

         (* Las líneas siguientes dibujan el circulo *)

         putpixel(round(xc+x),round(yc+y*fi),15);

         putpixel(round(xc-x),round(yc+y*fi),15);

         putpixel(round(xc+x),round(yc-y*fi),15);

         putpixel(round(xc-x),round(yc-y*fi),15);

         (* Estos cuatro renglones siguientes dibujan las líneas*)

         putpixel(round(xc+y),round(yc+y*fi),15);

         putpixel(round(xc-y),round(yc+y*fi),15);

         putpixel(round(xc+y),round(yc-y*fi),15);

         putpixel(round(xc-y),round(yc-y*fi),15);



         xtemp:=x;

         x:=(x*ct-y*st);

         y:=(y*ct+xtemp*st)

    end;

   end;



Begin



   Circulo(xc,yc,radio); (* Llamada al procedimiento *)

   readln;

   closegraph;

end.


(*                         UNIVERSIDAD DE GUADALAJARA



                       Coordinación de Sistemas

                       Unidad de Cómputo Académico

       Este programa dibuja en la pantalla un círculo, a partir de pixeles

    que se desplazan por el perímetro del círculo hasta llegar a completar

    la figura.

      El color por defecto es el blanco, si no se especifica otro.

                                                                           *)

Program Rect_Circulo;

Uses Graph,Crt;

Var

   xc,yc,radio : real;



Procedure Iniciar;

 var

  Gd,Gm:Integer;

begin

  (* Detección del adaptador gráfico de su PC *)

  Gd := Detect;

  (* Inicialización del modo gráfico *)

  InitGraph(Gd, Gm, 'c:\tp\bgi');

  (* Verificación de error en el modo gráfico *)

  if GraphResult<>grOk then

     Halt(1);

end;



Procedure Trazar_Circ(xc,yc,radio:real);

Const

   dos_Pi = 6.28318;

   fi = 1.33;

Var

   dtheta,ct,st,x:real;

   y,xtemp:real;

   cont:integer;

Begin

   (* Se realizan los calculos suficientes para definir la figura*)

   radio:=50;

   xc:=300; yc:=250;

   dtheta:=dos_Pi/21*radio;

   ct:=cos(dtheta);

   st:=sin(dtheta);

   x:=0;

   y:=radio;

   moveto(round(xc+x),round(yc+y*fi));

     for cont:= 1 to round(591*radio) do

       begin

          xtemp:=x;

          x:=(x*ct-y*st);

          y:=(y*ct+xtemp*st);

          (* Dibujar los pixeles en el perímetro del círculo *)

          putpixel(round(xc+x),round(yc+y*fi),15)

       end;

     end;

 begin

  iniciar;       (* Inicializar gráficos *)

  Trazar_circ(xc,yc,radio);   (* dibujar el círculo*)

  readln;

end.


(*                         UNIVERSIDAD DE GUADALAJARA



                  Coordinación de Sistemas

                  Unidad de Cómputo Académico

       Este programa da un ejemplo de la función gráfica "ELLIPSE", la

    cual dibuja una elipse los par metros de esta función son:

    coordenadas ( x , y ),  ngulo inicial y final, foco1 y foco2.

       El color por defecto el el color blanco, si no se especifica otro.

                                                                         *)

Program Elipse;

uses

  Graph;

var

  Gd, Gm: Integer;

begin

  (* Detección del modo gráfico de su PC *)

  Gd := Detect;

  (* Inicialización del modo gráfico *)

  InitGraph(Gd, Gm, 'c:\tp\bgi');

  (* Verificación de error en el modo gráfico *)

  if GraphResult<>grOk then

        Halt(1);

  Ellipse(100,100,0,360,30,50);

  Ellipse(100,100,0,180,50,30);

  ReadLn;

  CloseGraph; (* Cierre de modo Gráfico *)

end.


(*                        UNIVERSIDAD DE GUADALAJARA



        Coordinación de Sistemas,

        Unidad de Cómputo Académico                                       *)

(*    El siguiente programa es un ejemplo del funcionamiento la función

    gráfica "BAR",la cual dibuja una barra de Histograma en las coordenadas

    indicadas a la función.

      El color por defecto si no se indica es el color blanco.            *)



Program Barras;

(* Ejemplo de Bar *)

uses

  Graph;

var

  Gd, Gm, I, Width: Integer;

begin

  (* Se detecta el típo de adaptador gráfico de su PC *)

  Gd := Detect;

  (* Se inicializa el modo gráfico *)

  InitGraph(Gd, Gm, 'C:\TP\BGI');

  (* Verificación de error al inicializar el modo gráfico *)

  if GraphResult<>grOk then

        Halt(1);

  Width := 10;

  (* Dibujo del Histograma *)

  for I := 1 to 5 do

    Bar(I*Width, I*10, Succ(I)*Width, 200);

  ReadLn;

  CloseGraph;

end.


(*                        UNIVERSIDAD DE GUADALAJARA

                Coordinación de Sistemas

                Unidad de Computo Académico



     El siguiente programa es un ejemplo de la función "BAR3D" la cual

   dibuja una barra de Histograma en 3 dimensiones, las coordenadas

   son especificadas en los par metros de la función, así como la

   profundidad de la barra y si deve estar abierta o cerrada en la

   parte superior de la barra. Este último par metro es booleano,

   puede expresarse con las constantes TopOn y TopOff, que indican

   uno y cero respectivamente.

     El color por defecto es el color blanco, si no se especifica lo

     contrario.

                                                                         *)

Program Barras3;

uses

  Graph;

var

  Gd, Gm: Integer;

  y0, y1, y2, x1, x2: Integer;

begin

  (* Detección del modo gráfico *)

  Gd := Detect;

  (* Inicialización del modo gráfico *)

  InitGraph(Gd, Gm, 'c:\tp\bgi');

  (* Verificación de error al inicializar el modo gráfico *)

  if GraphResult<>grOk then

         Halt(1);

  y0 := 10;

  y1 := 60;

  y2 := 110;

  x1 := 10;

  x2 := 50;

  Bar3D(x1, y0, x2, y1, 10, TopOn); (* Este Histograma es cerrado *)

  Bar3D(x1, y1, x2, y2, 10, TopOff);(* Este Histograma es abierto *)

  ReadLn;

  CloseGraph;

end.


(*                        UNIVERSIDAD DE GUADALAJARA



                   Coordinación de Sistemas

                   Unidad de Cómputo Académico



     El siguiente programa realiza un ejemplo de la fución "PIESLICE"

   la cual dibuja un sector, los par metros de esta función son:

   las coordenadas del centro del sector, el  ngulo inicial y el

    ngulo final del sector, y finalmente el radio del sector.

     El color por defecto es el color blanco, si no se especifica otro.



                                                                         *)

Program Sectores;

uses

  Graph;

const

  Radius = 30;

var

  Gd, Gm : Integer;

begin

  (* Detección del modo gráfico de su PC *)

  Gd := Detect;

  (* Inicialización del modo gráfico *)

  InitGraph(Gd, Gm, 'c:\tp\bgi');

  (* Verificación de error en la inicialización de los gráficos *)

  if GraphResult<>grOk then

        Halt(1);

  (* Dibuja un sector con centro en 100, 100 con un  ngulo inicial de 0

     grados hasta 270 grados, y el radio de 30 pixeles de ancho. *)

  PieSlice(100, 100, 0, 270, Radius);

  ReadLn;

  CloseGraph;

end.


(*                        UNIVERSIDAD DE GUADALAJARA



                     Coordinación de Sistemas

                     Unidad de Cómputo Académico



    El siguiente programa realiza un ejemplo de la utilización de la

 función "PIESLICE", para ver como se realiza una gráfica Estadistica

 de Pastel, cada sector ( PIESLICE ),es representado con un relleno

 distinto para poder distinguir cada uno de los sectores.

                                                                           *)

Program pastel_Graph;

Uses

     Graph, Crt;

type

    STR5 = string[5];

const

     { En este arreglo estan contenidas todas las 8 categorias de la

       gráfica de pastel, ademas de que cada gráfica representa un año

       desde 1986 hasta 1989 }

     Accounts : array[1..4,1..9] of integer =

             (( 1986, 133, 35, 33, 17, 29, 15, 17, 32 ),

              ( 1987, 122, 41, 30, 25, 18, 24, 43, 21 ),

              ( 1988, 111, 65, 57, 14, 17, 39, 32, 17 ),

              ( 1989, 100, 60, 70, 12, 16, 13, 17, 12 ) );

     { Este arreglo contiene el nombre de las 8 categorias de la gráfica }

     AccTypes : array[1..9] of STR5 =

             ( '     ', 'Motor', 'Acsry', 'Reprs', 'Govmt',

               'Lease', 'Tires', 'Paint', 'Misc');

Var

   GraphDriver, GraphMode, MaxColors, ErrorCode,

   XWidth, YHeight, ZDepth,

   XAxis, YAxis, ZAxis,

   XOrg, YOrg,

   MaxX, MaxY : integer;

   Scale, AspR : Real;

(* Procedimiento de inicialización de gráficos *)

Procedure initialize;

   Var

      Xasp, yasp : Word;

   Begin

      (* Detección del adaptador gráfico de su PC *)

      GraphDriver := DETECT;

      (* Inicialización del modo gráfico *)

      InitGraph (GraphDriver, GraphMode, 'c:\tp\bgi' );

      ErrorCode:=GraphResult;

      (* Verificación de algún error en el modo gráfico *)

      If ErrorCode<>grOK then

      begin

         writeln('Error de graficos:   ',

                  GraphErrorMsg(errorCode) );

         halt(1);

      end;

      MaxColors := GetMaxColor + 1;

      GetAspectRatio(xasp, yasp);

      AspR:=xasp / yasp;

      MaxX := GetMaxX;

      MaxY := GetMaxY;

   end;



(* Procedimiento por el cual se espera hasta que el usuario teclee algo*)

procedure pause;

   Var

     Ch : Char;

   Begin

      While keypressed do ch:= ReadKey;

      Ch := readKey;

   end;



(* Función que convierte cualquier entero en una cadena, y esta es retornada*)

function I2S (Value : integer) :string;

   var

      buffer : string[10];

   begin

      str(value, Buffer);

      I2S := Buffer;

   end;



{ El siguiente procedimiento dibuja toda una gráfica de pastel, con sus

  8 categorías, y la divisón de cada una de ellas }

procedure PieGraph( DataSet, x, y : integer);

Const

     BlankLine = $0000;

Var

   i, m, r, s, t, HJust, VJust, Total, CapColor : integer;

   ArcRec : ArcCoordsType;

Begin

     m := 135;

     Total := 0;

     for i := 2 to 9 do

        inc( Total, Accounts[ DataSet, i ] );

     r:=Total div 4;

     { Se define el tipo de línea para dibujar los sectores }

     SetLineStyle ( UserBitLn, BlankLine, NormWidth);

     { Se define el tipo de relleno para el sector }

     SetFillStyle ( 0, 0 );

     { Se dibuja el sector }

     PieSlice ( x, y, m, m+1, r+10 );

     { Se capturan la coordenadas del sector }

     GetArcCoords ( ArcRec );

     if MaxColors > 4 then

          SetColor (White);

     { Se especifica el tipo de texto para escribir el año }

     SetTextStyle (SansSerifFont, HorizDir, 2 );

     { Si indica la justificación del texto }

     SetTextJustify (RightText, BottomText );

     { Y por ultimo se escribe el texto deceado, en este caso el año }

     OutTextXY (ArcRec.xEnd, ArcRec.yEnd,

                I2S (Accounts[ DataSet, 1 ] ) );

     { Nuevamente se cambia de tipo de letra por el tipo "DefaultFont" }

     SetTextStyle( DefaultFont, HorizDir, 1 );

     if maxColors > 4 then

            SetColor (EGAYellow);

     s := 0;

     t := 0;

     { En este ciclo se dibujan sector por sector de la gráfica de pastel }

     for i := 2 to 9 do

     begin

        { Se obtine cada vez un tipo distinto de rellenado para diferenciar

          un sector de otro }

        SetFillStyle( i-1, i-1 );

        if MaxColors > 4 then

              SetColor( white );

        { Se especifica un tipo de línea solida para dibujar los sectores }

        SetLineStyle ( SolidLn, 0, NormWidth );

        { Se realizan los calculos necesarios para completar el circulo }

        inc( t, round( 360 * ( Accounts[ DataSet, i ]

                       / Total ) + 0.5 ) );

        if t > 360 then t := 360;

        if ( i = 9 ) AND ( t<360 ) then t := 360;

        { Y finalmente se dibuja la gráfica }

        PieSlice ( x, y, s, t, r );

        { Nuevamente se define el tipo de línea para dibujar }

        SetLineStyle ( UserBitLn, BlankLine, NormWidth );

        { Y también se define el tipo de relleno }

        SetFillstyle( 0, 0 );

        CapColor := i+8;

        { Si el valor de colores es m s de 15, es decir el m ximo de colores

          se inicializa nuevamente en 7 }

        if CapColor > 15 then capcolor := 7;

        if MaxColors > 4 Then SetColor ( CapColor );

        m := round ( ( t-s ) / 2 + s );

        { Se dibuja el sector }

        PieSlice( x, y, m, m+1, r+5 );

        GetArcCoords( ArcRec );

           if ArcRec.xEnd > x then HJust := LeftText

                              else HJust := RightText;

           if ArcRec.yEnd > y then VJust := TopText

                              else VJust := BottomText;

           { Finalmente se define la justificación del texto y el texto

             que corresponde a cada sector de la gráfica }

           SetTextJustify( HJust, VJust );

           OutTextXY( ArcRec.xEnd, ArcRec.yEnd,

                      AccTypes[i] );

           s := t;

        end;

     end;

{ Este procedimeinto es el encargado de presentar las gráficas con todos

  los datos necesarios }

procedure DrawGraphs;

     Var

        i : integer;

     begin

        ClearDevice;   { Se limpia la pantalla }

        GraphDefaults;

        { Se dibuja el marco la gráfica }

        Rectangle( 0, 0, MaxX, MaxY);

        { Se dibuja la primera gráfica }

        PieGraph( 1,   GetMaxX div 4,   GetMaxY div 4 );

        { Se dibuja la segunda gráfica }

        PieGraph( 2,   GetMaxX div 4, 3*GetMaxY div 4 );

        { Se dibuja la tercera gráfica }

        PieGraph( 3, 3*GetMaxX div 4,   GetMaxY div 4 );

        { Se dibuja la cuarta gráfica }

        PieGraph( 4, 3*GetMaxX div 4, 3*GetMaxY div 4 );

     end;

begin

   Initialize; { Inicialización de gráficos }

   DrawGraphs; { Se manda llamar el procedimiento para dibujar las gráficas }

   Pause;      { Espera una pausa antes de terminar el programa }

   CloseGraph;

end.


{                         UNIVERSIDAD DE GUADALAJARA



                           Coordinación de Sistemas

                         Unidad de Cómputo Académico



       El siguiente programa muestra como se pueden realizar programas

  para dibujos de tercera dimensión, este programa muestra un modelo

  de automovil, el cual puede ser rotado para ser visto en varias

  perspectivas, para poder ver estas perspectivas se utilza el teclado

  numerico, la tecla 8 mueve hacia arriba el modelo, la tecla 2 mueve

  el modelo hacia abajo, la tecla 4 mueve el modelo a la izquierda y

  la tecla 6 mueve el modelo a la derecha.

       Para salir del programa presione la tecla " Q ".

                                                                         }



PROGRAM PRESENT;

uses Crt, Graph;

var

   BE,ba,bi, GD,t, GM: Integer;

   C: CHAR;

   Xasp, Yasp: word;

   rxasp, ryasp, p: real;

   x,y,z: real;

   ratio, Angular,prof: real;

   switch: integer;

   xa,ya,za: real;

   R1,R2,R3:    REAL;

   CR1,CR2,CR3: REAL;

   SR1,SR2,SR3: REAL;

   s : string;



{ Este procedimiento es el que realiza el movimiento en 3D, utiliza las

  variables en donde se guardan los datos de los c lculos de Cosenos y

  Senos y obtiene la coordenada cartesiana en "X", "Y" y "Z" }

procedure move3d(x,y,z: real);

begin

  xa:=cr1* x-sr1* z;

  za:=sr1* x+cr1* z;

   x:=cr2*xa+sr2* y;

  ya:=cr2* y-sr2*xa;

   z:=cr3*za-sr3*ya;

   y:=sr3*za+cr3*ya;

  moveto(round(angular* x/(prof-z))+320 ,175-round(Ratio*angular* y/(prof-z)) );

end;



{ Este procedimeinto junto con "MOVE3D" realizan el c lculo de la coordenada

  y dibujo de la línea en esa posición }

procedure join3d(x,y,z: real);

var x1,y1,x2,y2:integer;

begin

  x1:=getx;

  y1:=gety;

  move3d(x,y,z);

  x2:=getx;

  y2:=gety;

  line(x1,y1,x2,y2); { Se dibuja la línea ya en 3D }

end;



{ Este procedimeinto utiliza los las propiedades de los otros

  procedimeintos para calcular la posición en 3D y dibujar una línea

  en tal posición }

procedure lini(x1,y1,z1,x2,y2,z2:real);

begin

move3d(x1,y1,z1);

join3d(x2,y2,z2);

end;



{ El siguinete procedimiento obtiene el c lculo con las funciones

  trigonometricas "Seno" y "Coseno", y de los números enviados como

  par metros, y este c lculo se deposita en las variables globales

  "SR1","SR2","SR3","CR1","CR2" y "CR3" }

procedure setupang(a1,a2,a3: real);

begin

  SR1:=sin(a1); CR1:=cos(a1);

  SR2:=sin(a2); CR2:=cos(a2);

  SR3:=sin(a3); CR3:=cos(a3);

end;



{ Esta función obtiene el angulo dado en radianes }

function radian( th: integer ): real;

begin

    radian:=(pi/180.0*th);

end;



{ Este procedimiento obtiene las coordenadas cartesianas en 3D para el

  eje Z en el dibujo de un circulo, y dibuja la línea corespondiente

  a este punto para el circulo }

procedure circuloz(x1,y1,z1,r :real  );

var

  ang,inc : real;

begin

    move3d(x1+r,y1,z1);

    ang:=0.0;

    inc:=pi/18;

    while ang<= 2*pi+0.1 do

    begin

      join3d(x1+r*cos(ang),y1+r*sin(ang),z1);

      ang:=ang+inc;

    end;

end;



{ Este procedimiento obtiene las coordenadas cartesianas en 3D para el

  eje Y en el dibujo de un circulo, y dibuja la línea corespondiente

  a este punto para el circulo }

procedure circuloy(x1,y1,z1,r :real  );

var

  ang,inc : real;

begin

    move3d(x1,y1,z1+r);

    ang:=0.0;   inc:=pi/18;

    while ang<= 2*pi+0.1 do

    begin

      join3d(x1+r*sin(ang),y1,z1+r*cos(ang));

      ang:=ang+inc;

    end;

end;



{ Este procedimiento obtiene las coordenadas cartesianas en 3D para el

  eje X en el dibujo de un circulo, y dibuja la línea corespondiente

  a este punto para el circulo }

procedure circulox(x1,y1,z1,r :real  );

var

  ang,inc : real;

begin

    move3d(x1,y1+r,z1);

    ang:=0.0;   inc:=pi/18;

    while ang<= 2*pi+0.1 do

    begin

      join3d(x1,y1+r*cos(ang),z1+r*sin(ang));

      ang:=ang+inc;

    end;

end;



{ Este procedimiento obtiene las coordenadas cartesianas en 3D para el

  eje Z en el dibujo de una elipse, y dibuja la línea corespondiente

  a este punto para la elipse }

procedure ellipsez(x1,y1,z1,r,ex,ey,ani,anf :real  );

var

  ang,inc,r1,r2 : real;

begin

    r1:=r*ex;

    r2:=r*ey;

    move3d(x1+r1*cos(ani),y1+r2*sin(ani),z1);

    ang:=ani;   inc:=pi/18;

    while ang<= anf+0.1 do

    begin

      join3d(x1+r1*cos(ang),y1+r2*sin(ang),z1);

      ang:=ang+inc;

    end;

end;



{ Este procedimiento obtiene las coordenadas cartesianas en 3D para el

  eje Y en el dibujo de una elipse, y dibuja la línea corespondiente

  a este punto para la elipse }

procedure ellipsey(x1,y1,z1,r,ex,ez,ani,anf :real  );

var

  ang,inc,r1,r2 : real;

begin

    r1:=r*ex;

    r2:=r*ez;

    move3d(x1+r1*sin(ani),y1,z1+r2*cos(ani));

    ang:=ani;   inc:=pi/18;

    while ang<= anf+0.1 do

    begin

      join3d(r1*sin(ang),y1,r2*cos(ang));

      ang:=ang+inc;

    end;

end;



{ Este procedimiento obtiene las coordenadas cartesianas en 3D para el

  eje X en el dibujo de una elipse, y dibuja la línea corespondiente

  a este punto para la elipse }

procedure ellipsex(x1,y1,z1,r,ey,ez,ani,anf :real  );

var

  ang,inc,r1,r2 : real;

begin

    r1:=r*ey;

    r2:=r*ez;

    move3d(x1,y1+r1*cos(ani),z1+r2*sin(ani));

    ang:=ani;   inc:=pi/18;

    while ang<= anf+0.1 do

    begin

      join3d(x1,y1+r1*cos(ang),z1+r2*sin(ang));

      ang:=ang+inc;

    end;

end;

{---------------------------- Programa principal--------------------------- }

begin

   GD := 9;

   GM := 1;

   { Inicialización de gráficos }

   InitGraph(GD, GM, 'c:\tp\bgi');

   { }

   if GraphResult<>grOk then

          Halt(1);

   Angular:=600.0;

   Prof:=1000;      { Se tiene una profundidad de 1000 para ser visto mejor }

   p:=-1;

   switch := -1;



   r1:=radian(0);   { Se obtienen los grados radianes de cierto número }

   r2:=radian(0);

   r3:=radian(0);



   setupang(r1,r2,r3);   { Se obtienen los angulos en radianes de dichos números}

   GetAspectRatio(Xasp, Yasp);

   RXasp:=xasp;

   RYasp:=yasp;

   Ratio:=rXasp/rYasp;

   c:='m';

   prof:=prof+3;

   x:=0.0;

   y:=100.0;

   setcolor(15);  { Se toma el color Blanco para dibujar el modelo }

   s:='-+64.028';

  while c<>'Q' do begin

     case c of

          { Si se presiona la tecla "-" el modelo es reducido }

          '-' : prof:=prof+50;

          { Si se presiona la tecla "+" el modelo si amplia }

          '+' : prof:=prof-50;

          { Si se presiona "0, 6, 4, 2, 8, ." el model solo rotar }

          '0' : r1:=r1+radian(10);

          '.' : r1:=r1-radian(10);

          '6' : r2:=r2+radian(10);

          '4' : r2:=r2-radian(10);

          '2' : r3:=r3+radian(10);

          '8' : r3:=r3-radian(10);

       end;

     setupang(r1,r2,r3); { Nuevamente se obtienen los angulos de los números }

    setcolor(15);

           { Enseguida se dibuja cada línea que conforma el modelo, así

             como los circulos y elipses del mismo en 3D }

           lini(-200,100,400,200,100,400);

           lini(200,100,400,200,100,-400);

           lini(-200,100,-400,200,100,-400 );

           lini(-200,100,400,-200,100,-400);

           lini(200,100,100,-200,100,100);

           lini(-200,100,100,-200,180,100);

           lini(-200,180,100,200,180,100);

           lini(200,180,100,200,100,100);



           circuloz(-100,50,400,30);

           circuloz(100,50,400,30);



           lini(-200,100,400,-200,0,400);

           lini(-200,0,400,200,0,400);

           lini(200,0,400,200,100,400);



           lini(200,0,400,200,0,300);



           ellipsex(200,0,250,50,1,1,-pi/2,pi/2);



           { En seguida se muestra una pagina de memoria en la que se

             guarda el dibujo del modelo  para posteriormente modificarlo

             y crear así un efecto de animación sobre dicho modelo }

           if switch<0 then  SetVisualPage(0)

                   else  SetVisualPage(1);

     switch:=switch*-1;



     C:=upcase(READKEY);

     if  Pos(C,s)>0

     then begin



          { En este caso se selecciona la p gina en la que se dibujara

            el modelo, en esta pagina se redibuja con unas nuevas

            coordenadas y despues sera mostrado y se apreciar  el

            efecto de animación }

        if switch > 0 then  SetActivePage(1)    { Va a pagina oculta }

                      else  SetActivePage(0);



     cleardevice; { Se limpia la pantalla }

     end;

    end;

  CLOSEGRAPH;  { Se cierra el modo gráfico }

  CLRSCR;      { Y se vuelve al modo ASCII, entonces se limpia la pantalla }

END.


(*                       UNIVERSIDAD DE GUADALAJARA



                   Coordinación de Sistemas

                   Unidad de Cómputo Académico



   El siguiente programa es un ejemplo de una animación simple,

abre un archivo, y comienza a hacer un desplazamiento de este junto

con una barra.

                                                                           *)

Program avionazo;

uses crt{,dos,},graph;

type

    dibujillo=array[0..51,0..87] of byte;

var

    Dibujo:Dibujillo;     (* Buffer para el archivo, aquí se guardar n *)

    Fd:file of dibujillo; (* los bits del archivo leido.*)

    k,m,i,j:integer;

    G:Pointer;

    modo,a,b:word;

    gm,gd:integer;

begin

 {detectgraph(monitor,modo);}

 Gd := Detect;

  (* Se inicializa el modo gráfico *)

  InitGraph(Gd, Gm, 'C:\TP\BGI');

 (* Verificación de error en el modo gráfico*)

 if graphresult<>grOK then

         halt;

 {$i-}    (* Directiva de Compilación de desctiva la verificación de erroes*)

 Assign(Fd,'c:\windows\arbol.pcx');  (* Se asigna el archivo *)

 Reset(Fd);

 if ioresult<>0 then       (* Si hubo un error al abrir el archivo el *)

    halt                   (* programa termina*)

 else

    Read(Fd,Dibujo);       (* Se lee el archivo y se cierra*)

    Close(Fd);

 {$i+}

 randomize;

 setfillstyle(1,lightcyan);

 Bar(0,0,639,479);          (* Se dibuja una barra de toda la pantalla*)

for m:=1 to 20 do

 for i:=0 to 51 do

       for j:=0 to 87 do

         (* Segun el bit correspondiente *)

         (* se comienza a dibujar el color*)

         (* de ese bit.*)

         putpixel(j,100+i,dibujo[i,j]);

  (* Aquí, comienza el primer paso para la animación, se reserva memoria*)

  Getmem(G,Imagesize(0,0,87,51));

  (* Una vez reservada la memoria de graba o se trae la imagen*)

  Getimage(0,100,87,151,G^);

  (* Y ya la imagen en la memoria se imprime en pantlla*)

  Putimage(0,100,G^,NormalPut);

 modo:=Normalput;



 setfillstyle(1,15);

 (* En este ciclo se comienza el corrimiento *)

 for i:=0 to 270 do

 begin

  bar(i*2,90,i,140); (* Se dibuja una barra variable *)

  setcolor(0);

 line(i*2,90,i,90);   (* Unas líneasa que son el contorno de la barra*)

 line(i*2,140,i,140);

  setcolor(15);

 line(i*2,115,i,115);

  bar(i*2,90,i*2,140);

  Putimage(i*2,100,G^,modo); (* Y finalmente se proyecta la imagen de

                                memoria, logrando así el corrimiento de

                                la imagen. *)

 end;

readln;

end.


(*                      UNIVERSIDAD DE GUADALAJARA



                      Coordinación de Sistemas

                      Unidad de Cómputo Académico



     El siguiente programa es un editor simple de Iconos en modo gráfico

su funcionamiento es simple, se tiene un enrejado que es la zona en donde

Ud. editar  su ícono, a la derecha de la pantalla aparece una leyenda

"COLOR", y debajo de ella un color específico, esto indica el color que

se tiene actualmente para dibujar el ícono, se puede cabiar de color solo

con presionar la tecla "F2" si aparece una leyenda "ACTIVO" justo debajo

del color seleccionado indica que ese color est  activo en este momento

para poder dibujar, para activar y desactivar colores se presiona "F1",

debajo aparecen las coordenadas en que se encuentra el cursor del editor

en ese momento, así como el color del pixel o del recuadro en esas

coordenadas.



   Si presiona "F4", el editor mostrar  su diseño de ícono reducido, presione

la tecla "Esc" para regresar al editor. Si oprime la tecla "F5" el editor

terminar  su seción (exit), si presiona la tecla "F6" aparecera una ventana

que le pide el nombre de un archivo creado previamente con este editor,

si presiona la tecla "F7" también aparecer  una ventana que indica con

que nombre se debe grabar el archivo actual. Si presiona la tecla "F8"

aparecer  nuevamente su diseño de ícono solo que de una escala mayor que

la vista con "F4", oprima "Esc" para regresar al editor, si oprime la tecla

"F9" el diseño actual es borrado por completo, la forma de desplazar el

cursor atravez del enrejado es por medio de las teclas de flechas,

la tecla "INSERT" al ser presionada el cursor cambia de posición a la

posición rumbo nor-este de la ubicación actual, la tecla "HOME" mueve el

cursor hacia la posición nor-oeste de la posición actual, la tecla

"DELETE" mueve el cursor a la posición sur-este del punto actual del cursor,

la tecla "END" mueve el cursor a la posición sur-oeste, las teclas

"PageUp" sirve para subir la posición del número de color en la que estamos,

la tecla "PageDown" es la contraria a "PageUp", nos " mueve " posiciones

abajo del número de color en el que estamos. El número de colores va desde

0-255.

                                                                        *)



program importa_del_PM;

 USES

 CRT,GRAPH,DOS;

 CONST  { Constantes para detectar las teclas oprimidas }

      B_ESPACE=#8; ENTER=#13; ESCAPE=#27;

      F1=';'; F2='<'; F3='='; F4='>'; F5='?';

      F6='@'; F7='A'; F8='B'; F9='C'; F10='D';

      F_ARR='H'; F_I='K'; F_D='M'; F_AB='P'; DEL='S'; INS='R';

      HOME='G';FIN='O';F11='T';F12='U';PU='I';PD='Q';

 TYPE ARCH=RECORD

           INICIO:ARRAY[1..4] OF CHAR;

           MATRIZ:ARRAY[1..52,1..11] OF BYTE;

           TERMINO:CHAR;END;

      CONV=ARRAY[0..51,0..87] OF BYTE;

      PERMITIDOS=SET OF CHAR;

   VAR MAT:ARCH;             { Buffer del archivo }

       ARCHIVO:FILE OF ARCH; { Declaración del archivo }

       ARCHVGA:FILE OF CONV;

       DIBUJO:CONV;CAD:STRING;

       I,J,K,L:INTEGER;ALGO:CHAR;

       MANO,MANO2:ARRAY[1..9] OF FILLPATTERNTYPE;



(* Este procedimiento como su nombre lo dice cambia el color con el que

   se va a colorear. Cambiando los colores en los registros de proposito

   general de su PC *)

 PROCEDURE CAMBIA_COLOR(COLOR,ROJO,VERDE,AZUL:BYTE);

 VAR

  RES:REGISTERS;

  BEGIN

   FILLCHAR(RES,SIZEOF(RES),0);

   WITH RES DO

    BEGIN

     AH:=$10;

     AL:=$10;

     BX:=COLOR;

     DH:=ROJO;

     CH:=VERDE;

     CL:=AZUL;

     INTR($10,RES);

    END;

  END;

{ Este precedimiento cambia el color y la trama en una cierta

  zona del enrrejado del dibujo }

  PROCEDURE BOX(X1,Y1,X2,Y2,TRAMA,COLOR:INTEGER);

   VAR

     TRAM:FILLPATTERNTYPE;

     I:INTEGER;

    BEGIN

     FILLCHAR(TRAM,SIZEOF(TRAM),0);

      CASE TRAMA OF

            { Se selecciona el modo de relleno para una zona del dibujo }

       1..9:SETFILLSTYLE(TRAMA,COLOR);

         10:BEGIN

             FOR I:=1 TO 8 DO

              BEGIN

               TRAM[I]:=$AA;

               { Se selecciona un típo de paleta definida por el usuario }

               SETFILLPATTERN(TRAM,COLOR);

              END;

            END;

         11:BEGIN

             FOR I:=1 TO 8 DO

              BEGIN

                IF ODD(I) THEN

                   TRAM[I]:=$FF ;

                { Se selecciona un típo de paleta definida por el usuario }

                SETFILLPATTERN(TRAM,COLOR);

              END;

            END;

       END;

      BAR(X1,Y1,X2,Y2); { Una vez que se ha obtenido el color se dibuja la

                          barra de ese color }

      END;

 { Este procedimiento dibuja en las coordenadas indicadas, una caja de la

   trama y colores indicados }

  PROCEDURE CAJA(X1,Y1,X2,Y2,TRAMA,C1,C2:WORD);

   VAR I,J:INTEGER;

    BEGIN

     { Se obtiene un típo de línea especificado por el usuario }

     SETLINESTYLE(USERBITLN,TRAMA,NORMWIDTH);

     { En seguida se dibuja una caja con un color específico }

     BOX(X1,Y1,X2,Y2,1,C1);

     SETCOLOR(C2);

     FOR I:=Y1 TO Y2 DO

      IF ODD(I) THEN

        LINE(X1,I,X2,I);

     IF TRAMA<>0 THEN

        { Si la trama del dibujo es diferente de 0 se define una línea

          por el usuario, y se hace una operación a nivel de bits con

          la trama y el número hexadecimal FFFF, para determinar la línea }

        SETLINESTYLE(USERBITLN,TRAMA XOR $FFFF,NORMWIDTH);

     FOR I:=Y1 TO Y2 DO

      IF NOT(ODD(I)) THEN

        LINE(X1,I,X2,I);

    END;



   { La siguiente funcion realiza una simple comparación de números, en la

     cual al variable "NUMMAY" debe ser menor o igual a "NUMMEN" e igual a

     "NUMMAY"}

     FUNCTION INN(NUMMAY,NUMERO,NUMMEN:INTEGER):INTEGER;

     BEGIN

      IF NUMERO<NUMMEN THEN

         NUMERO:=NUMMEN

      ELSE

        IF NUMERO>NUMMAY THEN

         NUMERO:=NUMMAY;

      INN:=NUMERO;

     END;





  { Esta función devuelve la tecla presionada }

   FUNCTION INKEY(VAR SECUNDARIO:BOOLEAN):CHAR;

   VAR CAR:CHAR;

     BEGIN

      SECUNDARIO:=FALSE;

      CAR:=READKEY;

      IF (CAR=CHAR(0)) AND KEYPRESSED THEN

      BEGIN

       CAR:=READKEY;

       SECUNDARIO:=TRUE;

      END;

      INKEY:=CAR;

     END;



(* Rellena una zona del enrejado "X","Y" con color "CF", y el tipo

   de relleno se define por "TRAMA".*)

  PROCEDURE PAINT(X,Y,TRAMA,CF,CB:INTEGER);

    BEGIN

      SETFILLSTYLE(TRAMA,CF);

      FLOODFILL(X,Y,CB);

    END;

(* Este procedimiento dibuja el texto enviado por "CHAR4X8" dibuja

   pixel por poxel las letras, no utiliza las funciones gráficas

   para proyectar texto en la pantalla, sino que es manualmente el dibujo

   del texto.*)

  PROCEDURE DIBUJ(X,Y,ESTILO,COLOR:INTEGER;FIGURA_C:FILLPATTERNTYPE);

   VAR I,J,NUM1,NUM2,RES,IT:BYTE;D_L,ITALICS:BOOLEAN;

   BEGIN

    RES:=0;SETCOLOR(0);D_L:=FALSE;ITALICS:=FALSE;IT:=0;

    IF ESTILO=3 THEN

      BEGIN

       D_L:=TRUE;

       ESTILO:=2

      END;

    IF ESTILO=4 THEN

      BEGIN

       IT:=1;

       ESTILO:=2

      END;

    IF ESTILO=5 THEN

      BEGIN

       IT:=1;D_L:=TRUE;

       ESTILO:=2

      END;

    FOR J:=0 TO (ESTILO*4-1) DO

     BEGIN

      I:=0;

      NUM1:=FIGURA_C[J+1];

      WHILE (NUM1>=1) DO

       BEGIN

        NUM2:=NUM1 DIV 2;

        RES:=NUM1-(NUM2 *2);

        NUM1:=NUM2;

           IF RES=1 THEN BEGIN IF D_L THEN

                                   BEGIN

                                         (* Aquí se dibujan pixel por pixel*)

                                         (* los caracteres de texto.*)

                                         PUTPIXEL(X+8-I+(IT*((7-J) DIV 2)),Y+(J*2),COLOR);

                                          PUTPIXEL(X+8-I+(IT*((7-J) DIV 2)),Y+(J*2)+1,COLOR);

                                   END

                              ELSE PUTPIXEL(X+8-I+(IT*((7-J) DIV 2)),Y+J,COLOR);END;

        I:=I+1;

       END;

     END;

   END;

(*_______________________________________________________________________*)



(* Este procedimiento es llamado por "TEXT4X8" el cual le manda un caracter

   y a su vez este procedimiento llama a "DIBUJ", para que este caracter

   sea impreso en la pantalla .*)

  PROCEDURE CHAR4X8(CARACTER:CHAR;XCOR,YCOR,COLOR,ESTILO:INTEGER);

      VAR

        COUNT,MASCARA,I,NIBBLE1,ASCII:BYTE;

        SEGMENTO,PRINCIPIO:LONGINT;

        FIGURA_C:FILLPATTERNTYPE;STYLE:INTEGER;

        BEGIN

             FILLCHAR(FIGURA_C,SIZEOF(FIGURA_C),0);

             ASCII:=ORD(CARACTER);

             SEGMENTO:=$F000;

             PRINCIPIO:=$FA6E+(ASCII*8);

             COUNT:=0;

             STYLE:=ESTILO;

             IF ESTILO>2 THEN ESTILO:=2;

           CASE ESTILO OF

           1:BEGIN

             FOR I:=0 TO 3 DO

               BEGIN

                COUNT:=I*2;

                NIBBLE1:=MEM[SEGMENTO:PRINCIPIO+COUNT] ;

                FIGURA_C[I+1]:=NIBBLE1;

               END;

                FIGURA_C[8]:=(MEM[SEGMENTO:PRINCIPIO+7]);

              IF (CARACTER IN['3','8','F','E','B','K','H','b','d','f']) THEN

               FIGURA_C[5]:=FIGURA_C[4] OR 28;

              IF (CARACTER IN['E','F']) THEN

               FIGURA_C[6]:=FIGURA_C[6] AND 239;

              IF (CARACTER='p') THEN FIGURA_C[7]:=FIGURA_C[7] OR 24;

              IF (CARACTER IN['q','g']) THEN FIGURA_C[7]:=FIGURA_C[7] OR 12;

            END;

          2: BEGIN

              FOR I:=0 TO 7 DO

               FIGURA_C[I+1]:=(MEM[SEGMENTO:PRINCIPIO+I]);

              END;

            END;

          (* Llamada al procedimiento para que dibuje el caracter.*)

          DIBUJ(XCOR,YCOR,STYLE,COLOR,FIGURA_C);

        END;

(*_______________________________________________________________________*)



(* Este procedimiento manda llamar a sus hijos para que sea impreso

   en la pantalla el texto pasado como par metro, este texto es escrito

   pixel por pixel, no se utilizan funciónes gráficas de texto. *)

PROCEDURE TEXTO4X8(TEXTO:STRING;XCOR,YCOR,COLOR,ESTILO:INTEGER);

     VAR

        COLUM,I:INTEGER;

        BEGIN

         COLUM:=XCOR;

         FOR I:=1 TO LENGTH(TEXTO) DO

          BEGIN

           (* Llamada al procedimiento para que escriba el caracter.*)

           CHAR4X8(TEXTO[I],COLUM,YCOR,COLOR,ESTILO);

           COLUM:=COLUM+8;

          END;

        END;

(*_______________________________________________________________________*)



{ El siguiente procedimiento escribe en la pantalla (con texto especificado

  por el programador no con funciones gráficas de texto), en la parte de

  la patalla especificada por "COLUMNA" }

  PROCEDURE CENT(FRASE:STRING;Y,XMEN,XMAY,COLOR,ESTILO:INTEGER);

   VAR COLUMNA:INTEGER;

    BEGIN

     COLUMNA:=XMEN+(((XMAY-XMEN)-(LENGTH(FRASE)*8)) DIV 2);

     TEXTO4X8(FRASE,COLUMNA,Y,COLOR,ESTILO);

    END;

(*_______________________________________________________________________*)

{ Este procedimiento es usado cada vez que se intenta grabar o abrir un

  archivo, porque es capaz de escribir en modo gráfico y la cadena escrita

  se obtiene en la variable "CAD" }

 PROCEDURE LEE_CADENA(VAR CAD:STRING;NUM:INTEGER;DAT:PERMITIDOS);

  VAR

  I,J,K,X,Y:INTEGER;

  CAR:CHAR;

   BEGIN

     I:=1;

     CAR:=' ';

     X:=GETX;

     Y:=GETY;

     { Escribir texto en las coordenadas "X", "Y", y de colr rojo }

     TEXTO4X8(CAD,X,Y,RED,2);

     MOVETO(X,Y);

     CAR:=UPCASE(READKEY); { Verifica la primera tecla presionada }

     { Si la tecla presionada fue "ENTER" se mueve de posición, y dibuja

       una caja de color blanco y la variable "CAD" toma el valor de ENTER }

     IF CAR<>#13 THEN

       BEGIN

         BOX(X,Y,X+(LENGTH(CAD)*8),Y+8,1,WHITE);

         FILLCHAR(CAD,SIZEOF(CAD),0);

         MOVETO(X,Y);

       END;

      { Si la tecla presionada es diferente de "ENTER" se inserta en la

        variable "CAD" }

      WHILE (CAR<>#13) DO

      BEGIN

        IF (CAR IN DAT) AND (I<=NUM) THEN

             INSERT(CAR,CAD,I);

        { Si la tecla presionada es "BACKSPACE" se recorre una posición y

          borra el caracter anterior con una barra blanca }

        IF (CAR=#8) AND (I>1) THEN

         BEGIN

          DELETE(CAD,I-1,1);

          MOVETO(X+((I-2)*8),Y);

          BOX(GETX,GETY,GETX+8,GETY+8,1,WHITE);

         END;

        { En caso de que la tecla oprimida haya sido "ESC" la variable

          "CAD" no toma valor alguno }

        IF CAR=#27 THEN BEGIN

         BOX(X,Y,X+(LENGTH(CAD)*8),Y+8,1,WHITE);

         MOVETO(X,Y);CAD:='';

         END;

        I:=LENGTH(CAD)+1;

        MOVETO(X,Y);

        TEXTO4X8(CAD,GETX,GETY,RED,2); { Si la tecla presionada es algún

                                         caracter este se imprime en

                                         la pantalla }

        CAR:=UPCASE(READKEY);          { Y espera a que presione la siguiente

                                         tecla }

       END;

       MOVETO(X,Y+1);

    END;

(*_______________________________________________________________________*)



(* Este procedimiento crea el enrajado de la zona donde se dibuja el ícono *)

   PROCEDURE Rejilla(X,Y:INTEGER);

    VAR I,J:INTEGER;

      BEGIN

      SETLINESTYLE(USERBITLN,$FFFF,NORMWIDTH);

      SETCOLOR(BLUE);

       FOR I:=0 TO 87 DO

        FOR J:=0 TO 51 DO

          RECTANGLE(X+(I*6),Y+(J*6),X+(I*6)+6,Y+(J*6)+6);

      END;

  { Este procedimiento rellena una zona del dibujo de un cierto color }

   PROCEDURE DIBUJA2(X,Y:INTEGER);

    VAR I,J,K,H,COLOR:INTEGER;

    COMODIN:BYTE;

    BEGIN

     WITH MAT DO BEGIN

      FOR I:=0 TO 51 DO

       FOR J:=0 TO 10 DO

        FOR K:=7 DOWNTO 0 DO

        BEGIN

         { Primero se obtiene el color para dibujar en la variable "COMODIN" }

         COMODIN:=(MATRIZ[I+1,J+1] AND (1 SHL K)) DIV (1 SHL K) XOR 1;

         COMODIN:=COMODIN*15;

         { Comienza a dibujar la zona del color determinado por "COMODIN" }

         PAINT(X+2+((J*8)+7-K)*6,Y+((I)*6)+2,1,COMODIN,BLUE);

         DIBUJO[I,(7-K)+(J*8)]:=COMODIN;

        END;

      END;

    END;

   PROCEDURE DIBUJA(X,Y,INC,DEC:INTEGER);

    VAR

    I,J,K,H,MONITOR,MODO,COLOR:INTEGER;

    COMODIN:BYTE;

    BEGIN

     DETECTGRAPH(MONITOR,MODO);

     IF (MONITOR=VGA) THEN

         COLOR:=yellow

     ELSE

         COLOR:=1;

     WITH MAT DO BEGIN

      FOR I:=1 TO 52 DO

       FOR J:=1 TO 11 DO

        FOR K:=7 DOWNTO 0 DO

        BEGIN

          COMODIN:=(MATRIZ[I,J] AND (1 SHL K)) DIV (1 SHL K) XOR 1;

          COMODIN:=COMODIN*COLOR;

          SETCOLOR(COMODIN);

          LINE(X+((J*8*INC DIV DEC)-(K*INC DIV DEC)),Y+I,

          X+((INC-1) DIV DEC)+((J*8*INC DIV DEC)-(K*INC DIV DEC)),Y+I);

        END;

      END;

    END;

  { El siguiente procedimiento dibuja en la pantalla el dibujo que ha creado

    en una escala menor }

   PROCEDURE DIBUJA_CH;

    VAR

    I,J:INTEGER;

    COMODIN:POINTER;

    SECUNDARIO:BOOLEAN;

    K:CHAR;

    BEGIN

     { Primero se guarda memoria sobre la cual se guardar  la imagen }

     GETMEM(COMODIN,IMAGESIZE(100,80,187,131));

     { Posteriormente se guarda la imagen en la memoria }

     GETIMAGE(100,80,187,131,COMODIN^);

     K:=' ';

      FOR I:=0 TO 51 DO

       FOR J:=0 TO 87 DO

         { Se presenta el dibujo en una escala menor }

         PUTPIXEL(100+J,80+I,DIBUJO[I,J]);

    REPEAT

     K:=INKEY(SECUNDARIO); { No se hace otra acción hasta presionar "ESC" }

    UNTIL (K=CHR(27));

    { Despues de imprime la imagen guardada en memoria }

    PUTIMAGE(100,80,COMODIN^,NORMALPUT);

    { Y se libera la memoria en la que se guardo el imagen }

    FREEMEM(COMODIN,IMAGESIZE(100,80,187,131));

    END;

{ El siguente procedimiento dibuja una serie de cajas con un color y un

  trama }

  PROCEDURE DIBUJA3;

   VAR

     I,J,X,Y,CO:INTEGER;

     ES:WORD;

     BEGIN

       X:=100;

       Y:=10;

       FOR I:=0 TO 51 DO

        FOR J:=0 TO 87 DO

         BEGIN

          CO:=DIBUJO[I,J] DIV 16;{ Se obtiene el color de las líneasa de la caja }

          IF DIBUJO[I,J]>15 THEN { Esta sentencia obtine el trama de la caja }

                ES:=$AAAA

          ELSE

                ES:=0;

           { Una vrez obtenidos los datos se dibuja la caja }

          CAJA(X+(J*6)+1,Y+(I*6)+1,X+(J*6)+5,Y+(I*6)+5,ES,DIBUJO[I,J],CO);

         END;

     END;

{ Este procedimiento realiza una operación parecida a la efectuada por el

  procedimiento "DIBUJA_CH" proyecta el dibujo creado en una escala menor }

PROCEDURE DIBUJA4;

 VAR

 I,J:INTEGER;

 SECUNDARIO:BOOLEAN;

 K:CHAR;

 COMODIN:POINTER;

  BEGIN

   { Primero se reserva memoria para guardar la imagen }

   GETMEM(COMODIN,IMAGESIZE(100,80,296,184));

   { Posteriormente se gurada la imagen en la memoria reservada }

   GETIMAGE(100,80,296,184,COMODIN^);

   K:=' ';

   FOR I:=0 TO 51 DO

    FOR J:=0 TO 87 DO

    BEGIN        { Y finalmente se dibuja la imagen }

     BOX(100+(J*2),80+(I*2),101+(J*2),81+(I*2),1,DIBUJO[I,J]);

     IF DIBUJO[I,J]>15 THEN

                     PUTPIXEL(101+(J*2),81+(I*2),DIBUJO[I,J] DIV 16);

    END;

     REPEAT

      K:=INKEY(SECUNDARIO);  { El programa no realiza otra acción hasta no

                               presionar "ESC" }

     UNTIL (K=CHR(27));

    { Una vez precionado "ESC" se proyecta la imagen guardada en memoria }

    PUTIMAGE(100,80,COMODIN^,NORMALPUT);

    { Y se libera esa memoria }

    FREEMEM(COMODIN,IMAGESIZE(100,80,296,184));

     END;

 (* Este procedimiento graba en disco el archivo o dibujo ya echo. *)

    PROCEDURE GRABA_EN_DISCO;

    BEGIN

     WRITE(ARCHVGA,DIBUJO);

     CLOSE(ARCHVGA);

    END;

(* Este procedimiento abre un archivo de disco creado previamente con

   el editor. *)

   PROCEDURE LLAMA_DE_DISCO;

    BEGIN

     READ(ARCHVGA,DIBUJO);

     CLOSE(ARCHVGA);

    END;



 (* Este procedimiento actua segun sea "OPCION", si fue "F6", pide el

    nombre del archivo para guardarlo en el disco, si fue "F7", pide

    el nombre del archivo para abrirlo desde el disco.  *)



   PROCEDURE VENTANA_DISCO(OPCION:CHAR;VAR DIBUJO:CONV);

    VAR I,J:INTEGER;WIN:POINTER;NOMBRE:STRING;

    BEGIN

    {$I-}

     { Primero se guarda la imagen donde se dibujara sobre ella }

     GETMEM(WIN,IMAGESIZE(100,30,440,70));

     GETIMAGE(100,30,440,70,WIN^);

     { Y posteriormente se dibuja la ventana de di logo }

     CAJA(120,30,440,70,$CCCC,BLUE,BLACK);

     BOX(140,40,420,60,1,WHITE);NOMBRE:='';

     CASE OPCION OF

      'G':BEGIN  { Si la tecla fué F6 se grabar  un archivo}

          TEXTO4X8('     NOMBRE DEL ARCHIVO A GRABAR:',122,42,GREEN,4);

          MOVETO(142,52);

          { Se lee el nombre del archivo }

          LEE_CADENA(NOMBRE,25,['A'..'Z','.','\',':','0'..'9']);

          IF NOMBRE<>'' THEN

             BEGIN

              ASSIGN(ARCHVGA,NOMBRE);{ Se asigna el archivo }

              REWRITE(ARCHVGA);      { Se borra lo que tenga }

              WRITE(ARCHVGA,DIBUJO)  { Y finalmente se guarda el dibujo }

             END

           END;

      'L':BEGIN { Si la tecla fué F7 se abrir  un archivo de disco }

          TEXTO4X8('     NOMBRE DEL ARCHIVO A LLAMAR:',122,42,GREEN,4);

          MOVETO(142,52);

          { Se lee el nombre del archivo }

          LEE_CADENA(NOMBRE,25,['A'..'Z','.','\',':','0'..'9']);

          IF NOMBRE<>''THEN  { Si el nombre del archivo es diferente de ''

                               este archivo es guardado }

             BEGIN

              ASSIGN(ARCHVGA,NOMBRE);   { Se asigna el archivo }

              RESET(ARCHVGA);           { Se borra el contenido }

              READ(ARCHVGA,DIBUJO)      { Y se lee el archivo de disco }

             END

          END;

     END;

     IF IORESULT<>0 THEN WRITE(CHR(7));

     { Finalmente se restablece la imagen }

     PUTIMAGE(100,30,WIN^,NORMALPUT);

    {$I+}

   END;



{ Este procedimiento es el encargado de todo el trabajo ya que desde aquí

  son llamdos todos los demas porcedimientos para la creación del dibujo,

  según desee el usuario }

 PROCEDURE CREA_IMAGEN(X1,Y1:INTEGER);

    VAR X,Y,I,J,K,CO2,CO21:INTEGER;

        DISP,SECUNDARIO:BOOLEAN;

        OP:CHAR;

        ESTILO,ES2:WORD;

        CI2:STRING[20];

        BEGIN

         K:=0;

         J:=0;

         X:=X1;

         Y:=Y1;

         I:=0;

         DISP:=FALSE;

         SECUNDARIO:=FALSE;

   { Escribe el texto sobre el lugar en el que se visualizan

     los diferentes colores }

   TEXTO4X8('COLOR',30,100,BLUE,3);

   REPEAT

       IF I>16 THEN

         ESTILO:=$AAAA

       ELSE

         ESTILO:=0;

       CO2:=I DIV 16;

       { Se crea la caja o ventana donde se visualizan los colores }

       CAJA(30,125,70,135,ESTILO,I,CO2);

       { Se dibuja l acaja donde se especifica el número de color y

         posición }

       BOX(36,280,98,320,1,WHITE);STR(I,CI2);

       { Imprime en la pantalla la palabra "COLOR" que indica el

         número de color que se esta usando }

       TEXTO4X8('COLOR: '+CI2,10,300,RED,2);

       STR(J,CI2);

       { Imprime la letra "X" para indicar la coordenada en x del

         cursor del editor }

       TEXTO4X8('X: '+CI2,20,280,BROWN,2);

       STR(K,CI2);

       { Imprime la letra "Y" para indicar la coordenada en y del

         cursor del editor }

       TEXTO4X8('Y: '+CI2,20,290,BROWN,2);

       STR(DIBUJO[K,J],CI2);

       { Imprime la palabra "PIXEL" que indica la posición en

         "X", "Y" del cursor del editor }

       TEXTO4X8('PIXEL :'+CI2,10,310,GREEN,2);

       { Si se presioneo la tecla F1 entonces se cumplira est 

         condición y aparecer  en la pantalla la leyenda

         "ACTIVO" que significa que eses color en particular

         esta siendo utilizado para dibujar }

       IF DISP THEN

         BEGIN BOX(30,230,80,240,1,CYAN);

               TEXTO4X8('ACTIVO',30,231,RED,4);

         END

       { En otro caso se dibujara una caja de color blanco }

       ELSE

           BOX(30,230,80,240,1,WHITE);

        { Este ciclo se asegura de que cuando se salga de

          él se tenga la tecla presionada y ademas sea

          una tecla de instrucción para el editor, ademas

          dibuja una caja que hace el efecto de cursor

          pulsante }

        REPEAT

          REPEAT

           BOX(X+1,Y+1,X+5,Y+5,1,I);

           BOX(X+1,Y+1,X+5,Y+5,1,I XOR 15);

          UNTIL KEYPRESSED;

         OP:=INKEY(SECUNDARIO);

        UNTIL (OP IN[F_ARR,F_AB,F_I,F_D,F1,F2,F3,F5,F6,F4,F7,F8,F9,

                                    PU,PD,INS,FIN,DEL,HOME])

                                         AND SECUNDARIO;

         IF DISP THEN

            DIBUJO[K,J]:=I;

         IF DIBUJO[K,J]<16 THEN

              ES2:=0

         ELSE

             ES2:=$AAAA;

         CO21:=DIBUJO[K,J] DIV 16;

         CAJA(X+1,Y+1,X+5,Y+5,ES2,DIBUJO[K,J],CO21);

         { Si la variable secundario es verdadera quiere

           decir que se ha oprimido una tecla y verificar 

           que acción corresponde a dicha tecla }

        IF SECUNDARIO THEN

         CASE OP OF

          F_ARR:K:=INN(51,K-1,0);{ Flecha hacia arriba }

          F_AB:K:=INN(51,K+1,0); { Flacha hacia abajo }

          F_I:J:=INN(87,J-1,0);  { Flecha a la izquierda }

          F_D:J:=INN(87,J+1,0);  { Flecha a la derecha }

          INS:BEGIN J:=INN(87,J-1,0);K:=INN(51,K-1,0) END;  { Tecla "INS" }

          FIN:BEGIN J:=INN(87,J+1,0);K:=INN(51,K+1,0) END;  { Tecla "FIN" }

          DEL:BEGIN J:=INN(87,J-1,0);K:=INN(51,K+1,0) END;  { Tecla "DEL" }

          HOME:BEGIN J:=INN(87,J+1,0);K:=INN(51,K-1,0) END; { Tecla "HOME"}

          F1:DISP:=NOT(DISP);    { Tecla "F1"}

          F2:I:=INN(255,I+1,0);  { Tecla "F2"}

          F3:I:=INN(255,I-1,0);  { Tecla "F3"}

          PD:I:=INN(255,I+16,0); { Tecla "Page Down"}

          PU:I:=INN(255,I-16,0); { Tecla "Page Up"}

          { Tecla "F6"}

          F6:BEGIN VENTANA_DISCO('G',DIBUJO);Rejilla(100,10);DIBUJA3 END;

          { Tecla "F7"}

          F7:BEGIN VENTANA_DISCO('L',DIBUJO);Rejilla(100,10);DIBUJA3 END;

          F4:DIBUJA_CH;  { Tecla "F4"}

          F8:DIBUJA4;    { Tecla "F8"}

          { Tecla "F9"}

          F9:BEGIN FILLCHAR(DIBUJO,SIZEOF(DIBUJO),15);DIBUJA3 END;

         END;

         X:=X1+(J*6);Y:=Y1+(K*6);

         UNTIL (OP=F5);

     END;

 (* Procedimiento para inicializar gráficos *)

   PROCEDURE INICIA_GRAFICOS;

     VAR MONITOR,MODO:INTEGER;

     BEGIN

      (* Funcion que regresa el tipo de adaptador gráfico de su PC *)

      DETECTGRAPH(MONITOR,MODO);

      (* Inicializar los gráficos una vez encontrado el tipo de adaptador *)

      INITGRAPH(MONITOR,MODO,'c:\TP\BGI');

      IF (MONITOR=VGA) THEN

             SETGRAPHMODE(VGAMED);

      (* Verificación de error en el modo gráfico *)

      IF GRAPHRESULT<>GROK THEN

             HALT

     END;

(*-------------------------------------------------------------------------*)

(* Programa Principal*)

    BEGIN

     INICIA_GRAFICOS;J:=0;K:=0; (* Inicializar gráficos *)

      DIRECTVIDEO:=FALSE;

      BOX(1,1,GETMAXX,GETMAXY,1,15);  (* Dibuja una caja de color blanco *)

      Rejilla(100,10);I:=0;

      CREA_IMAGEN(100,10);

      ALGO:=READKEY;

    END.