Fórum Procedimento TrataErros qd existe erro não continua o código #296260

20/09/2005

0

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.

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

Porty

Responder

Posts

21/09/2005

Massuda

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...
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);
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).


Responder

Gostei + 0

17/07/2008

Powerlog Tecnologia

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 ...


Responder

Gostei + 0

17/07/2008

Powerlog Tecnologia

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...

   
    fSplash.lblMensagem.caption := ´Escolha a licenciada: ´;
    fSplash.Update;
    fSplash.Height := 410;
    repeat application.ProcessMessages;
    until gCodLic > 0;


Valeu !


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar