|
Usuários |
|
74 Usuários Online
|
|
[Artigos]
Componente Application Events |
Publicado por rboaro : Quinta, Março 08, 2012 - 08:18 GMT-3 (1080 leituras)
4 Comentários Enviar para um amigo Versão para impressão
|
Saudações, caros Delphianos! Neste artigo vamos falar um pouco sobre algumas funcionalidades do componente Application Events.
Primeiramente, este componente é não-visual e nativo desde a versão 5 do Delphi, onde podemos encontrá-lo na paleta Additional. Conforme a figura abaixo

Sua principal função é interceptar e/ou concentrar as ocorrências de determinados eventos da aplicação em um único evento, um evento global. Iremos abordar dois eventos deste componente: onIdle e onException.
O primeiro evento (onIdle) atua como se fosse um Timer interceptador, cujo objetivo é, a todo momento, verificar determinado estado da aplicação a fim de que alguma ação seja executada.
Para exemplificar melhor este conceito, vamos ver um exemplo bem prático, onde o evento onIdle serve para verificar o estado dos botões de nossa tela a todo instante. Quando nos referimos ao estado dos botões, significa que iremos verificar se os mesmos devem ser habilitados ou não.
Crie uma nova aplicação, clicando em File → New → VCL Forms Application – Delphi. Os componentes que iremos utilizar estão listados na tabela abaixo:
Componente Nome Valor
ApplicationEvents ApplicationEvents1
Edit edtVal1
Edit edtVal2
Button btnDivisao Divisão
A interface ficará mais ou menos assim:

Agora que já criamos nossa tela, vamos codificar o evento onClick de nosso botão btnDivisao, como segue:
procedure TForm1.btnDivisaoClick(Sender: TObject);
var
fltVal1, fltVal2, fltVal3: real;
begin
fltVal1 := StrToFloat(edtVal1.Text);
fltVal2 := StrToFloat(edtVal2.Text);
fltVal3 := fltVal1/fltVal2;
ShowMessage('O resultado é: ' + FloatToStr(fltVal3));
end;
Apenas fizemos uma conversão dos valores dos edits, para posteriormente dividirmos um pelo outro, e assim, apresentarmos o resultado na tela.
Você deve estar se perguntando: E o que isso tem a ver com o evento onIdle do ApplicationEvents? Pois bem, agora sim vamos ver sua utilidade...
No evento onIdle do componente ApplicationEvents, implemente a codificação abaixo:
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
btnDivisao.Enabled := (edtVal1.Text <> '') and (edtVal2.Text <> '');
end;
Neste caso, habilitamos o botão btnDivisao somente se os dois campos estiverem preenchidos. Repare que só implementamos o evento onIdle do componente, sem a necessidade de replicarmos ou chamarmos diversas vezes esta mesma codificação sempre que quisermos executar esta ação, pois geralmente, teríamos que criar um método com esta verificação e chamá-lo, por exemplo, no onShow do form, para que o mesmo já aparecesse desabilitado e também no evento onExit de cada edit para que o botão fosse habilitado ou não, de acordo com o preenchimento dos campos.
Execute a aplicação e verifique o resultado!
Nota: Experimente colocar um breakpoint no evento onIdle e você verá que a todo e qualquer momento o mesmo é executado.
Bom, vamos ver agora como o evento onException funciona.
Imagine que você tenha uma aplicação com diversos forms/telas, e, desta forma, há a necessidade de se tratar as exceções que possivelmente venham a ocorrer em cada uma destas telas. Tendo isto em mente, o que costumamos ver é a criação de uma classe exclusiva para o tratamento destas exceções, onde, a cada ocorrência de erro em nossa aplicação, passamos o mesmo para tal classe a fim de que ela possa verificar e tratar devidamente nossa exceção.
Agora imagine que o evento onException do componente Application Events tem essa funcionalidade e mais, você concentra o tratamento das exceções de toda a aplicação neste evento sem a necessidade de “chamar sua classe” a cada possibilidade de erro nas diversas passagens de sua codificação. Achou interessante? Então vamos ver um exemplo!
Nota: É importante ressaltar que nosso objetivo é apenas demonstrar uma outra forma de tratarmos exceções em nossa aplicação, sem julgarmos essa ou aquela forma de utilização e manipulação das mesmas.
Na mesma aplicação que criamos para exemplificar o evento onIdle, crie mais dois botões de acordo com a tabela abaixo:
Componente Nome Valor
Button btnConversao Conversão
Button btnErro Erro
A interface agora ficará desta forma:

