Delphi Tips & Tricks softsale > Delphi Tips & Tricks      

< poprzednia rada następna rada >

Nawigacja na formie przy pomocy klawiszy strzałek i Enter

Częstym wymaganiem klientów, którzy wcześniej pracowali pod systemem DOS, jest wymaganie aby przejście do następnego elementu kontrolnego, np. pola edycyjnego na formie, było powodowane naciśnięciem klawisza ENTER, zamiast zwykle stosowanego w systemie WINDOWS klawisza TAB i SHIFT_TAB. Jak to zrobić?

Najpierw należy ustawić własność formy KeyPreview na True, co powoduje, że klucze wprowadzane są najpierw na formę, a dopiero potem do aktywnych elementów kontrolnych, a następnie oprogramować zdarzenie OnKeyPress formy tak, aby następowało wywołanie funkcji Perform w momencie naciśnięcia klawisza ENTER czyli:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
   begin
      if key=chr(13) then
      perform(WM_NEXTDLGCTL,0,0);
   end;

Trochę trudniejsze jest spełnienie wymagania aby przechodzić pomiędzy poszczególnymi elementami kontrolnymi na formie przy pomocy klawiszy strzałka w górę, strzałka w dół.

Rozwiązanie to opiera się na wykorzystaniu funkcji z WIN32 API o nazwie Keybd_Event. Funkcja ta odpowiada za generowanie obsługi klawiszy poprzez tworzenie odpowiednich komunikatów do systemu Windows, a mianowicie WM_KEYUP oraz WM_KEYDOWN.

Jak poprzednio ustawiamy własność KeyPreview formy na True ale zamiast dostarczyć jak poprzednio handler do obsługi zdarzenia OnKeyPress piszemy handler dla bardziej specyficznego zdarzenia OnKeyDown formy.

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
                                         Shift: ShiftState);
   begin
   case key of
      VK_DOWN,VK_RETURN:
      // jeśli strzałka w dół lub Enter to działanie klawisza
      // takie samo jak TAB
      begin
         keybd_Event(VK_TAB,0,0,0);
      end;
      // jeśli strzałka w górę, symulujemy działanie
      // klawisza SHIFT_TAB
      VK_UP:
      begin
         //symulacja naciśnięcia klawisza Shift
         keybd_Event(VK_SHIFT,0,0,0);
         keybd_Event(VK_TAB,0,0,0);
         // zwolnienie klawisza SHIFT
         keybd_Event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
      end;
   end;
   end;
W momencie kiedy handler obsługi zdarzeń otrzymuje wirtualny kod klawisza VK_UP wskazujący na to,że naciśnięty został klawisz strzałka w górę aktywujemy 3 wołania funkcji Keybd_Event symulujące wystąpienie kombinacji klawiszy SHIFT_TAB. Dla klawisza SHIFT trzeba wykonać dwa wołania odpowiednio dla naciśnięcia i zwolnienia, drugie wołanie jest konieczne.

UWAGA: Należy zdawać sobie sprawę z tego, że jeżeli na formie znajdują się kontrole, które mają swoją obsługę strzałki w górę lub w dól (takie jak listbox czy combobox), to wymaga to dodatkowego kodu wtedy kiedy te kontrole uzyskują focus.  Można to zrealizować, np dla listboxa, w następujący sposób:

procedure TForm1.ListBox1Click(Sender: TObject);
   begin
      form1.keypreview:=false;
   end;
Więcej szczegółow o tej użytecznej funkcji Keybd_Event można znależć w systemie pomocy WIN32 API systemu DELPHI.

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

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