| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
Hemelen Novato


Registrado: Segunda-Feira, 8 de Julho de 2013 Mensagens: 34
|
Enviada: Seg Dez 02, 2013 3:07 pm Assunto: Tratamento de erro |
|
|
Olá, estou tentando fazer o seguinte tratamento de erro para exclusão de registros com ligação de chave estrangeira, para que não apareça ao usuário o erro do próprio delphi ao tentar excluir um registro presente em outra tabela. Para isso utilizei o ApplicationEvents e o seguinte codigo,mesmo assim não está sendo tratado o erro. O que pode ser feito?
* Obs: utilizo firebird e Ibdataset
| Código: | procedure Tfrmcadcliente.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
var
mensagemerro : String;
P1, P2 : Integer;
begin
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 nesta tabela.');
End;
if pos(UpperCase('attempt to store duplicate value'), UpperCase(e.Message)) > 0 then
Begin
beep;
ShowMessage('Já existe cadastrado com este nome');
End;
if pos(UpperCase('violation of foreign key constraint'), UpperCase(e.Message)) > 0 then
Begin
beep;
ShowMessage('Não é possível excluir este Cliente');
End;
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;
end; |
|
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Dez 02, 2013 4:09 pm Assunto: |
|
|
Boa tarde,
Não sei se vai funcionar, mas tente executar o método CancelDispatch de TApplicationEvents após o tratamento do erro:
| Código: | | ApplicationEvents1.CancelDispatch; |
edit: estava faltando um h no final de CancelDispatch
Espero que ajude.
Editado pela última vez por imex em Ter Mar 21, 2023 4:43 pm, num total de 2 vezes |
|
| Voltar ao Topo |
|
 |
Hemelen Novato


Registrado: Segunda-Feira, 8 de Julho de 2013 Mensagens: 34
|
Enviada: Seg Dez 02, 2013 4:14 pm Assunto: |
|
|
| imex escreveu: | Boa tarde,
Não sei se vai funcionar, mas tente executar o método CancelDispatch de TApplicationEvents após o tratamento do erro:
| Código: | | ApplicationEvents1.CancelDispatc; |
Espero que ajude.
|
É não funciona,sequer cai no tratamento de erro.Já da o erro do delphi direto |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Dez 02, 2013 4:36 pm Assunto: |
|
|
Você está fazendo o teste pelo Exe ou executando a sua aplicação com debug (F9)?
Se estiver executando com debug, o que acontece se você clicar no botão "Continue" no form em que a mensagem do Delphi é exibida? |
|
| Voltar ao Topo |
|
 |
Hemelen Novato


Registrado: Segunda-Feira, 8 de Julho de 2013 Mensagens: 34
|
Enviada: Seg Dez 02, 2013 4:46 pm Assunto: |
|
|
| imex escreveu: | Você está fazendo o teste pelo Exe ou executando a sua aplicação com debug (F9)?
Se estiver executando com debug, o que acontece se você clicar no botão "Continue" no form em que a mensagem do Delphi é exibida? |
Olha como executavel da o seguinte erro :'violation of FOREIGN KEY constrait. Foreign key references presents for the record
E com debug também da o mesmo erro do delphi primeiro e se eu continuo apertando F9 cai na mensagem if pos(UpperCase('violation of foreign key constraint'), UpperCase(e.Message)) > 0 then
Begin
beep;
ShowMessage('Não é possível excluir este Cliente');
mas isso só depois de aparecer o erro do delphi |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Dez 02, 2013 5:01 pm Assunto: |
|
|
Você acrescentou o código que sugeri?
| Código: | if pos(UpperCase('violation of foreign key constraint'), UpperCase(e.Message)) > 0 then
Begin
beep;
ShowMessage('Não é possível excluir este Cliente');
ApplicationEvents1.CancelDispatch;
End; |
O Delphi exibe a mensagem por padrão ao executar com debug, mas acho que se você acrescentar o CancelDispatch não será exibida nenhuma mensagem após a sua (ShowMessage), seja com debug ou pelo Exe.
Espero que ajude. |
|
| Voltar ao Topo |
|
 |
Hemelen Novato


Registrado: Segunda-Feira, 8 de Julho de 2013 Mensagens: 34
|
Enviada: Seg Dez 02, 2013 5:06 pm Assunto: |
|
|
| imex escreveu: | Você acrescentou o código que sugeri?
| Código: | if pos(UpperCase('violation of foreign key constraint'), UpperCase(e.Message)) > 0 then
Begin
beep;
ShowMessage('Não é possível excluir este Cliente');
ApplicationEvents1.CancelDispatch;
End; |
O Delphi exibe a mensagem por padrão ao executar com debug, mas acho que se você acrescentar o CancelDispatch não será exibida nenhuma mensagem após a sua (ShowMessage), seja com debug ou pelo Exe.
Espero que ajude. |
No debug ou não , continua mostrando o a mensagem própria do Delphi,mesmo com o código que você passou |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Dez 02, 2013 5:12 pm Assunto: |
|
|
| Confirma uma coisa... a sua mensagem está sendo exibida? |
|
| Voltar ao Topo |
|
 |
