Tratamento de erros
As mensagens de erro emitidas pelo ObjectPascal, na maioria das vezes são em inglês. O que para os programadores e usuários mais exigentes, não pode passar assim e além do que, sempre tem aquele usuário que acha que "apagar o root(rut)", é matar a mulher do chefe [:>}. Para esses programadores e usuários, aí vai uma solução.
A ideía
Existe uma série de propriedades e métodos, muitos dos quais não explorados pelos programadores, da classe TApplication, que pode ser acessada através da variável global Application. E um desses métodos, permite a manipulação de mensagens de erro, portando associaremos um procedimento de apresentação de mensagens a este evento, que é OnException.
Esta associação, ou qualquer outra, para configurar ou mudar o comportamento do TApplication, deve ser feita, preferencialmente, no evento OnCreate do formulário principal.
A implementação
Selecione o formulário principal e no Object Inspector, na aba Events, selecione OnCreate e efetuando um duplo-click, algo semelhante ao código abaixo aparecerá.
procedure TForm1.Form1Create(Sender: TObject);
begin
end;
Insira, entre os comandos Begin..End, o código para associação do evento.
// Utilize o OnCreate do form principal para configurar Application.
// ** Designar a procedure de tratamento de erros
Application.OnException := ShowException;
O evento OnException da Application esta sendo associado ao método ShowException. Este método por ter qualquer nome, deste que os parâmetros sejam como abaixo. Para uma perfeita compilação, deve-se declarar este procedimento (em negrito) na classe de definição do formulário principal.
TForm1 = class(TForm)
// definições do form feitos em tempo de design
private
// definições privativas do form
// Eu costumo colocar as definições para TApplication aqui,
// mas pode ser colocada em qq outra seções da definição
// da classe
procedure ShowException(Sender: TObject; E: Exception);
protected
// definições protegidas do form
public
// definições publicas do form
end;
Uma vez declarado o procedimento, vamos a implementação. Em qualquer lugar da implemention, insira o código abaixo.
procedure TForm1.ShowException(Sender: TObject; E: Exception);
var cValue: string;
begin
// Todo e qq erro que ocorrer no aplicativo, passará por aqui
if E is EConvertError then // Erros de conversão
begin
// O truque é testar trechos fixos das mensagems
if pos('not a valid date', EConvertError(E).Message) <> 0 then
begin
// Aqui eu verifiquei que da 1a. posição até o primeiro espaço, esta o dado digitado.
// Isto muda de msg para msg
cValue := copy(EConvertError(E).Message, 1, pos(#32, EConvertError(E).Message));
ShowMessage('A data '+ cValue +' que foi informada, não é válida. Favor informa-la novamente');
// Devolve o foco para a entrada que esta com erro
TWinControl(Sender).SetFocus;
end else
// Tratamento padrão
Application.ShowException(E);
end else if E is EDatabaseError then // Erros de DB
begin
if pos('name missing', EDatabaseError(E).Message) <> 0 then
begin
// Aqui eu verifiquei que da 1a. posição até os dois pontos (:), esta o nome do componente.
// Isto muda de msg para msg
cValue := copy(EDatabaseError(E).Message, 1, pos(':', EDatabaseError(E).Message)-1);
ShowMessage('O componente '+ cValue + ', esta com o nomede banco de dados errado.'+#13+
'O sistema será encerrado ao acionar o botão OK');
Application.Terminate; // Terminou porque o erro é grave
end else
// Tratamento padrão
Application.ShowException(E);
end else
// Tratamento padrão
Application.ShowException(E);
end;
Monte os blocos IF E is ... End para cada tipo de mensagem a ser processada e dentro de cada bloco, teste trechos da mensagem original e se for o caso apresente a nova mensagem usando ShowMessage ou outro que lhe for mais apropriado. Não esqueça de chamar a rotina padrão de tratamento de mensagens do ObjectPascal, para aquelas que você não tratou, senão o erro será "engolido" pelo sistema.