Zrozumienie i przetwarzanie zdarzeń klawiatury w Delphi
OnKeyDown, OnKeyUp i OnKeyPress
Zdarzenia klawiaturowe, wraz zzdarzenia myszy, to podstawowe elementy interakcji użytkownika z Twoim programem.
Poniżej znajdują się informacje o trzech zdarzeniach, które umożliwiają przechwytywanie naciśnięć klawiszy użytkownika w aplikacji Delphi: OnKeyDown , OnKeyUp oraz OnKeyPress .
W dół, w górę, wciśnij, w dół, w górę, wciśnij...
Aplikacje Delphi mogą używać dwóch metod odbierania danych wejściowych z klawiatury. Jeśli użytkownik musi coś wpisać w aplikacji, najłatwiejszym sposobem na otrzymanie tych danych wejściowych jest użycie jednej z kontrolek, która automatycznie reaguje na naciśnięcia klawiszy, na przykład Edytuj.
Jednak w innych przypadkach i do bardziej ogólnych celów możemy tworzyć procedury w formie, która obsługuje trzy zdarzenia rozpoznawane przez formularze i przez dowolny komponent, który akceptuje dane wejściowe z klawiatury. Możemy napisać programy obsługi zdarzeń dla tych zdarzeń, aby odpowiadały na dowolny klawisz lub kombinację klawiszy, które użytkownik może nacisnąć w czasie wykonywania.
Oto te wydarzenia:
OnKeyDown - wywoływane po naciśnięciu dowolnego klawisza na klawiaturze
OnKeyUp - wywoływane po zwolnieniu dowolnego klawisza na klawiaturze
OnKeyPress - wywoływane po naciśnięciu klawisza odpowiadającego znakowi ASCII
Obsługa klawiatury
Wszystkie wydarzenia klawiszowe mają jeden parametr wspólnie. The Klucz parametr jest klawiszem na klawiaturze i służy do przekazywania przez referencję wartości naciśniętego klawisza. The Zmiana parametr (w OnKeyDown oraz OnKeyUp procedur) wskazuje, czy klawisze Shift, Alt lub Ctrl są połączone z naciśnięciem klawisza.
TheParametr nadawcyodwołuje się do kontrolki użytej do wywołania metody.
|_+_|Odpowiadanie, gdy użytkownik naciśnie klawisze skrótu lub klawisze skrótu, takie jak te dostarczane z poleceniami menu, nie wymaga pisania programów obsługi zdarzeń.
Co to jest skupienie?
Focus to możliwość odbierania danych wejściowych od użytkownika za pomocąmyszlub klawiatura. Tylko obiekt, który ma fokus, może otrzymać zdarzenie klawiatury. Ponadto tylko jeden składnik na formularz może być aktywny lub mieć fokus w uruchomionej aplikacji w danym momencie.
Niektóre elementy, takie jak Obraz , TPaintBox , TPanel oraz TLabel nie może uzyskać ostrości. Ogólnie komponenty pochodzące z TGraphicControl nie są w stanie uzyskać ostrości. Dodatkowo komponenty, które są niewidoczne w czasie wykonywania ( TTimer ) nie może uzyskać ostrości.
OnKeyDown, OnKeyUp
The OnKeyDown oraz OnKeyUp zdarzenia zapewniają najniższy poziom reakcji klawiatury. Obie OnKeyDown oraz OnKeyUp obsługa może reagować na wszystkie klawisze klawiatury, w tym klawisze funkcyjne i klawisze w połączeniu z Zmiana , Wszystko , oraz klawisz kontrolny Klucze.
Zdarzenia klawiszowe nie wykluczają się wzajemnie. Gdy użytkownik naciśnie klawisz, zarówno OnKeyDown oraz OnKeyPress generowane są zdarzenia, a gdy użytkownik zwolni klawisz, OnKeyUp zdarzenie jest generowane. Gdy użytkownik naciśnie jeden z klawiszy, które OnKeyPress nie wykrywa, tylko OnKeyDown wystąpi zdarzenie, po którym następuje OnKeyUp wydarzenie.
Jeśli przytrzymasz klawisz, OnKeyUp zdarzenie następuje po tym wszystkim OnKeyDown oraz OnKeyPress wydarzenia miały miejsce.
OnKeyPress
OnKeyPress zwraca inny znak ASCII dla „g” i „G”, ale OnKeyDown oraz OnKeyUp nie rozróżniaj klawiszy alfanumerycznych pisanych wielkimi i małymi literami.
Parametry klawisza i przesunięcia
Ponieważ Klucz parametr jest przekazywany przez odniesienie, obsługa zdarzeń może się zmienić Klucz aby aplikacja widziała inny klucz jako zaangażowany w zdarzenie. Jest to sposób na ograniczenie rodzajów znaków, które użytkownik może wprowadzać, na przykład uniemożliwienie użytkownikom wpisywania kluczy alfa.
|_+_|Powyższe stwierdzenie sprawdza, czy Klucz parametr jest połączeniem dwóch zestawów: małych liter (tj. a poprzez z ) i wielkie litery ( A-Z ). Jeśli tak, instrukcja przypisuje wartość znaku zero do Klucz aby zapobiec jakiemukolwiek wejściu do Edytować składnik, na przykład, gdy otrzyma zmodyfikowany klucz.
W przypadku kluczy niealfanumerycznych WinAPI wirtualne kody kluczy może służyć do określenia naciśniętego klawisza. Windows definiuje specjalne stałe dla każdego klawisza, który użytkownik może nacisnąć. Na przykład, VK_PRAWO jest wirtualnym kodem klawisza strzałki w prawo.
Aby uzyskać stan klucza niektórych klawiszy specjalnych, takich jak PATKA lub Strona w górę , możemy użyć GetKeyState Wywołanie interfejsu API systemu Windows. Stan klawisza określa, czy klawisz jest w górę, w dół, czy przełączony (włączony lub wyłączony - naprzemiennie po każdym naciśnięciu klawisza).
|_+_|w OnKeyDown oraz OnKeyUp wydarzenia, Klucz to niepodpisana wartość programu Word, która reprezentuje wirtualny klucz systemu Windows. Aby uzyskać wartość znaku z Klucz , Używamy Chr funkcjonować. w OnKeyPress wydarzenie, Klucz jest Zwęglać wartość reprezentująca znak ASCII.
Obie OnKeyDown oraz OnKeyUp zdarzenia używają parametru Shift, typu TShiftState , zestaw flag do określenia stanu klawiszy Alt, Ctrl i Shift po naciśnięciu klawisza.
Na przykład po naciśnięciu Ctrl + A generowane są następujące kluczowe zdarzenia:
|_+_|Przekierowywanie zdarzeń klawiatury do formularza
Aby przechwytywać naciśnięcia klawiszy na poziomie formularza zamiast przekazywać je do komponentów formularza, ustaw formularza KeyPreview właściwość na True (za pomocą Inspektor obiektów ). Komponent nadal widzi zdarzenie, ale formularz ma możliwość obsłużenia go jako pierwszy - na przykład, aby zezwolić lub zabronić naciśnięcia niektórych klawiszy.
Załóżmy, że w formularzu znajduje się kilka komponentów edycji, a Form.OnKeyPress procedura wygląda tak:
|_+_|Jeśli jeden ze składników edycji ma Skupiać, i KeyPreview właściwość formularza jest False, ten kod nie zostanie wykonany. Innymi słowy, jeśli użytkownik naciśnie 5 klucz, 5 znak pojawi się w aktywnym komponencie Edit.
Jeśli jednak KeyPreview jest ustawiona na True, wtedy forma OnKeyPress zdarzenie jest wykonywane, zanim składnik Edit zobaczy wciśnięty klawisz. Ponownie, jeśli użytkownik nacisnął 5 klucz, a następnie przypisuje wartość znaku zero do klucza, aby zapobiec wprowadzaniu danych liczbowych do składnika edycji.