Uma maneira bastante prática de se tratar exceções no sistema, podendo até traduzir as mensagens que possivelmente apareceriam ao usuário, é utilizar o ApplicationEvents.
Este componente possui vários eventos que ocorrem em toda
a aplicação, fazendo com que o código fique centralizado, e seja automaticamente
utilizado por todo o programa. Veja abaixo um exemplo de como utiliza-lo para
identificar e traduzir as exceções do sistema.
Adicione ao formulário principal um ApplicationEvents, e no evento onException,
coloque o código:
Nota: Somente 1 componente é necessário, pois ele irá monitorar todas as units
e formulários da aplicação.
procedure TForm1.ApplicationEventsException(Sender: TObject; E: Exception);
var
mensagemerro : string;
p1, p2: integer;
begin
//violação de chave primária
if pos(upperCase('violation of primary or unique key constraint'), UpperCase(E.Message)) > 0 then
begin
beep;
showmessage('O valor digitado para o campo já existe no cadastro.');
Exit;
end;
//valor inválido para o campo
if pos(UpperCase('Input value'), UpperCase(E.Message)) <> 0 Then
begin
beep;
showmessage('Campo preenchido com valor inválido. Proceda a correção.');
Exit;
end;
//data inválida
if pos(UpperCase('is Not a valid date'), UpperCase(E.Message)) <> 0 Then
begin
beep;
showmessage('Data inválida, proceda a correção.');
Exit;
end;
//campo de preenchimento obrigatório - Required = True
if pos(upperCase('must have a value'), UpperCase(E.Message)) > 0 then
begin
beep;
p1:= Pos('''', E.Message);
mensagemerro:= E.Message;
delete(mensagemerro, p1, 1);
p2:= Pos('''',mensagemerro);
mensagemerro:= copy(E.Message, p1 + 1, p2 - p1);
ShowMessage('O campo [ '+ mensagemerro + ' ] é de preenchimento obrigatório.');
end;
//campo de preenchimento obrigatório - Not Null
if pos(upperCase('validation error for column'), UpperCase(E.Message)) > 0 then
begin
beep;
mensagemerro := Copy(E.Message, 29, pos(',', E.Message) - 29);
ShowMessage('O campo [ '+ mensagemerro + ' ] é de preenchimento obrigatório.');
end;
end;
Com esse código, quem programa utilizando DataSets (ClientDataSet, Table,
Query) e DataControls (DBEdit, DBComboBox, DBGrid), não precisará mais se preocupar
em validar os dados no botão Gravar ou nos eventos onExit, verificando se
um campo foi preenchido, ou se é uma data é válida. Basta configurar o campo
obrigatório
com a propriedade
Required = True. O próprio ApplicationEvents identifica que uma exceção foi
gerada pelo DataSet e então passa pelo procedimento que acabamos de criar,
traduzindo a mensagem!
Espero ter ajudado.
[]'s
Carlos
|