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 estadígitos
dí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.