Delphi FAQ

Wywołanie OnExit po użyciu skrótu klawiszowego

Przemek_K
<justify>W kontrolkach ekranu często wykorzystywane jest zdarzenie OnExit, na przykład do tego, żeby natychmiast po zakończeniu edycji wartości pola przeprowadzić kontrolę poprawności. Zdarzenie OnExit zachodzi zawsze wtedy, kiedy przechodzimy do innej kontrolki albo klikamy jeden z przycisków na formie. Jeśli jednak jeden z przycisków, znajdujących się na formie, zostanie aktywowany przez użycie jego skrótu klawiszowego, zdarzenie to nie jest wywoływane i konieczne czynności nie są wykonywane. Problem ten nie każdemu jest znany, a jego konsekwencje mogą być poważne. Spotykałem przypadki gotowych i komercyjnie rozprowadzanych programów, w których kontrola poprawności jest przeprowadzana przy wychodzeniu z pola, jeśli jednak zostanie użyty skrót klawiszowy aktywujący przycisk, kontrola ta nie jest wykonywana, błędna wartość w polu zostaje i autorzy programu nawet nie są świadomi takiej sytuacji. Niech więc czytający ten artykuł zastanowią się, czy w ich programach nie może dojść do błędów w wyniku użycia skrótów klawiszowych, a jeśli nie są pewni, niech to lepiej sprawdzą. Rozwiązanie jest zaskakująco proste. Problem bierze się stąd, że po aktywowaniu przycisku skrótem klawiszowym focus nadal pozostaje na tej samej kontrolce, więc też nie zachodzi zdarzenie OnExit. Aby więc zdarzenie to zaszło, należy focus przenieść do innej kontrolki. Do której? Wszystko jedno, byle gdzie indziej, niż się znajduje teraz. Logika jednak podpowiada, że najlepiej go umieścić na tym komponencie, który właśnie został aktywowany. Jeśli więc forma zawiera przykładowo przycisk o nazwie btZatwierdz, to pierwszą instrukcją procedury jego zdarzenia powinno być <font name="Courier New">btZatwierdz.SetFocus</span> . To wystarczy, żeby problem rozwiązać, i żeby wszystkie czynności związane z opuszczaniem każdej kontrolki zostały wykonane. Oczywiście, te same instrukcje należy umieścić w procedurach każdego przycisku znajdującego się na formie.</justify>

Przemysław Kapałka

FAQ

2 komentarzy

W przypadku wykrycia błędu należy: 1) Z powrotem umieścić focus na tej kontrolce, w której został wykryty błąd. 2) Przerwać wykonywanie procedury obsługi przycisku, który został uruchomiony - da się zrobić np. przez wprowadzenie atrybutu klasy, który informuje, czy jest poprawnie.
Jeśli moduł działa prawidłowo i ma poprawną obsługę błędów dla "klikania", to i dla skrótów klawiszowych żadne więcej operacje nie powinny być potrzebne.
A jeśli są potrzebne szczegóły jak to wszystko zrobić, i jak uniemożliwić zamykanie ekranu w przypadku wykrycia błędu, to jest to temat na osobny artykuł i raczej nie do działu FAQ.

Ok. To jest bardzo użyteczne info. Jednak to rozwiązanie jeszcze nie do końca rozwiązuje problem. W prawdzie OnExit zostanie wywołane po skrócie klawiszowym, ale to nie przeszkodza w niczym, żeby zdarzenie tego skrótu wykonało się dalej. User zostanie poinformowany o błędnie wprowadzonej wartości, ale co z tego, skoro i tak już jej nie może poprawić...