
Captulo 34 - objects

  OBJECTS -  uma estrutura de dados semelhante  estrutura de um registro
e deve ser definida na rea de declarao de tipos (TYPE), podendo ter, 
alm dos campos normalmente usados em um registro, tambm o cabelho de
algumas rotinas (PROCEDURES ou FUNCTIONS). Estas rotinas devem ser descritas
dentro do programa. Devemos atentar para o fato de que sendo uma estrutura
similar  de um registro, para nos referirmos a cada um de seus campos 
ou suas rotinas, devemos declarar uma varivel que tenha o mesmo tipo do 
objeto declarado. Esta declarao s est disponvel a partir da verso 
5.5 do Turbo Pascal. Sua sintaxe:
OBJECTS 
  identificador = OBJECT [(outro_objeto)]
  [campos : tipo;]
  [constructor nomerot];
  [destructor nomerot];
  [PROCEDURE identificador;[virtual;]]
  [PROCEDURE identificador(parmetro : tipo);]
  [FUNCTION identificador : tipo;]
END;  

Vejamos um exemplo:
PROGRAM teste_object;
USES CRT;
TYPE
  meuobj = OBJECT
    x, y : BYTE;
    PROCEDURE limpatela(x1, y1 : BYTE);
  END;
  p = meuobj;
VAR
  p2 : p;
  c : BYTE;
  m : meuobj;
PROCEDURE meuobj.limpatela;
VAR
   i : BYTE;
BEGIN
  GOTOXY (x1, y1);
  CLREOL;
  FOR i := y1 + 1 TO 25 DO
    BEGIN
      GOTOXY (1,i);
      CLREOL;
    END;
END;  
         {programa principal}
BEGIN
  WITH m DO
  BEGIN
    y := 9;
    limpatela(1,1);
    x := 2;
    FOR c := 1 TO 24 DO
      WRITELN (-X-X-X-X-X-X-X-X-X-X-X-X-X-X);
      limpatela (10,10);
  END;
END.

CONSTRUCTOR -  uma declarao de um mtodo especial que permite a iniciali-
zao de um objeto no endereo virtual de cdigos e quando da linkagem 
do programa, deve ser declarado em conjunto com um objeto. 
PROGRAM teste_constructor;
USES CRT;
TYPE
  meuobj = OBJECT
    x,y : BYTE;
  PROCEDURE limpatela (x1, y1 : BYTE);
  CONSTRUCTOR incio;
END;
  p = meuobj;
VAR
  p2 :p;
  c : BYTE;
  m : meuobj;
  CONSTRUCTOR meuobj.incio;
BEGIN
  x := 10;
  y := 10;
END;  
PROCEDURE meuboj.limpatela;
VAR
  i : BYTE;
BEGIN
  GOTOXY (x1,y1);
  CLREOL;
  FOR i := y1 + 1 TO 25 DO
    BEGIN
      GOTOXY (1,i);
      CLREOL;
    END;
END;  
        {programa principal}
BEGIN
  WITH m DO
  BEGIN
    y := 9;
    limpatela (1,1);
    x := 2;
    FOR c := 1 TO 24 DO
      WRITELN (x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-);
      incio;
      limpatela (10,10);
    END;
END.  

DESTRUCTOR - esta declarao permite que se libere a memria reservada 
para um objeto e  declarado em uma estrutura OBJECT. 
PROGRAM teste_destructor;
USES CRT;
TYPE
  meuobj = OBJECT
    x, y : BYTE;
    PROCEDURE limpatela(x1, y1 : BYTE);
    CONSTRUCTOR incio;
    DESTRUCTOR  fim; 
  END;
  p = meuobj;
VAR
  p2 : p;
  c : BYTE;
  m : meuobj;
CONSTRUCTOR meuobj.incio;
BEGIN
  x := 10;
  y := 10;
END;  
DESTRCTOR meuobj.fim;
BEGIN
  READLN;
END;
PROCEDURE meuobj.limpatela;
VAR
  i : BYTE;
BEGIN  
  GOTOXY (x1,y1);
  CLREOL;
  FOR i := y1 + 1 TO 25 DO
    BEGIN
      GOTOXY (1,i);
      CLREOL;
    END;
END;
        {programa principal}
BEGIN
  WITH m DO
  BEGIN
    y := 9;
    limpatela (1,1);
    x := 2;
    FOR c := 1 TO 24 DO
      WRITELN (X-X-X-X-X-X-X-X-X-X-X-X-X-X-);
    incio;
    limpatela (10,10);
    fim;
  END;
END.

FAIL - este  um procedimento que s pode ser ativado na rotina CONSTRUCT,
quando ocorrer uma falha na alocao da memria. Sua sintaxe:
FAIL;
Exemplo:
PROGRAM teste_fail
{$F+}
FUNCTION heapfunc (tamanho : WORD) : INTEGER;
BEGIN
  heapfunc := 1;
END;  
{$F-}
TYPE
  charpoint = char;
  strgrande = OBJECT
    len : WORD;
    txt : charpoint;
    CONSTRUCTOR init(tamanho : WORD; contedo : charpoint);
    DESTRUCTOR nada;     
  END;
CONSTRUCTOR strgrande.init(tamanho : WORD; contedo : charpoint);
BEGIN
  len := tamanho;
  GETMEM (txt,tamanho);
  IF txt = NIL THEN
    FAIL;
  MOVE (conted,txt,tamanho);
END;
DESTRUCTOR strgrande.nada;
BEGIN
  FREEMEM (txt,len);
END;  
VAR
  ch : charpoint;
  st : strgrande;
BEGIN
  st.init(65000,ch);
  st.nada;
END.

  Cabe ressaltar que este tipo de estrutura por OBJETOS, vem se tornando a
tendncia entre os mtodos mais avanados de programao.  chamado de 
OOP (Objects Oriented Program) programao orientada para objeto. torna-se
um pouco difcil para um programador que j se acostumou  programao con-
vencional, trabalhar e entender os conceitos de OOP, em resumo, o Objeto se 
torna uma estrutura dinmica que s passa a ser utilizada quando realmente
necessria.
