Wiemy już, że komponenty posiadają właściwości i metody...
Serwis znalezionych hasełOdnośniki
- Smutek to uczucie, jak gdyby się tonęło, jak gdyby grzebano cię w ziemi.
- Metody przetwarzania AC Przetworniki delta Przetworniki delta charakteryzują się błędami przy szybkich zmianach sygnału...
- METODY ZAGĘSZCZANIA BETONU NA BUDOWIE Aby do tego nie dopuścić, niezbędne są nadzór i kontrola bieżąca procesu zagęszczania na budowie...
- sność drugiej ćwierci; suma wniesiona do wspólnoty stanowić będzie jedną czwartą właści- wego wkładu, pozostałym zaś przy życiu małżonkom...
- W³aœciwoœci biologiczne mog¹ staæ siê prawdziwym ograniczeniem dla JTOZWOJU uspo³ecznienia dopiero wtedy, gdy s¹ to wrodzone czy nabyte defekty samego mózgu, których...
- Dariusz Zając· trudności wychowawcze wiążą się z właściwościami uczniów,których zachowanie w sytuacjach społecznych niekorzystnieodbiega od...
- Uciążliwych ości nie posiadają: duży sandacz, duży łosoś, duży dorsz, węgorz, flądra, turbot i rekin...
- N/D Dopuszczalne eksploatacja się i upadek osób - urazy w bne Zachowanie ładu i porządku na drogach dojścia oraz właściwych...
- Kiedy uważa się jakiś rząd (niezależnie od metody wyłaniania władzy) za dostawcę bezpłatnych usług, to wkrótce zacznie on powiększać ich zakres i...
- •)'• Ka¿da g³oska ma swoj¹ metodykê wywo³ania i logopeda-nauczyciel od--wiednio do mo¿liwoœci dziecka j¹ stosuje...
- od okolicznoœci i pomimo zewnêtrznych nacisków, najbardziej szczegó³owe i najdosko-nalsze metody wyborcze...
Smutek to uczucie, jak gdyby się tonęło, jak gdyby grzebano cię w ziemi.
Domyślamy się również, że komponenty potrafią reagować na wystąpienie pewnych zdarzeń. Zakładka events (w oknie Object Inspector) większości komponentów zawiera bogatą listę zdarzeń, jakie można dla nich oprogramować. Jednocześnie, jak o tym wspomniałem wcześniej,
Rozdział 10. ♦ Podstawy tworzenia komponentów
213
właściwości widoczne w oknie Object Inspector należą również do grupy właściwości (ang. properties). Dlatego żeby obsłużyć zdarzenie komponentu , jakim jest
, należy przypisać właściwości tego zdarzenia odpowiednią metodę. Dzięki temu można różnym zdarzeniom przypisać tę samą metodę — nawet dla różnych komponentów.
Podejście tradycyjne
Aby wejść łagodnie w świat projektowania komponentów, zademonstruję, jak na pewnych etapach można osiągnąć pozornie skomplikowany cel, jakim jest utworzenie komponentu. W wielu programach korzystałem z komponentu klasy , który służył mi m. in. do wyboru miesiąca (w zakresie 1 – 12). Najprostszym rozwiązaniem jest umieszczenie na formularzu komponentu oraz wstępne wypełnienie jego właściwości wartościami od 1 do 12 reprezentujących kolejne miesiące. Wobec tego komponentu — nazwijmy go — miałem jeszcze jeden wymóg. Otóż potrzebo-wałem, aby początku swej pracy komponent na był ustawiony na wartość, jaką posiada aktualny miesiąc. Narzuca się naturalne i proste rozwiązanie, aby skorzystać z klas i odpowiednio oprogramować zachowanie się nowej klasy tak, aby spełniała moje ocze-kiwania. W tym celu utworzyłem nową klasę dziedziczącą wprost od klasy .
Oryginalny konstruktor klasy ma postać:
" '$
Jego parametr ! jest identyfikowany z właścicielem komponentu. Postanowiłem nieco zmodyfikować konstruktor, aby móc na starcie określić właściciela komponentu, jego rodzicaoraz położenie lewego górnego rogu, w jakim ma się znaleźć komponent.
W efekcie, konstruktor przyjął postać:
#
<#'$-. '$-.
' " '$
='
+( )
"#77 "7$
Jego implementacja wygląda następująco:
<#'$-.,' " '$
='
+( )
& ' "
+
=& >5
"#77 "7$
214
Delphi 7 i bazy danych
Kolejno w ciele konstruktora wykonuje się wywołanie konstruktora klasy bazowej, przypisanie rodzica, ustawienie położenia lewego górnego rogu komponentu oraz wywoływana jest metoda, której zadaniem jest wypełnienie listy komponentu warto-
ściami od 1 do 12 oraz ustawienie właściwości (aktywny wiersz komponentu klasy MyComboBox) na odpowiadającą numerowi bieżącego miesiąca (listing 10.3): Listing 10.3. Kod realizujący ustawienie wewnętrznej zawartości kontrolki
<#'$-.,=#77 "7$
$
? ( <&( #( /( <( ( < =
6 $
6 )
1$ )
$ : :;
)$,)$
6 %"
6 ( ? ( <&( #
1$ $&
)1$
6 )$,).
6 @ 9: &
)$). 6
Natomiast, aby użyć mechanizmu w postaci nowo zdefiniowanej klasy, wykonuję wywołanie:
$:, $
<#'$-.
<#'$-.,' ( $:( AB( CC
Takie jest tradycyjne podejście. Proste i skuteczne (pełny kod znajduje się w przykładowym projekcie o nazwie " #$ w c:\helion\przyklady\komponenty\krok1\source\
Przyklad28). Ale ma swoją wadę. Przejawia się ona głównie tym, że jeżeli na przykład projektujemy okno dialogowe posiadające wiele obiektów kontrolnych w postaci komponentów, takich jak na przykład %, %, & , itd., to wygodnie jest albo wszystkie komponenty umieszczać na formularzu ściągając je z palety komponentów, albo wszystkie je tworzymy w locie, jak w przykładzie powy-
żej. Metoda polegająca na mieszaniu tych dwóch metod jest chyba najgorszym z rozwiązań. Rozwiązaniem najbardziej sensownym jest utworzenie komponentu realizującego te samo zadanie.
Rozdział 10. ♦ Podstawy tworzenia komponentów
215
Tworzymy pierwszy komponent
Komponenty można tworzyć zupełnie od podstaw lub wykorzystując istniejące klasy wraz z mechanizmami, które klasy te posiadają. W dalszym ciągu postaram się omówić sposób utworzenia prostego komponentu powstałego na bazie komponentu .
Wykonuje on te same zadania, co utworzony w poprzednim punkcie obiekt klasy '
(omawiany przykład znajduje się w przykładowym projekcie o nazwie " #(
— c:\helion\przyklady\komponenty\krok1\source\Przyklad29).
Aby utworzyć nowy komponent, należy po uruchomieniu środowiska Delphi zamknąć ewentualnie otwarty projekt oraz z menu wybrać: Component/New Component. Na ekranie zobaczymy okno jak na rysunku 10.1.
Rysunek 10.1.
Okno tworzenia
nowego komponentu
W oknie tym mamy do wyboru następujące parametry:
Ancestor Type — należy wybrać klasę przodka;
Class Name — należy podać naszą propozycję nazwy dla tworzonej klasy komponentu;
Palette Page — należy podać nazwę istniejącej (lub nowej) palety, na której ma się znaleźć tworzony komponent;
Unit File Name — należy podać położenie pliku z kodem źródłowym komponentu;
Search Path (ścieżka poszukiwań) — najczęściej nie trzeba tutaj nic zmieniać.
Po podaniu wymaganych danych zatwierdzamy nasze dane, wybierajÄ…c klawisz OK.
W efekcie, mechanizm tworzenia nowego komponentu utworzy nowy moduł w miejscu pliku jak w parametrze Unit File Name. Bedzie on zawierał definicje klasy o nazwie
dziedziczącą od . Oto zawartość pliku (listing 10.4): Listing 10.4. Początkowa zawartość modułu
<='$-.
#0( ' ( '( '
216
Delphi 7 i bazy danych
#
<='$-. '$-.
D E
D E
D E
&
D & E
*
$$
*
*'$F0*F( 2<='$-.3
,
Nie ma tutaj specjalnych niespodzianek. Mamy w zasadzie szkielet klasy i jedną pro-cedurę o nazwie ) . Deklaracja metody ) jest następująca:
*'$
'$' # '$'
Procedura ) dokona rejestracji komponentu na karcie o nazwie *+%).
Aby tworzony komponent mógł zachowywać się jak jego przodek klasy , trzeba do sekcji dodać konstruktor, za pomocą którego wywołamy konstruktor
przodka. Ja rozszerzyłem możliwości konstruktora o możliwość przyjęcia parametrów klasy podstawowej.
' " '$ ='
Chciałem również, aby nowy komponent posiadał właściwość , która przechowywałaby aktualną wartość numeryczną miesiąca. W tym celu dodałem właściwość opublikowaną o takie nazwie do sekcji :
&
# < < !< " <
Nowa właściwość pojawi się w oknie Object Inspector z taką samą nazwą. Aby móc ustawiać tę właściwość, trzeba zadeklarować odpowiednią zmienną w sekcji prywatnej.
Zmienna ta powinna przyjmować wartości tylko z zakresu od 1 do 12. Aby tak się stało, utworzyłem nowy typ:
#
< :,,:;
a w sekcji , podałem:
< <
Rozdział 10. ♦ Podstawy tworzenia komponentów
217