
TEXTO CODIFICADO DO PROGRAMA ACENTOS P/ MARCELO PIMENTEL

TEXTO CODIFICADO DO PROGRAMA ACENTOS P/ MARCELO PIMENTEL

Captulo 38 - unit graph

  Esta unidade  responsvel pelo suporte grfico do Turbo.  uma biblioteca
grfica com mais de 50 rotinas, para a utilizao de alguns arquivos externos,
sendo estes drivers grficos (.BGI) ou fontes de caracteres (.CHR). No modo
grfico, deixamos de ter linhas e colunas para termos pontos nas coordenadas
X e Y, que podem ter diversas combinaes de acordo com o hardware.

DETECGRAPH - este procedimento permite detectar o hardware e o modo grfico
atuais. Estas informaes so retornadas em 2 variveis do tipo INTEGER,
sendo este procedimento muito til, quando no conhecemos o ambiente grfico
no qual estamos. sua sintaxe:
DETECTGRAPH (VAR <grafdrv>, <grafmod> : INTEGER);
Vamos a um exemplo:
PROGRAM teste_detectgraph;
USES GRAPH;
CONST
  tab_drv : ARRAY[1..10] OF STRING[8] = (CG, MCG, EG, EGA64,
        EGAMON, IBM8514, HERCMON ATT400, VG, PC3270);
  tab_mod : ARRAY[0..4] OF STRING[15] - (CGAC0 320x200, CGAC1 320x200,
        CGAC2 320x200, CGAC3 320x200, CGAHI 640x200);
VAR
  grafdrv, grafmod : INTEGER;
BEGIN
  DETECTGRAPH (grafdrv,grafmod);
  WRITELN (o drive grfico atual  , tab_drv[grafdrv]);
  IF (grafdrv = CGA) OR (grafdrv = MCGA)
    THEN
      WRITELN (o modo grfico atual  , tab_mod[grafmod])
  ELSE
    WRITELN (o modo grfico atual  , grafmod);
  READLN;
END.
  Existem, nesta UNIT, algumas constantes de drivers grficos predefinidas.
So elas:
  CurrentDriver = -128;  {para GETMODRANGE}
  DETECT = 0;  {requer auto deteco}
  CGA = 1;
  MCGA = 2;
  EGA = 3;
  EGA64 = 4;
  EGAMONO = 5;
  IBM8514 = 6;
  HERCMONO = 7;
  ATT400 = 8;
  VGA = 9;
  PC3270 = 10;

  A constante DETECT contm o driver grfico corrente.
  De acordo com o driver ativo podemos ter os seguintes modos grficos prede-
finidos:
  CGAC0 = 0;   {320x200}
  CGAC1 = 1;   {320x200}
  CGAC2 = 2;   {320x200}
  CGAC3 = 3;   {320x200}
  CGAHI = 4;   {640x200}
  MCGAC0 = 0;   {320x200}
  MCGAC1 = 1;   {320x200}
  MCGAC2 = 2;   {320x200}
  MCGAC3 = 3;   {320x200}
  MCGAMED = 4;   {640x200}
  MCGAHI = 5;   {640x480}
  EGALO = 0;   {640x200}
  EGAHI = 1;   {640x350}
  EGA64LO = 0;   {640x200}
  EGA64HI = 1;   {640x350}
  EGAMONOHI = 3;   {640x350}
  HERCMONOHI = 0;   {720x348}
  ATT400C0 = 0;   {320x200}
  ATT400C1 = 1;   {320x200}
  ATT400C2 = 2;   {320x200}
  ATT400C3 = 3;   {320x200}
  ATT400MED = 4;  {640x200}
  ATT400HI = 5;   {640x400}
  VGALO = 0;  {640x200}
  VGAMED = 1;   {640x350}
  VGAHI = 2;   {640x480}
  PC3270HI = 0;   {720x350}
  IBM8514LO = 0;   {640x480}
  IBM8514HI = 1;   {1024x768}

INITGRAPH - este procedimento faz a inicializao grfica para que sejam
possveis todas as operaes grficas desta UNIT. So padssados como parmetros
o driver e o modo grfico, que sero atualizados caso o driver grfico seja 0
e tambm o PATH do driver, este uma STRING que se estiver vazia, utilizar
o corrente. Sua sintaxe:
INIGRAPH (VAR <grafdrv> : INTEGER; VAR <grafmod> : INTEGER; <pathdodrv> :
                STRING);
