Usando Frames com eventos dinâmicos 02/N

Escrito em 04 de março de 2007 em Sem Categoria por leosimas

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:
frame02a.jpg
*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:
frame02b.jpg
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


2 comentários em 'Usando Frames com eventos dinâmicos 02/N' »

Assine os comentários usando RSS ou faça um TrackBack para 'Usando Frames com eventos dinâmicos 02/N'.

[-]
[+]
Eliseu Corrona disse,

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.

 
[-]
[+]
Dener disse,

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.