Enviado pelo leitor: Centralizando rotinas em uma unit

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (0)  (0)

Veja neste artigo enviado por João Alberto Licht Teixeira, como centralizar rotinas em uma unit.

Centralizando rotinas em uma unit

João Alberto Licht Teixeira

Qual desenvolvedor ainda não se deparou com a crueldade de ficar repetindo código e mais código em vários componentes diferentes, mas que basicamente fará a mesma coisa, como por exemplo, mudar a cor quando eles receberem e perderem foco?

A tendência é colocar código em cada evento OnEnter e OnExit, o que deixaria o código enorme e nada elegante quando tivéssemos algumas dezenas ou até centenas de componentes que devessem obedecer esse tratamento de foco.

Para resolver o problema, a idéia é concentrar o trabalho pesado em uma rotina, que por sua vez ficará dentro de uma unit que possa ser utilizada (via uses) em qualquer lugar da aplicação.

Conteúdo da rotina

A rotina deverá receber o formulário que a está chamando como parâmetro, para que apenas os componentes desse formulário recebam tratamento.  A aparência seria semelhante à da (Figura 1), logicamente com a cor que o desenvolvedor ou até mesmo o usuário tivesse escolhido – mas isso é coisa pra outro artigo.

 

Centralizando.gif 

Figura 1. Aparência dos Edits com e sem foco

Abaixo está o código da função, que está residente na unit U_Global, mas que pode ser qualquer uma de sua escolha. (veja a Listagem 1).

 

Listagem 1. Função TrataFoco

unit U_Global;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes,

  Graphics, Controls, Forms, Dialogs, DBCtrls;

 

procedure TrataFoco(Forma: TFormClass);

 

implementation

 

procedure TrataFoco(Forma: TFormClass);

var

  C : Word;

  I : Integer;

  ABC : TForm;

Const

  ComFoco = TColor(clSkyBlue);

  SemFoco = TColor(clWhite);

begin

  for I := 0 To Screen.FormCount - 1 do

  begin

    ABC := Screen.Forms[I];

    if ABC.ClassType = Forma then

      for C := 0 to Screen.Forms[I].ComponentCount - 1 do

      begin

        // -------------

        // Com Foco

        // -------------

        if (Screen.Forms[I].Components[C] is TEdit) and

          (Screen.Forms[I].Components[C] as TEdit).Focused then

          (Screen.Forms[I].Components[C] as TEdit).Color := ComFoco;

        if (Screen.Forms[I].Components[C] is TDBEdit) and

          (Screen.Forms[I].Components[C] as TDBEdit).Focused then

          (Screen.Forms[I].Components[C] as TDBEdit).Color := ComFoco;

        . . .

// Aqui deverão ser adicionados todos os componentes que deverão ter o foco tratado

        . . .

        // -------------

        // Sem focado

        // -------------

        if (Screen.Forms[I].Components[C] is TEdit) and

          not(Screen.Forms[I].Components[C] as TEdit).Focused then

          (Screen.Forms[I].Components[C] as TEdit).Color := SemFoco;

        if (Screen.Forms[I].Components[C] is TDBEdit) and

          not(Screen.Forms[I].Components[C] as TDBEdit).Focused and

          (Screen.Forms[I].Components[C] as TDBEdit).Enabled then

          (Screen.Forms[I].Components[C] as TDBEdit).Color := SemFoco;

      end;

  end;

end;

end.

Explicando o código

É feita uma varredura em todos os forms da aplicação para saber qual form (parametrizado em Forma) a função está tratando, quando então será feita uma varredura em todos os componentes desse form (Forma) e, se eles estiverem referenciados dentro da função, terão então suas cores tratadas. Lembre-se de que o mesmo componente deverá ter as linhas de código para tratamento de quando estiver COM e SEM foco dentro da mesma função.

As constantes ComFoco e SemFoco, do tipo TColor, encarregam-se de colorir o componente que receber ou perder o foco.

Utilizando o código

Para disparar o código, utiliza-se um TTimer (System), que deve ter sua propriedade Interval = 1 e o código da Listagem 2 no seu evento OnTimer, em cada formulário que terá o foco de seus componentes tratado:

 

Listagem 2.

procedure TForm1.Timer1Timer(Sender: TObject);

begin

  Timer1.Enabled := False;

  TrataFoco(TForm1);

  Timer1.Enabled := True;

end;

Conclusões

Com a maneira centralizada que está sendo proposta, basta você utilizar a criatividade para viabilizar o tratamento global de muitas outras propriedades e eventos em seu aplicativo, de forma limpa, clara e rápida.

 

João Alberto Licht Teixeira (joão@solespe.com.br) é programador, instrutor e desenvolvedor Delphi desde a versão 1. É sócio proprietário da Solespe Informática Ltda (www.solespe.com.br) de Santa Maria - RS, trabalha com MySQL em projetos cliente/servidor e multicamadas.

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?