Vejamos um exemplo:
PROGRAM teste_initgraph;
USES GRAPH;
VAR
  grafdrv, grafmod : INTEGER;
BEGIN
  grafdrv := DETECT;
  WRITELN (o drive grfico antes d,inicializao  ,grafdrv);
  READLN;
  INIGRAPH(grafdrv,grafmod, );
  WRITELN (o drive grfico aps ,a inicializao  ,grafdrv);
  READLN;
END.

GETDRIVERNAME - esta funo nos retorna uma STRING, contendo o nome do driver
grfico corrente. Sua sintaxe:
GETDRIVERNAME;
Vamos a um exemplo:
PROGRAM teste_getdrivername;
USES GRAPH;
VAR
  grafdrv, grafmod : INTEGER;
BEGIN
  grafdrv := DETECT;
  INITGRAPH (grafdrv,grafmod, );
  IF GRAPHRESULT < GROK
    THEN
      HALT (1);
  WRITELN (o drive grfico corrente  , GETDRIVERNAME);
  READLN;
  CLOSEGRAPH;
END.

GETMODENAME - esta funo nos retorna uma STRING referente ao modo grfico
passado como parmetro. Sua sintaxe:
GETMODENAME (<nummod> : WORD) : STRING;
Vejamos um exemplo:
PROGRAM teste_getmodename;
USES GRAPH;
VAR
  gd, gm : INTEGER;
BEGIN
  gd := DETECT;
  INITGRAPH (gd,gm, );
  IF GRAPHRESULT <> GROK
    THEN
      HALT (1);
  WRITELN (o modo grfico atual  ,gm,  , GETMODENAME(gm));
  READLN;
  CLOSEGRAPH;
END.

GETMODERANGE - este procedimento retorna a faixa de valores que podem ser
utilizado no modo grfico passado como parmetro. Sua sintaxe:
GETMODERANGE (<grafmod> : INTEGER; VAR <menor>, <maior> : INTEGER);
Vamos a um exemplo:
PROGRAM teste_getmoderange;
USES GRAPH;
VAR
  gd, gm : INTEGER;
  baixa, alta : INTEGER;
BEGIN
  gd := DETECT;
  INITGRAPH (gd, gm, );
  IF GRAPHRESULT <> GROK
    THEN
      HALT (1);
  GETMODERANGE (gd,baixa,alta);
  WRITELN (o modo grfico atual  ,gm, ,GETMODENAME(gm));
  WRITELN (o drive grfico atual  , gd, ,GETDRIVERNAME);
  WRITELN (a menor modo grfico  ,baixa, o menor,alta);
  READLN;
  CLOSEGRAPH;
END.

GRAPHRESULT - esta  uma funo que nos retorna o cdigo de erro da ltima
operao grfica realizada. Estes error esto predefinidos como segue:
CONST
  GROK = 0;   {sem erros}
  GRNOININTGRAPH = -1;   {no inicializado, USE}
                         {INIGRAPH}
  GRNOTDETECTED = -2;   {hardware no detectado}
  GRFILENOTFOUND = -3;   {arquivo no encontrado}
  GRINVALIDDRIVER = -4;   {driver invlido}
  GRNOLOADMEM = -5;   {memria no apanhada}
  GRNOSCANMEM = -6;   {memria no varrida}
  GRNOFLOODMEM = -7;   {memria cheia}
  GRFONTNOTFOUND = -8;   {arquivo de fontes}
                         {no encontrado}
  GRNOFONTMEM = -9;   {arquivo fonte fora da memria}
  GRINVALIDMODE = -10;   {modo grfico selecionado invlido}
  GRERROR = -11;   {erro genrico}
  GRIOERROR = -12;   {erro de entrada ou sada}
  GRINVALIDFONT = -13;   {fonte invlida}
  GRINVALIDFONTNUM = - 14;   {nmero da fonte invlido}
Sua sintaxe:
GRAPHRESULT : INTEGER;
Vamos a um exemplo:
PROGRAM teste_graphresult;
USES GRAPH;
VAR
  grafdrv, grafmod, erro : INTEGER;
BEGIN
  grafdrv := DETECT;
  INITGRAPH (grafdrv,grafmod, );
  erro := GRAPHRESULT;
  IF erro <> GROK
    THEN
      WRITELN (houve erro na inicializa,grfica, erro nr,erro);
  ELSE
    WRITELN (inicializao sem erros);
  READLN;
END.

  Altere no programa acima, a constante DETECT por -1 para que seja forado
