Delphi Tips & Tricks softsale > Delphi Tips & Tricks      

< poprzednia rada następna rada >

Kolorowanie aktywnych elementów edycyjnych

Czasem, przy wielu elementach edycyjnych na formularzu, celowe jest zaznaczenie jakimś wybranym kolorem elementu w danej chwili aktywnego, czyli posiadającego tzw. focus. Korzystamy w tym przypadku z obsługi dwóch zdarzeń: OnEnter oraz OnExit. W obsłudze zdarzenia OnEnter wybieramy kolor, który jest kolorem wyróżnionym, a w obsłudze zdarzenia OnExit kolor, który jest kolorem dla elementu edycyjnego aktualnie niewybranego. Taką obsługę tych zdarzeń musimy przypisać do wszystkich elementów edycyjnych na formularzu. Jeżeli na formie umieściliśmy np. 10 elementów klasy TEdit, nie musimy oczywiście pisać 20 procedur obsługi a tylko dwie, używając parametru Sender dla odróżnienia, którego Edita w danym momencie to dotyczy.

procedure Tform1.Edit1Enter(sender:TObject);
begin
   TEdit1(Sender).Color:=clgreen;
end;

procedure Tform1.Edit1Exit(sender:TObject);
begin
   TEdit1(Sender).Color:=clWhite;
end;

Problem się lekko komplikuje gdy na formie umieścimy elementy edycyjne różnych typów np: TEdit, TDBEdit, TMemo, TDBMemo, TMasEdit.

Uniwersalne rozwiązanie przedstawiono poniżej. Taką uniwersalną formę można dołączyć do Repozytorium systemu Delphi i wykorzystywać ją zawsze jako wzorzec w przypadku, kiedy chcemy wyróżniać wybranym kolorem aktywne elementy edycyjne. Forma (Kolor_focus) zawiera dwa publiczne pola typu TColor.

   Kolor_wybrany: TColor;
   Kolor_niewybrany: TColor;
oraz dwa handlery obsługi zdarzeń: OnEnter oraz OnExit. Na zdarzeniu OnCreate formy zastosowano pętlę przejścia po wszystkich komponentach istniejących na formie (korzysta się tu z systemowej tablicy Components oraz licznika ComponentCount). Poszczególnym elementom edycyjnym przypisywane są odpowiednie procedury obsługi zdarzeń OnEnter i OnExit.
procedure TKolor_focus.ControlEnter(Sender: TObject);
begin
   if Sender is TEdit then
      TEdit(Sender).Color := Kolor_wybrany
   else if Sender is TMemo then
      TMemo(Sender).Color := Kolor_wybrany
   else if Sender is TDBMemo then
      TDBMemo(Sender).Color := Kolor_wybrany
   else if Sender is TMaskEdit then
      TMaskEdit(Sender).Color := Kolor_wybrany
   else if Sender is TDBEdit then
      TDBEdit(Sender).Color := Kolor_wybrany;
end;

procedure TKolor_focus.ControlExit(Sender: TObject);
begin
   if Sender is TEdit then
      TEdit(Sender).Color := Kolor_niewybrany
   else if Sender is TMemo then
      TMemo(Sender).Color := Kolor_niewybrany
   else if Sender is TDBMemo then
      TDBMemo(Sender).Color := Kolor_niewybrany
   else if Sender is TMaskEdit then
      TMaskEdit(Sender).Color := Kolor_niewybrany
   else if Sender is TDBEdit then
      TDBEdit(Sender).Color := Kolor_niewybrany;
end;

procedure TKolor_focus.FormCreate(Sender: TObject);
var
  i: Integer;
begin

   Kolor_wybrany := clTeal;
   Kolor_niewybrany := clWhite;

   for i := 0 to Self.ComponentCount - 1 do
   if Self.Components[i] is TEdit then
      begin
      TEdit(Self.Components[i]).OnEnter := ControlEnter;
      TEdit(Self.Components[i]).OnExit := ControlExit;
      TEdit(Self.Components[i]).Color := Kolor_niewybrany;
      end
   else if Self.Components[i] is TMemo then
      begin
      TMemo(Self.Components[i]).OnEnter := ControlEnter;
      TMemo(Self.Components[i]).OnExit := ControlExit;
      TMemo(Self.Components[i]).Color := Kolor_niewybrany;
      end
  else if Self.Components[i] is TDBMemo then
      begin
      TDBMemo(Self.Components[i]).OnEnter := ControlEnter;
      TDBMemo(Self.Components[i]).OnExit := ControlExit;
      TDBMemo(Self.Components[i]).Color := Kolor_niewybrany;
      end
  else if Self.Components[i] is TMaskEdit then
      begin
      TMaskEdit(Self.Components[i]).OnEnter := ControlEnter;
      TMaskEdit(Self.Components[i]).OnExit := ControlExit;
      TMaskEdit(Self.Components[i]).Color := Kolor_niewybrany;
      end
  else if Self.Components[i] is TDBEdit then
      begin
      TDBEdit(Self.Components[i]).OnEnter := ControlEnter;
      TDBEdit(Self.Components[i]).OnExit := ControlExit;
      TDBEdit(Self.Components[i]).Color := Kolor_niewybrany;
      end;
end;

SOFTSALE - Oprogramowanie i Szkolenia
softsale@softsale.com.pl

03-565 Warszawa , ul. Borzymowska 43 lok. 301C
tel/fax:4084840,GSM:0607612428