Kod zgłaszający wyjątek przedstawia listing 4...

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
Powered by wordpress | Theme: simpletex | © Jak ciÄ™ zÅ‚apiÄ…, to znaczy, że oszukiwaÅ‚eÅ›. Jak nie, to znaczy, że posÅ‚użyÅ‚eÅ› siÄ™ odpowiedniÄ… taktykÄ….