um erro e veja o resultado.

GETGRAPHMODE - esta funo nos retorna o valor do modo grfico corrente,
o qual pode ser de 0 a 5, dependendo do drive grfico corrente. Veja quais
os valores possveis na tabela a seguir:
driver grfico - nome da constante - valor - resoluo
CGA - CGAC0 - 0 - 320x200
    - CGAC1 - 1 - 320x200
    - CGAC2 - 2 - 320x200
    - CGAC3 - 3 - 320x200
    - CGAHI - 4 - 640x200
MCGA - MCCGAC0 - 0 - 320x200
     - MCGAC1 - 1 - 320x200
     - MCGAC2 - 2 - 320x200
     - MCGAC3 - 3 - 320x200
     - MCGAMED - 4 - 640x200
     - MCGAHI - 5 - 640x480
EGA - EGALO - 0 - 640x200
    - EGAHI - 1 - 640x350
EGA64 - EGA64LO - 0 - 640x200
      - EGA64HI - 1 - 640x350
EGAMONO - EGAMONOHI - 3 - 640x350
HERC - HERCMONOHI - 0 - 720x348
ATT400 - ATT400C0 - 0 - 320x200
       - ATT400C1 - 1 - 320x200
       - ATT400C2 - 2 - 320x200
       - ATT400C3 - 3 - 320x200
       - ATT400MED - 4 - 640x200
       - ATT400HI - 5 - 640x400
VGA - VGALO - 0 - 640x200
    - VGAMED - 1 - 640x350
    - VGAHI - 2 - 640x480
PC3270 - PC3270HI - 0 - 720x350
8514 - IBM8514LO - 0 - 640x480
     - IBM8514HI - 1 - 1024x768
Sua sintaxe:
GETGRAPHMODE : INTEGR;
Vamos a um exemplo:
PROGRAM teste_getgraphmode;
USES GRAPH;
VAR
  gd, gm, modo : INTEGER;
BEGIN
  gd := DETECT;
  INITGRAPH (gd,gm, );
  IF GRAPHRESULT <> GROK
    THEN
      HALT (1);
  modo := GETGRAPHMODE;
  CLOSEGRAPH;
  WRITELN (o mopdo grfico corrente  ,modo);
  READLN;
END.

SETGRAPHMODE - este procedimento permite estabelecer um novo modo grfico,
alm disso, tambm faz com que a tela seja limpa. Sua sintaxe:
SETGRAPHMODE (<mode> : INTEGER);
Vejamos um exemplo:
PROGRAM teste_setgraphmode;
USES GRAPH;
VAR
  gd, gm : INTEGER;
BEGIN
  gd := DETECT;
  INITGRAPH (gd,gm, );
  IF GRAPHRESULT <> GROK
    THEN
      HALT (1);
  RECTANGLE (0,0,199,199);
  READLN;
  SETGRAPHMODE (0);
  RECTANGLE (0,0,199,199);
  READLN;
  CLOSEGRAPH;
END.

GETMAXMODE -  esta funo nos retorna o maior valor que poder ser utilizado
para estabelecer o modo grfico. Sua sintaxe:
GETMAXMODE : INTEGE;
Vamos a um exemplo:
PROGRAM teste_getmaxmode;
USES GRAPH;
VAR
  gd, gm : INTEGER;
  i : BYTE;
BEGIN
  gd := DETECT;
  INITGRAPH (gd,gm, );
  IF GRAPHRESULT <> GROK
    THEN
      HALT (1);
  WRITELN (o modo corrente  ,GETMODENAME(gm));
  WRITELN;
WRITELN(o maior valor possvel para o mod,grfico  ,GETMAXMODE);
  WRITELN;
  FOR i:= 0 TO GETMAXMODE DO
    WRITELN (o nome do mod,i, ,GETMODENAME(i));
  READLN;
  CLOSEGRAPH;
END.

GRAPHERRORMSG - esta funo retorna mensagem de erro em STRING, de acordo
com o nmero do erro passado como parmetro. Sua sintaxe:
GRAPHERRORMSG (<erro> : INTEGER) : STRING;
Vejamos um exemplo:
PROGRAM teste_grapherrormsg;
USES GRAPH;
VAR
  grafdrv, grafmod, erro : INTEGER;
