Usando Frames com eventos dinâmicos 02/N
Olá Pessoal, estou aqui para falar sobre frames novamente.
Para relembrar, Frame é como se fosse uma form instanciada como um componente panel.
O Help do delphi o chama de container, mas ele não é um mero container, se aplicado de forma corretamente.
Situação:
Imagine que você tenha um texto informado pelo usuário em um edit, e que no evento onkeypress você tenha que filtrar somente as consoantes, somente as vogais ou não filtrar.
Solução:
Ouvi alguém dizer Frames? Isso mesmo! Mas nesse caso, vale a pena criar toda uma hierarquia de frames para algo tão específico? Não! Então o que eu devo fazer Léo Simas? Usar frames com eventos carregados em runtime, eu respondo!
Ok Léo Simas! O nome é bonito, mas como fazer isso?
Para solucionarmos esse problema, nada melhor que um exemplo prático!
Mãos à obra!
*Crie uma nova aplicação.
*Com a Form vazia mesmo, vá em File->New->Frame.
Vai aparecer algo meio estranho. Parece um painel, mas tem botões de form.
Isso é o nosso frame.
*Chame-o de FrAdicionaLetra.
*Deixe o Frame com width como 327 e Height como 153.
*Abaixo do type vamos declarar um método de um objeto assim:
type TDigita = procedure (Sender: TObject; var Key: Char) of object; TFrAdicionaLetra = class(TFrame)
*Crie um TEdit e um TMemo.
A tela vai ficar assim:
*Crie uma propriedade chamada Digitar do tipo TDigita com write como SetDigitar assim:
private { Private declarations }
procedure SetDigitar(const Value: TDigita);
public
procedure Adicionarletra(Key : Char);
property Digitar: TDigita write SetDigitar;
end;
*No setdigitar, vamos atribuir ao onkeypress do edit o parâmetro passado:
procedure TFrAdicionaLetra.SetDigitar(const Value: TDigita);
begin
Edit1.OnKeyPress := Value;
end;
*No AdicionarLetra basta fazer o seguinte:
procedure TFrAdicionaLetra.Adicionarletra(Key : Char);
begin
Memo1.Text := Memo1.Text + Key;
end;
*Agora colocamos 3 TFrAdicionaLetra na tela principal chamando-os de:
FrAdicionaLetraVogal: TFrAdicionaLetra;
FrAdicionaLetraConsoante: TFrAdicionaLetra;
FrAdicionaLetraTodas: TFrAdicionaLetra;
*Agora o pulo do gato! Na tela principal crie 3 métodos assim:
procedure TForm1.CapturarVogais(Sender: TObject; var Key: Char);
begin
If Key in ['a','e','i','o','u'] then
TFrAdicionaLetra(Twincontrol(Sender).parent).Adicionarletra(key);
end;
procedure TForm1.CapturarConsoantes(Sender: TObject; var Key: Char);
begin
If not (key in ['a','e','i','o','u']) then
TFrAdicionaLetra(Twincontrol(Sender).parent).Adicionarletra(key);
end;
procedure TForm1.CapturarTodas(Sender: TObject; var Key: Char);
begin
TFrAdicionaLetra(Twincontrol(Sender).parent).Adicionarletra(key);
end;
Esses métodos serão passados para cada um dos 3 frames, tendo assim 3 frames iguais com eventos diferentes.
*No oncreate da form principal basta fazer:
FrAdicionaLetraVogal.Digitar := CapturarVogais;
FrAdicionaLetraConsoante.Digitar := CapturarConsoantes;
FrAdicionaLetraTodas.Digitar := CapturarTodas;
Agora o primeiro frame apenas filtra as vogais, o segundo frame apenas filtra as consoantes e o terceiro não possui filtro algum.
E teremos algo assim:
Dessa forma, permanece o padrão do nosso Frame permitindo a ele ter particularidades, sem a necessidade de uma hierarquia extensa.
E a maior facilidade está na manutenção já que podemos modificar o TFrAdicionaLetra como quisermos, sem interferir nos frames colocados nas forms.
Lembrando que é importante sempre manter o bom senso. Pois se dois ou mais frames precisam do mesmo evento, é melhor criar uma hierarquia invez de ir pro Ctrl+C e Ctrl+V.
Agora é por sua imaginação…
Cadastros com beforepost diferentes, relatórios que precisam de tratamento para alguns campos, consultas com statusbar tendo dados diferentes.
Não há limites.
Espero que tenham gostado.
Até a próxima!
Falowzzzzzzzzzzzzz
Em 13 de março de 2007 às 10:15
Muito interessante o exemplo. É de boas técnicas de programação como essa que precisamos.
Um abraço.
Em 04 de abril de 2007 às 12:38
Legal mesmo mas nao consegui fazer funcionar e gostaria de desenvolver um frame que as propriedades aparecesem no object inspector tem como se tiver to aguardando resposta
abraço.