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
valornuma sequência binária, tendo estadígitosdígitos e onde será acrescentado um espaço a cada espaçosdí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; 
2. Faz-se Edit > Insert > Message Box; 
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; 
4. Para se verificar se a Message Box está como se pretende, faz-se Preview. 
5. Estando tudo como desejado, faz-se OK e o código aparece automaticamente no local onde o cursor foi posicionado no passo 1. 
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.