Jak cię złapią, to znaczy, że oszukiwałeś. Jak nie, to znaczy, że posłużyłeś się odpowiednią taktyką.
24.
Zgłaszanie własnego wyjątku , (> ?&)+ 4- 4BCC 4A? @A - %#) ? 411/ 5566 6 Na listingach 4.23 i 4.24 pokazaliśmy, że utworzenie własnego wyjątku jest bardzo łatwe w implementacji. Jeśli komponent ma przeprowadzić zapytanie w trakcie projektowa- nia, musimy zapewnić użytkownikowi komunikat (a nie zgłoszenie wyjątku przez śro- dowisko). Zmodyfikowany w tym celu kod przedstawia listing 4.25. Zgłaszanie wyjątku w czasie projektowania , (> ?&)+ 4- 4BCC 4A? @A - ) *; + -- %#) ? 411/ +D 86 6 22 :668)D- %#) ? 411/ 5566 6 Gdy kreujemy i nazywamy komponenty, mogą pojawić się inni programiści, którzy przypadkiem stosują te same nazwy dla własnych komponentów. Spowoduje to powstanie konfliktu. Można jednak temu zapobiec, stosując słowo kluczowe %. Gdy nowy komponent tworzymy za pomocą kreatora, środowisko programistyczne ge- neruje kod podobny do tego z listingu 4.26. Rozdział 4. Tworzenie własnych komponentów 209 Kod w przestrzeni nazw ) )''4 , !"#E - ( ) FG ( )'/4- E ) +D>H 8D- Słowo kluczowe % zapewnia tworzenie komponentu we własnym podsystemie. Pamiętajmy o tym, że musimy w reszcie kodu komponentu stosować tę samą przestrzeń nazw. Przypuśćmy, że dwóch programistów opracowało komponent zegara i tak samo nazwali zmienną określającą domyślny tryb pracy. Jeśli obydwu zegarów użyjemy w tej samej aplikacji, kompilator zgłosi błąd z powodu podwójnej deklaracji. 55 6) '>I55)7 'I@6 !"#( 8&' ( ) 55 ) '>I55)7 'I@6 !"#( 8I&' ( ) Z tego właśnie powodu musimy pamiętać o przestrzeniach nazw w trakcie kreowania komponentów. Po wszystkich instrukcjach ( z pliku nagłówkowego otaczamy kod w sposób przedstawiony na listingu 4.27. Otaczanie kodu ). 8 !"#( 8&' Stosujemy jedną konwencję nazw dla wszystkich naszych komponentów. Na przykład nazwę przestrzeni rozpoczynamy od litery , po której następuje nazwa komponentu. Jeśli istnieje możliwość stosowania tej nazwy przez kogoś innego, poprzedzamy nazwę przestrzeni inicjałami nazwy firmy. Korzystanie z przestrzeni nazw zapewni poprawne współdziałanie naszych komponentów z innymi, pisanymi przez różne firmy. VCL obsługuje prawie wszystkie komunikaty okien, jakie kiedykolwiek będziemy chcieli wykorzystać. Istnieją jednak sytuacje, w których sami musimy dodać obsługę odpowiedzi na specyficzny komunikat. 210 Część I Podstawy środowiska C++Builder Należy pamiętać o tym, że jawne korzystanie z komunikatów systemu Windows uniemożliwi przeniesienie komponentów do innych systemów operacyjnych. Komponenty CLX nigdy nie powinny jawnie korzystać z komunikatów Windows. Przykładem sytuacji wymagającej bezpośredniej obsługi komunikatów jest na przykład dodanie obsługi przeciągania plików z Eksploratora Windows do komponentu siatki tekstowej. Możemy utworzyć taki komponent, nazywany ''), kreując go z klasy rodzicielskiej ') i dodając nowe funkcje. Operacja przeciągnij i upuść jest obsługiwana przez komunikat API *+,- $!'. In- formacje dotyczące operacji przechowywane są w strukturze *+ . Przechwytywanie komunikatów okien w komponentach jest takie samo jak w pozosta- łych projektach. Jedyna różnica polega na tym, że pracujemy z komponentem, a nie for- mularzem projektu. Z tego powodu mapę komunikatów ustawiamy w sposób przedsta- wiony na listingu 4.28. Przechwytywanie komunikatów /#".>#**"#> >#**"#J.$#E+K>E1 $#*(K> K) - #.>#**"#> +(* " - W deklaracji mapy komunikatów nie stosuje się średników, ponieważ )$,+''),+ , +''),.!- i ,+''),+ to makra rozwijane w trakcie kompilacji, które same je dodają. Kod z listingu 4.28 tworzy mapę komunikatów dla komponentu (zauważ ') na końcu makra ,+''),+ ). Obsługa komunikatów przekaże wszystkie przechwycone komunikaty do metody *% (za chwilę się nią zajmiemy). Informacje do metody przekazywane są w postaci struktury *+ zdefiniowanej w systemie Windows. Teraz zajmiemy się utworzeniem metody, która obsłuży komunikat. W sekcji komponentu definiujemy metodę, używając następującego kodu: & , K) (K> <>- Zauważmy, że dodajemy referencję na wymaganą strukturę jako parametr metody. Zanim komponent zacznie działać, musimy jeszcze zarejestrować go w systemie Win- dows, informując o tym, iż może przyjmować upuszczane pliki. Wykonujemy to pole- ceniem "# w trakcie wczytywania komponentu. J - W tym kodzie zmienna wykorzystywana jest przez komponent do wska- zania, czy możliwa jest obsługa upuszczania plików. Teraz metoda przyjmie nazwy plików, gdy komponent otrzyma komunikat Windows dotyczący techniki przeciągnij i upuść. Kod z listingu 4.29 to fragment pełnej wersji klasy komponentu. Rozdział 4. Tworzenie własnych komponentów 211 Przyjmowanie upuszczonych plików , (** " &&K) (K> <>- %'F>L (JG JE1 %+JE1 ->; 1.( .) ? %@.M$$.M$$- (* $ 0 (* $ @A +- ? +%< - + B.) NN- ? % ' 6+'-- @A+'- %+%- 558 2)6 6 O6 6 O 8P6O Wyjaśnienie tego kodu wykracza poza ramy niniejszego rozdziału. Pomoc środowiska C++Builder stanowi bardzo dobre źródło informacji o zastosowanych metodach. Możemy się przekonać, że przechwytywanie komunikatów nie jest trudne, gdy zna się zasady ich ustawiania oraz pewne funkcje API systemu Windows. Listę dostępnych struk- tur komunikatów znajdziemy w pliku messages.hpp instalowanym wraz ze środowi- skiem programistycznym. Przeprowadziliśmy już kilka sprawdzeń dotyczących tego, czy komponent działa w try- bie projektowym, czy wykonywania. Operacje trybu projektowania dotyczą zachowania komponentu w trakcie tworzenia projektu w środowisku projektowym. Operacje wyko-
|
WÄ…tki
|