Ir para o conteúdo

PARTE VII - Hexadecimais, Binários e Numeração Romana. Message Box.

Apresentam-se nesta parte algumas breves noções introdutórias em questões mais avançadas do Pascal, algumas das quais tocam já procedimentos criados com o Delphi (Object Pascal). De entre os temas abordados, destaca-se:

  • Breve descrição dos Hexadecimais e dos Binários em Pascal e de algumas funções relacionadas;
  • Obter a mensagem exacta de um erro (variável Exception) numa Estrutura de Tentativa;
  • Como alterar o título da consola;

Note-se que esta Parte só tem conteúdos preliminares, e nada de muito avançado.

1. Breve introdução aos Hexadecimais e Binários

O Pascal, de origem, tem capacidade para aceitar a escrita de números inteiros sob a forma hexadecimal e binária. Estando fora do âmbito deste livro a explicação prolongada da representação numérica hexadecimal e binária, explica-se de seguida como introduzir, directamente em código, cada um deste tipo de representação. Considere-se, para tal, a variável numero, do tipo integer ou longint, e iremos gravar o valor 12.

  • Hexadecimal
numero := $C;
  • Binário
numero := %1100;

O IDE preparado na íntegra para funções e procedimentos de conversão destas representações é o Free Pascal. Declarando-se a unidade strutils (utilidades para strings), existe uma série de procedimentos e funções. Aqui serão representados tal como estão na unidade, excepto que os parâmetros foram traduzidos para português.

  • Converte um número inteiro valor numa sequência binária, tendo esta dígitos dígitos e onde será acrescentado um espaço a cada espaços dígitos. espaços é facultativo, e não deverá ser zero.
function IntToBin(valor : longint; dígitos : integer; espaços : integer) : string;
  • Converte um hexadecimal numa representação numérica dita normal.
function Hex2Dec(S : string) : longint;

Outras funções e procedimentos existem, mas estão fora do âmbito do presente livro.

2. Estrutura de tentativa – mensagem exacta do erro

Quando abordada a Estrutura de Tentativa, recorreu-se logo à adição de uma variável de excepção, exception, mas com a qual nada se fez. Ora, qual a vantagem de a declarar? Imagine-se que se pretende testar um programa complexo e com contornos que possam criar possíveis situações de instabilidade, e o programador pretende saber qual o erro então ocorrido para poder, se possível, corrigi-lo. Contudo, o programa vai abaixo, e a mensagem de erro que a consola lança nem chega a ser vista de tão rápido o processo de erro e encerramento é. Ora, a variável do tipo exception guarda em si o erro ocorrido, erro este que pode ser traduzido por uma mensagem (message). Veja-se, então, o exemplo simples da divisão onde pode ocorrer o erro da divisão por zero. Tradicionalmente, até ao momento, far-se-ia tão-somente o seguinte:

try
   resultado := valor1 / valor2;
except
      ON e:exception do begin
         writeln('Ocorreu um erro!');
      end;
end;

Podia ser adicionada a mensagem “Divisão por zero”, mas admitamos hipoteticamente que não sabemos o erro que poderá ocorrer. Então, vamos introduzir o código que nos permite descobrir o erro que ocorre, caso ocorra:

readln(valor1, valor2);
try
   resultado := valor1 / valor2;
except
      ON e:exception do begin
         writeln('Ocorreu um erro!');
         writeln('O erro foi o seguinte: ',e.message);
      end;
end;

Ou seja, lembrando o paradigma POO, obtém-se a propriedade message da variável e, do tipo exception. A mensagem é debitada em inglês. Veja-se um exemplo de output deste excerto de programa, no caso do código anterior:

35
0
Ocorreu um erro!
O erro foi o seguinte: Division by zero

3. Título da Consola

O título da consola, em Windows, por pré-definição é o directório do executável. Por exemplo:

C:Dev-Pasexemplo.exe

Claro que o programador gostaria de fazer o seu programa que apresentasse um título na janela da Consola, sem ser uma linha de texto cheia de barras e sem sentido aparente. Neste caso, um bom título seria:

Programa de Exemplo

É possível alterar o título da consola com um procedimento pertencente à unidade windows:

program exemplo;
uses windows;

begin
     SetConsoleTitle('Programa de Exemplo');
     // programa
end;

4. Message Box

Uma Message Box em Delphi cria-se através de um procedimento que tem quatro parâmetros, existindo dezenas de combinações possíveis. Existem valores pré-definidos, constantes, que, somados, resultam no resultado pretendido. Existem constantes para os botões, o ícone, o botão focado por defeito, etc. Contudo, as Message Boxes serão aqui programas de forma segura com o auxílio do Editor do Dev-Pascal.

4.1. Criação auxiliada no Dev-Pascal 1.9.2

O Dev-Pascal possui uma ferramenta que auxilia a criação de uma Message Box, que permite, inclusive, a sua pré-visualização antes de ser aplicada. Por passos:

1. Coloca-se o cursor na zona do código onde se pretende que apareça uma Message Box;
Message Box - passo 1

2. Faz-se Edit > Insert > Message Box;
Message Box - passo 2

3. Aparece o Editor. Introduz-se o título pretendido, o texto, selecciona-se a sequência de botões desejados, o ícone e o botão que é focado;
Message Box - passo 3

4. Para se verificar se a Message Box está como se pretende, faz-se Preview.
Message Box - passo 4

5. Estando tudo como desejado, faz-se OK e o código aparece automaticamente no local onde o cursor foi posicionado no passo 1.
Message Box - passo 5

Neste caso, foi feita apenas uma Message Box modelo para que se pudesse visualizar o código gerado pelo Editor e verificar a posição dos diferentes argumentos. No caso do programa em questão, adaptar-se-ia do seguinte modo:

program Untitled1;
uses crt, windows;
var nome : string;
    msg : string;
    mensagem : pchar;

begin
     write('Introduza o seu nome: '); readln(nome);
     msg := 'Olá, ' + nome + '!'#0;
     mensagem := @msg[1];
     MessageBox(0, mensagem , 'Mensagem de boas-vindas' , 0 + MB_ICONASTERISK);
     readln; // pausa
end.

Está fora do âmbito da presente Parte a explicação da conversão de uma string para um pchar. Fica apenas registado desta forma exemplificativa como o fazer, pois os argumentos de texto da Message Box são do tipo pchar e não string.

5. Numeração Romana

Declarando a unidade strings ou a strutils, dependendo do IDE, é possível converter um número inteiro longo (maior que 1 milhão) para numeração romana, e vice-versa. Nenhum erro ocorre, pois são procedimentos seguros.

  • Converter de Inteiro (longint) para Numeração Romana (string)
IntToRoman(inteiro, romano);
  • Converter de Numeração Romana (string) para Inteiro (longint)
RomanToInt(romano, inteiro);

Propostas de Exercícios 13. Crie um conversor de numeração romana, enquadrado numa Estrutura de Tentativa, em que, caso um erro ocorra, seja mostrado o erro numa Message Box, em que o título é “Ocorreu um erro” e o texto é tão-somente a mensagem do erro. Normas: Limite de número de linhas (excluindo comentários e linhas em branco): 75 linhas.