BEGIN
  grafdrv := DETECT;
  INITGRAPH (grafdrv,grafmod, );
  erro := GRAPHRESULT;
  IF erro <> GROK
    THEN
      WRITELN (houve erro na inicializa,grfica, erro nr,erro,
            GRAPHERRORMSG(erro))
  ELSE
    WRITELN (inicializao sem erros, GRAPHERRORMSG(erro));
  READLN;
END.
  Se quiser, pode-se forar o envio das mensagens de erro passando os par-
metros de 0 a -14 na funo GRAPHERROSMSG, teremos assim todas as mensagens
de acordo com a tabela de erros mostrada anteriormente. Vejamos tambm este
exemplo:
PROGRAM teste_grapherrormsg2;
USES GRAPH;
VAR
  grafdrv, grafmod, erro : INTEGER;
BEGIN 
  FOR erro := 0DOWNTO -14 DO
    WRITELN (error n_,erro : 3,mensagem,GRAPHERRORMSG(erro));
    READLN;
END.

CLOSEGRAPH - este procedimento permite voltar ao modo anterior, ao uso de 
INITGRAPH, e deve ser utilizado ao trmino de uma sesso grfica, permitindo
tambm a liberao de memria alocada para as rotinas grficas. Sua sintaxe:
CLOSEGRAPH;
Vamos a um exemplo:
PROGRAM teste_closegraph;
USES GRAPH;
VAR
  grafdrv, grafmod, erro : INTEGER;
BEGIN
  grafdrv := DETECT;
  INITGRAPH (grafdrv,grafmod, );
  erro := GRAPHRESULT;
  IF erro <> GROK
    THEN
      WRITELN (houve erro na inicializagrfica,erro nrerro,
            GRAPHERRORMSG(erro));
  ELSE
    BEGIN
      WRITELN (inicializao sem erros);
      WRITELN (GRAPHERRORMSG(erro));
  END;
  READLN;
  CLOSEGRAPH;
END.

ARC - este procedimento permite desenhar um arco. Devem ser passados como 
parmetros os pontos centrais, neste caso, coordenadas X e Y em relao  
tela como um todo, o raio, o ngulo de incio e o ngulo de fim. Caso o 
ngulo de incio seja 0 e o final 360, teremos uma circunferncia. O ngulo
inicial 0 corresponde s 3 horas de um relgio, os 90 graus s 12 horas e
assim sucessivamente. Sua sintaxe:
ARC (<X,Y> : INTEGER; <anginicio>, <angfim>, < raio> : WORD);
Vamos a um exemplo:
PROGRAM teste_arc;
USES GRAPH;
VAR
  gd, gm : INTEGER;
  raio : INTEGER;
BEGIN
  gd := DETECT;
  INITGRAPH (gd,gm, );
  IF GRAPHRESULT <> GROK
    THEN
      HALT (1);
  FOR raio := 1 TO 48 DO
    ARC (320,200,0,ROUND(raio * 5),raio * 10);
  READLN;
  CLOSEGRAPH;
END.

GETARCCOORDS - este procedimento permite recuperar informaes a respeito
das coordenadas passadas como parmetrtos no procedimento ARC. Para tanto,
devemos utilizar como parmetro, uma varivel do tipo ARCCORODSTYPE, a qual
est predefinida na UNIT GRAPH, sendo da seguinte forma:
TYPE 
  ARCCXOORDSTYPE = RECORD
    X, Y : INTEGER;
    XSTART, YSTART : INTEGER;
    XEND, YEND : INTEGER;
  END;
Sua sintaxe:
GETARCCOORDS (VAR<arccoord> : ARCOORDSTYPE);
  As coordenada so retornadas pela ordem: coordenadas centrais, coordenadas
dos pontos de incio e coordenadas do final. Vamos a um exemplo:
PROGRAM teste_getarccoords;
USES GRAPH;
VAR
  grafdrv, grafmod : INTEGER;
  arccoor : ARCCOORDSTYPE;
  i : BYTE;
BEGIN
  grafdrv := DETECT;
  INITGRAPH (grafdrv,grafmod, );
  IF GRAPHRESULT <> GROK
    THEN
      HALT(1);
  ARC (200,100,0,270,50);
  GETARCCOORDS (arccoor);
  WITH arccoor DO
    BEGIN
      FOR i := 1 TO 50 DO
        BEGIN
          ARC (xend,yestart,x,y,yend);
          GETARCCOORDS (arccoor);
        END;
    END;
  READLN;
  CLOSEGRAPH;
END.