Hemelen Novato


Registrado: Segunda-Feira, 8 de Julho de 2013 Mensagens: 34
|
Enviada: Seg Dez 02, 2013 5:16 pm Assunto: |
|
|
| imex escreveu: | | Confirma uma coisa... a sua mensagem está sendo exibida? |
Somente em modo debug, porque primeiro aparece o erro do delphi e se continuo apertando f8 o tratamento de erro mostra a mensagem. Do contrário, em modo de execução normal, ao tentar excluir já da erro de cara e para a aplicação |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Dez 02, 2013 5:33 pm Assunto: |
|
|
Não tenho experiência com o TApplicationEvents, mas não estou entendendo porque com debug a sua mensagem é exibida ao continuar a execução, e pelo Exe não é exibida...
Só pra cofirmar, o título do Form em que o Delphi exibe a mensagem ao executar com debug é "Debugger Exception Notification" ou algo semelhante? |
|
| Voltar ao Topo |
|
 |
Hemelen Novato


Registrado: Segunda-Feira, 8 de Julho de 2013 Mensagens: 34
|
Enviada: Seg Dez 02, 2013 5:45 pm Assunto: |
|
|
| imex escreveu: | Não tenho experiência com o TApplicationEvents, mas não estou entendendo porque com debug a sua mensagem é exibida ao continuar a execução, e pelo Exe não é exibida...
Só pra cofirmar, o título do Form em que o Delphi exibe a mensagem ao executar com debug é "Debugger Exception Notification" ou algo semelhante? |
Sim, a mensagem do próprio delphi, indicando o erro esta escrito exatamente isso e com o erro 'violation of FOREIGN KEY'[/u] |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Dez 02, 2013 6:42 pm Assunto: |
|
|
Eu na verdade tinha perguntado sobre o título do form / janela onde é exibda a mensagem ao executar com debug... então pergunto novamente:
1) O título do form / janela onde é exibda a mensagem é "Debugger Exception Notification" ou semelhante? Ela possui os botões "Break" e "Continue"?
2) Você disse que a sua mensagem é exibida se você continua a execução. Depois que você fecha o form com a sua mensagem é exibida alguma outra mensagem? Ou o cursor volta para o seu Form? |
|
| Voltar ao Topo |
|
 |
Hemelen Novato


Registrado: Segunda-Feira, 8 de Julho de 2013 Mensagens: 34
|
Enviada: Seg Dez 02, 2013 7:43 pm Assunto: |
|
|
| imex escreveu: | Eu na verdade tinha perguntado sobre o título do form / janela onde é exibda a mensagem ao executar com debug... então pergunto novamente:
1) O título do form / janela onde é exibda a mensagem é "Debugger Exception Notification" ou semelhante? Ela possui os botões "Break" e "Continue"?
2) Você disse que a sua mensagem é exibida se você continua a execução. Depois que você fecha o form com a sua mensagem é exibida alguma outra mensagem? Ou o cursor volta para o seu Form? |
Sim é Debugger Exception Notification" e possui os botões ok e help.
Depois que eu fecho o form com a minha mensagem a aplicação para d rodar, porque neste momento já deu o erro do próprio delphi .. Ai lá em cima fica Project1[STOPPED] |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Dez 03, 2013 9:23 am Assunto: |
|
|
A janela com o título "Debugger Exception Notification" não é exibida para o usuário.
Quando essa janela for exibida clique em "OK" e depois pressione F9 novamente para continuar a execução.
O que acontecer depois é o que o usuário vai ver. Se o erro for tratado corretamente será exibida a sua mensagem, senão será exiida a mesma mensagem da janela "Debugger Exception Notification", mas agora com o nome do seu projeto no título da janela.
Experimente fazer um novo teste clicando em "OK" e F9 para ver o que acontece exatamente. |
|
| Voltar ao Topo |
|
 |
marcocunhasilva Profissional

Registrado: Segunda-Feira, 21 de Agosto de 2006 Mensagens: 740 Localização: Porto Alegre
|
Enviada: Ter Dez 03, 2013 12:06 pm Assunto: |
|
|
Olá, Hemelen, tudo bem?
Veja se o seu componente ApplicationEvents encontra-se na unidade principal da aplicação (normalmente é a unidade do formulário principal). Caso sua unidade principal seja a do DataModule, coloque o componente lá e, consequentemente, as mensagens aparecerão. Já tive este problema e resolvi colocando o ApplicationEvents no DataModule, pois ele era a unidade principal do meu sistema.
Espero ter ajudado...
T++ |
|
| Voltar ao Topo |
|
 |
|