Procedimento TrataErros qd existe erro não continua o código
Estou a ter um programa na a fase do login e conexao da BD, pois estou colocando ao Criar o form Principal todo o código, mas qd existe algum erro nesse procedimento não continua o código. Exemplo estou a mostrar o splash e no meio conecto a bd se dar erro ao conectar a db não continua o código pois devia esconder o spash...etc. A conclusão que estou a chegar é que se tiver um procedimento generico para tratar erros não posso continuar o código, mas se usar só o try .. expect showmessage(´´)end. mostrava a mensagem de erro e continuava o código mas se usa-se
try .. expect showmessage(´´); exit; end. parava.
try .. expect showmessage(´´); exit; end. parava.
procedure TFrPrincipal.FormCreate(Sender: TObject); var NotifyIconData : TNotifyIconData; i : word; le : string; begin Application.OnException:=TrataErros; Screen.OnActiveControlChange := controlChange; dirlocal := Application.ExeName; FrSplash := TFrSplash.Create(Self); FrSplash.Show; FrSplash.Update; for i:=1 to frsplash.pbar.Max do begin frsplash.pbar.Position:=i; if i = 25 then abreDb; pausa(25); end; if FrSplash <> nil then FreeAndNil(FrSplash); Try Application.CreateForm(Tfrlogin, frlogin); frlogin.showModal; Finally frlogin.free; End; if useractual= ´sairaplicaao´ then begin frprincipal.Close; application.Terminate; end else begin //Controla o Trayicon Application.ShowMainForm := False; with NotifyIconData do begin cbSize := sizeof(TNotifyIconData); Wnd := Self.Handle; uId := 0; uCallBackMessage := WM_TRAYICON; uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; hIcon := Application.Icon.Handle; szTip := ´ActiveWin´; end; Shell_NotifyIcon(NIM_ADD,@NotifyIconData); //fim controlo trayicon FrPrincipal.WindowState := wsMaximized; anowork := 2005; statusbar1.Panels[4].Text := ´Data: ´ + formatdatetime(´dddd ", " dd " de " mmmmm " de " yyyy´, now); statusbar1.Panels[5].Text := ´Hora: ´ + formatdatetime(´ hh:mm´,now); useractual := ´JOAOP´; if fileexists(ibqueryloginfundo.AsString) then image1.Picture.LoadFromFile(ibqueryloginfundo.AsString); MenuUser(sender); MontaTree(nil, 0); edatalho.Text:=´´; FrPrincipal.Show; end; ibquerylogin.Close; end; procedure TFrPrincipal.Trataerros(Sender: TObject; E: Exception); var mensagem: string; Pos1, Pos2: integer; begin If Pos(UpperCase(´is not a valid date´), UpperCase(E.Message)) <> 0 then showmessage(´Data inválida, proceda a correção.´) else if Pos(UpperCase(´must have a value´), UpperCase(E.Message)) <> 0 then begin Pos1:=Pos(´´´´, E.Message); mensagem:=E.Message; Delete(mensagem, Pos1, 1); Pos2:=Pos(´´´´, mensagem); mensagem:=copy(E.Message, Pos1 + 1, Pos2 - Pos1); showmessage(´É obrigatório o preenchimento do campo ´+ mensagem + ´.´); end else If Pos(UpperCase(´key violation´), UpperCase(E.Message)) <> 0 then showmessage(´Houve violação de Chave. Registro já incluido.´) else If Pos(UpperCase(´Input value´), UpperCase(E.Message)) <> 0 then showmessage(´Campo preenchido com valor não válido. Proceda a correção.´) else If Pos(UpperCase(´is not a valid time´), UpperCase(E.Message)) <> 0 then showmessage(´Hora inválida, proceda a correção.´) else If Pos(UpperCase(´master has detail records´), UpperCase(E.Message)) <> 0 then ShowMessage(´Proibida a Exclusão e Modificação deste Registro, pois ele faz Referência a Outro(s) Registro(s)!´) else If Pos(UpperCase(´field value required´), UpperCase(E.Message)) <> 0 then Begin Pos1:=Pos(´:´,E.Message); Delete(Mensagem,Pos1,1); Mensagem:=copy(E.Message,Pos1+2,30); showmessage(´É obrigatório o preenchimento do campo "´+ mensagem + ´".´); End; If Pos(UpperCase(´RECORD LOCKED BY ANOTHER USER.´), UpperCase(E.Message)) <> 0 then ShowMessage(´O Registro está sendo Utilizado por Outro Usuário da Rede. Cancele a Operação e Aguarde a Liberação do Mesmo!´) else showmessage(´Ocorreu o seguinte erro: ´+UpperCase(E.Message)); end;
Porty
Curtidas 0
Respostas
Massuda
20/09/2005
O que você está fazendo não funciona como você espera porque Application.OnException é a última chance que seu programa tem para capturar/tratar uma exceção, de modo que dentro desse evento não tem como retornar para o ´ponto´ onde a exceção foi gerada.
Usando seu exemplo, isso funciona mais ou menos assim...Imagine que ocorra uma exceção em AbreDb...[list:8741bf9375][*:8741bf9375]assumindo que não existe try...except/try...finally dentro de AbreDb, a exceção irá abortar AbreDb e irá checar se TFrPrincipal.FormCreate tem algum tratamento de exceção[*:8741bf9375]como no caso não existe tal tratamento, TFrPrincipal.FormCreate será abortada e irá checar se Application.OnException tem algum tratamento de exceção[*:8741bf9375]no caso existe tal tratamento, mas não tem como voltar para o ponto onde a exceção foi gerada[/list:u:8741bf9375]
Complicando mais... se Application.OnException fosse nil, o runtime do Delphi tem uma rotina padrão de tratamento de exceções. Mas existem instantes (no início de programa e no final do programa) que mesmo essa rotina padrão não está disponível. Nesse caso, é o Windows informa que houve uma exceção (identificada como 0x0EEDFADE).
Usando seu exemplo, isso funciona mais ou menos assim...
procedure TFrPrincipal.FormCreate(Sender: TObject); ... begin Application.OnException:=TrataErros; Screen.OnActiveControlChange := controlChange; dirlocal := Application.ExeName; FrSplash := TFrSplash.Create(Self); ... for i:=1 to frsplash.pbar.Max do begin frsplash.pbar.Position:=i; if i = 25 then abreDb; pausa(25); end; if FrSplash <> nil then FreeAndNil(FrSplash);
Complicando mais... se Application.OnException fosse nil, o runtime do Delphi tem uma rotina padrão de tratamento de exceções. Mas existem instantes (no início de programa e no final do programa) que mesmo essa rotina padrão não está disponível. Nesse caso, é o Windows informa que houve uma exceção (identificada como 0x0EEDFADE).
GOSTEI 0
Powerlog Tecnologia
20/09/2005
Ressucitando o assunto ´splash´...
Eu tenho o form splash funcionando belezinha. Se eu tenho [b:f664be7021]uma[/b:f664be7021] empresa licenciada para usar o sistema, eu carrego a chave primária dela, fecho o splash normalmente e a vida continua...
[b:f664be7021]Só que [/b:f664be7021] , CASO eu tenha mais de uma empresa licenciada, preciso selecionar com qual delas vou trabalhar. Então aumento o height da tela, mostro o grid das empresas e teria que aguardar um duplo clique para selecionar. Mas o sistema não espera até que eu faça isso, ele ´segue a vida´ mesmo com a tela de splash aberta e sem ter selecionado a empresa.
Dúvida: qual o comando para a aplicação ´parar´ e aguardar a próxima interação ?
Valeu galera ...
Eu tenho o form splash funcionando belezinha. Se eu tenho [b:f664be7021]uma[/b:f664be7021] empresa licenciada para usar o sistema, eu carrego a chave primária dela, fecho o splash normalmente e a vida continua...
[b:f664be7021]Só que [/b:f664be7021] , CASO eu tenha mais de uma empresa licenciada, preciso selecionar com qual delas vou trabalhar. Então aumento o height da tela, mostro o grid das empresas e teria que aguardar um duplo clique para selecionar. Mas o sistema não espera até que eu faça isso, ele ´segue a vida´ mesmo com a tela de splash aberta e sem ter selecionado a empresa.
Dúvida: qual o comando para a aplicação ´parar´ e aguardar a próxima interação ?
Valeu galera ...
GOSTEI 0
Powerlog Tecnologia
20/09/2005
Galera, procurei com outras palavras e achei aqui no fórum ! Vocês são D+, hehe
http://forum.devmedia.com.br/viewtopic.php?t=94671
Fiz um ´repeat - until´ e deu certo...
Valeu !
http://forum.devmedia.com.br/viewtopic.php?t=94671
Fiz um ´repeat - until´ e deu certo...
fSplash.lblMensagem.caption := ´Escolha a licenciada: ´; fSplash.Update; fSplash.Height := 410; repeat application.ProcessMessages; until gCodLic > 0;
Valeu !
GOSTEI 0