BAR - este procedimento permite que seja desenhada uma barra, desde que se
passem como parmetros, as coordenadas dos cantos superior esquerdo, x1, y1 e
 inferior direito x2, y2. Esta barra ser preenchida com o estilo de preenchi-
mento (FILL STYLE), e cor correntes. Sua sintaxe:
BAR (<x1>< ,y1>, <x2>, <y2> : INTEGER);
Vamos a um exemplo:
PROGRAM teste_bar;
USES GRAPH;
VAR
  gd, gm, i, tamanho : INTEGER;
BEGIN
  gd := DETECT;
INITGRAPH (gd,gm, );
  IF GRAPHRESULT <> GROK
    THEN
      HALT (1);
  tamanho := 10;
  FOR i := 1 TO 20 DO
    BAR (i * tamanho + i,i * 10, SUCC(i) * tamanho, 200);
  READLN;
  CLOSEGRAPH;
END.

BAR3D - este procedimento permite que seja desenhada uma barra em 3 dimenses,
desde que se passem como parmetros as coordenadas dos cantos superior esquerdo,
x1, y1, e inferior direito x2, y2, profundidade, e uma varivel booleana,
indicando se ser preenchido o topo ou no. Esta barra ser preenchida 
com estilo de preenchimento (FILL STYLE) e cor corrente. Sua sintaxe:
BAR3D (<x1>, <y1>, <x2>, <y2> : INTEGER; prof : WORD; topo : BOOLEAN);
Vejamos um exemplo:
PROGRAM teste_bar3d;
USES GRAPH;
VAR
  gd, gm, i, tamanho : INTEGER;
BEGIN
  gd := DETECT;
  INITGRAPH (gd, gm, );
  IF GRAPHRESULT <> GROK
    THEN
      HALT (1);
  tamanho := 10;
  FOR i := 1 TO 20 DO
    BAR3D (i * tamanho + i, i * 10, SUCC(i) * tamanho, 200, 10, topon);
  FOR i := 1 TO 20 DO
    BAR3D (i * tamanho + i + 220, i * 10, SUCC(i) * tamanho + 220, 200, 10,TOPOFF);
  READLN;
  CLOSEGRAPH;
END.
  As constantes TOPON (TRUE) e TOPOFF(FALSE) so predefinidas na UNIT GRAPH.
A opo de no se desenhar o topo serve para quando queremos desenhar barra
sobre barra.

CRICLE - este procedimento permite que seja desenhado um crculo com centro
nas coordenadas X, Y e de acordo com o raio passado como parmetro. Sua sintaxe;x
CIRCLE(<x>, <y> : INTEGER; <raio> : WORD);
Vamos a um exemplo:
PROGRAM teste_circle;
USES GRAPH;
VAR
  gd, gm, raio : INTEGER;
BEGIN
  gd := DETECT;
  INITGRAPH (gd, gm, );
  IF GRAPHRESULT <> GROK
    THEN
      HALT (1);
  FOR raio := 1 TO 20 DO
    CIRCLE(200, 100, raio * 10);
  READLN;
  CLOSEGRAPH;
END.

ELLIPSE - este procedimento permite que seja desenhada uma elipse com centro
nas coordenadas x, y ngulo inicial, ngulo final, raio da coordenada x
(horizontal) e raio da coordenada y (vertical). Para que seja desenhada uma
elipse completa, devemos passar como coordenadas de ngulo inicial 0 e 
ngulo final 360, onde o ngulo 0 representa as 3 horas e 90 as 12 horas.
Sua sintaxe:
ELLIPSE (<x>, <y> : INTEGER; <angini>, <angfinal> : WORD; < raiox>, <raioy>
: WORD);
Vamos a um exemplo:
PROGRAM teste_ellipse;
USES GRAPH;
VAR
  grafdrv, grafmod : INTEGER;
BEGIN
  grafdrv := DETECT;
  INITGRAPH (grafdrv,grafmod, );
  IF GRAPHRESULT <> GROK
    THEN
      HALT (1);
  ELLIPSE (30,50,0,360,30,50);
  ELLIPSE (30,50,0,360,50,30);
  ELLIPSE (300,100,0,180,50,30);
  ELLIPSE (400,100,0,180,50,30);
  ELLIPSE (500,100,0,180,50,30);
  ELLIPSE (100,100,0,180,10,20);
  ELLIPSE (150,100,0,180,10,20);
  ELLIPSE (100,100,0,360,10,05);
  ELLIPSE (150,100,0,360,10,05);
  ELLIPSE (125,1