Estamos reaproveitando a aplicação feita pois, como precisamos forçar exceções para demonstrar como o componente manipula e trata as mesmas, já temos uma possibilidade de erro na divisão de um número por 0. Para complementar, adicionamos mais dois botões, onde cada um dará um tipo de exceção.
Continuando, codifique o evento onClick do botão btnConversao como segue:
procedure TForm1.btnConversaoClick(Sender: TObject);
begin
StrToInt('Texto');
end;
Aqui, estamos forçando um erro de conversão, pois estamos tentando converter uma string para um número inteiro.
O evento onClick do botão btnErro ficará desta forma:
procedure TForm1.btnErroClick(Sender: TObject);
begin
raise Exception.Create('Teste');
end;
Neste caso, estamos apenas gerando uma exceção sem nenhum tipo definido, ou seja, uma exceção genérica.
Feito isto, implementemos então o evento onException do componente ApplicationEvents como abaixo:
procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
if E.ClassType = EZeroDivide then
ShowMessage('Impossível divisão por zero!')
else if E.ClassType = EConvertError then
ShowMessage('Conversão inválida!')
else
ShowMessage('Exceção genérica!');
end;
Aqui, verificamos o tipo da exceção ocorrida e a tratamos.
Para uma melhor visualização, execute a aplicação. Primeiro, insira qualquer número no primeiro campo e um 0 no segundo e tente efetuar a divisão. Depois, clique nos botões restantes e veja o comportamento de nossa aplicação exemplo.
Gostou? Nada como a simplicidade, não é mesmo?....
Espero que tenham gostado!
Abraços
Rodrigo Santos
|
|
Comentários | |
| | Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos. |
por: luiswebhead (luis_webhead@hotmail.com)
: Mar 13, 2012 - 09:53 (Informações sobre o membro | Enviar uma mensagem)
http://http://
|
Achei bem interessante esse componente, mas gostaria de saber se ele afeta de alguma forma a performance da aplicação, pois é um componente que ficará tentando interceptar os eventos a todo momento, como ficaria essa questão?
Parabéns pelo tópico.
|
por: marcieldeg (marciel_degasperi@yahoo.com.br) : Mar 13, 2012 - 10:01 (Informações sobre o membro | Enviar uma mensagem) http:// | Interessante, não conhecia o uso desse componente.
Só uma dúvida: Os eventos se aplicam somente à janela onde o componente é adicionado, ou à toda a aplicação?
Se os eventos se aplicam à toda a aplicação, esse uso de validar campos de uma única tela pode ser problemático, visto que haverá um processamento contínuo mesmo quando não se estiver usando a tela. | [ Comentários não permitidos para usuários anônimos. Por gentileza, registre-se ou conecte-se ao sistema
por: marone (rod.alves88@gmail.com) : Mar 13, 2012 - 10:45 (Informações sobre o membro | Enviar uma mensagem) | De acordo com os docs da Embarcadero, o evento onIdle somente é chamado quando a aplicação entra no estado de espera, ou seja, este evento não é chamado a todo momento. Há um parâmetro chamado Done neste evento também, que quando for setado para False faz com que aplicação consuma muito processamento, prejudicando a performance do sistema, no entanto, não sei dizer qual real utilidade deste parâmetro.
Muito obrigado! | [ Comentários não permitidos para usuários anônimos. Por gentileza, registre-se ou conecte-se ao sistema
|
|
Edição 112 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|