| Ogólna budowa i działanie HSOK: Obiekt jądra |
|
| 20 czerwca 2007 | |||||||||||||||||||||
Strona 9 z 9 Obiekt jądraFunkcjonowanie klas opartych na HSOK jest koordynowane przez jeden, globalny obiekt jądra zwracany przez funkcję HSObjectKernel. Użytkownik może utworzyć własny obiekt jądra dziedzicząc po klasie THSObjectKernel i przypisując go do zmiennej UserKernel (istotne w przypadku wykorzystywania HSOK z poziomu różnych modułów *.bpl). Jądro HSOK pełni funkcję centralnego repozytorium zasobów i usług jakimi są rejestrowane w nim interfejsy i funkcje edycji poszczególnych klas. Obiekty udostępniające swoje usługi poprzez interfejsy rejestruje się w jądrze za pomocą metody RegisterInterface, a wyrejestrowuje metodą UnregisterInterface. Aplikacja może pobrać z jądra potrzebny jej interfejs za pomocą funkcji GetInterface. Dla każdej klasy dziedziczącej po THSField można zarejestrować w jądrze funkcję edycji jej danych, zgodną z definicją : TEditFunction = function (Field : THSField; Preview : boolean = false) : boolean; Funkcje edycji rejestruje się za pomocą metody jądra RegisterEditFunction. Kiedy wywołuje się w dowolnym obiekcie metodę EditData jądro wyszukuje funkcję edycji zarejestrowaną dla tej klasy i uruchamia ją. Jeśli dla danej klasy nie zarejestrowano żadnej funkcji edycyjnej wówczas jądro uruchamia domyślną funkcję edycji wskazywaną przez globalną zmienną DefEditFunction, o ile ją podano. Jeśli nie podano wówczas przy włączonej opcji $C+ (Assertions) generowany jest wyjątek. Mechanizm ten zapewnia odseparowanie warstwy zarządzania danymi od warstwy ich prezentacji, z zachowaniem możliwości uruchamiania edycji danych z dowolnego miejsca aplikacji. Daje również wiele innych możliwości. Można przeciążyć metodę EditData klasy i np. wykorzystać metodę edycyjną przodka. Można podpinać różne formatki edycyjne w zależności od kontekstu pracy aplikacji. Można wreszcie utworzyć warstwę transportową realizującą edycję lokalnych danych np. na zdalnym komputerze. Najczęściej mechanizm ten wykorzystywany jest jednak do podpinania do aplikacji formatek wygenerowanych w narzędziu Class Editor. Formatki te w sekcji initialization swojego modułu rejestrują się w jądrze HSOK, dlatego wystarczy dołączyć je do projektu aplikacji by korzystać z edycji obiektów danej klasy. Zmienna DefEditFunction służy najczęściej do przechwytywania prób edycji klas, dla których brak formatek i przekierowywania tych wywołań do domyślnego okna edycji, generowanego "w locie" dla danej klasy (moduł HSDefEditForm.pas). Jądro realizuje również mechanizmy RTTI dla tych klas, które nie implementują ich bezpośrednio. Class Editor automatycznie tworzy funkcje FieldClassByIndex i FieldNameByIndex wg danych wpisanych przez użytkownika, przeciążając metody zaimplementowane w THSBaseObject. Jeśli jednak ktoś tworzy kod klasy "ręcznie" (czego nie polecamy) i nie zaimplementuje tych metod to domyślnie klasa skorzysta z usług jądra. Jądro pobierze wówczas potrzebne dane z RTTI Delphi, dodatkowo buforując je dla potrzeb kolejnych odwołań. Class Editor na życzenie użytkownika może również wygenerować zoptymalizowaną wersję metody FieldIndexByName, domyślnie jednak jest ona realizowana przez jądro. C.D.N.
|
|||||||||||||||||||||





