Zgryźliwość kojarzy mi się z radością, która źle skończyła.

 

Rozdział 14.
Programowanie zaawansowane









C:\Dokumenty\Roboczy\Delphi 4 dla kazdego\14.doc              601









Rozdzia³ 14. ¨ Programowanie zaawansowane              599

W tym rozdziale zajmiemy się bardziej zaawansowanymi aspektami programowania dla Windows w Delphi. Omawiane zagadnienia dotyczyć będą w szczególności:

u                                          Implementowania pomocy kontekstowej

u                                          Obsługi wyjątków

u                                          Korzystania z Rejestru Windows

u                                          Wyspecjalizowanej obsługi komunikatów

Czeka Cię wiele pracy.

Implementowanie pomocy kontekstowej

Jeszcze nie tak dawno aplikacje – zwłaszcza te prostsze – obywały się zupełnie bez pomocy kontekstowej. Biorąc jednak pod uwagę obecny rynek programów, nie polecałbym takiego podejścia. Oczekiwania użytkowników dotyczące możliwości programów ciągle rosną. Plik pomocy nie jest już tylko opcją, ale wymaganym komponentem pełnowartościowej aplikacji.

Pomoc kontekstowa oznacza to, że kiedy użytkownik naciśnie klawisz F1, wyświetlona zostanie strona pliku pomocy, odpowiadająca bieżącemu kontekstowi aplikacji. Weźmy za przykład środowisko IDE Delphi. Załóżmy, że masz otwarte okno opcji projektu z wyświetloną stroną Application. Jeżeli naciśniesz klawisz F1 (lub przycisk Help znajdujący się w oknie), uruchomiony zostanie program WinHelp, a w jego oknie wyświetlony zostanie temat pomocy dla strony Application okna opcji projektu.

Podobnie naciskając klawisz F1 w chwili, gdy na ekranie wyświetlane jest okno opcji Repozytorium, otrzymasz pomoc dotyczącą tego konkretnego okna dialogowego. Pomoc kontekstowa działa również w przypadku elementów menu: jeżeli podświetlisz element menu i naciśniesz F1, zostaniesz przeniesiony na stronę pliku pomocy dotyczącą tego wskazanego elementu.

Aby zaimplementować pomoc kontekstową w swojej aplikacji, musisz wykonać następujące czynności:

1.                                       Utworzyć plik pomocy dla swojej aplikacji.

2.                                       Przypisać nazwę pliku pomocy właściwości HelpFile obiektu Application.

3.                                       Nadać odpowiednie wartości właściwościom HelpContext wszelkich formularzy i komponentów, dla których przewidujesz pomoc kontekstową.

4.                                       Utworzyć elementy menu Pomoc (Help) tak, aby użytkownik mógł uruchomić ją z menu.

Przeanalizujmy kolejno te czynności.

Tworzenie pliku pomocy

Pisanie plików pomocy jest zadaniem raczej średnio przyjemnym – dlatego też powierza się ją zazwyczaj wyodrębnionemu działowi dokumentacji, nawet w przypadku przedsięwzięć niskobudżetowych.

Niezależnie od tego, kto pisze pliki pomocy, musi istnieć pewna koordynacja między ich twórcami a programistami. Identyfikatory kontekstu w pliku pomocy muszą pasować do ich odpowiedników w treści programu źródłowego. Mimo, że zadanie to nie jest zbyt skomplikowane, jest jednak podatne na błędy, których uniknięcie wymaga pewnej dozy staranności.

Plik pomocy Windows może zostać skonstruowany z kilku indywidualnych plików. Źródło pliku pomocy Windows nazywane jest plikiem tematycznym (ang. topic file). Plik tematyczny zapisany jest w formacie RTF i zawiera – prócz treści zasadniczej – mnóstwo specjalnych kodów sterujących przeznaczonych dla kompilatora. W skład materiału źródłowego dla tworzonego pliku pomocy mogą również wchodzić pliki graficzne – najczęściej w formacie .bmp lub .wmf, niekiedy również w innych specjalnych formatach.

Sposób kompozycji pliku pomocy na podstawie poszczególnych plików źródłowych określony jest przez plik projektu, posiadający rozszerzenie .hpj. W pliku tym znajduje się również wydzielona sekcja ([MAP]) określająca odwzorowanie numerów kontekstów na odpowiadające im tematy. Plik projektu stanowi materiał wejściowy dla kompilatora, którym może być na przykład Microsoft Help Workshop (znajdziesz go w katalogu \Delphi 4\Help\Tools) – rezultatem pracy kompilatora jest właśnie plik pomocy z rozszerzeniem .hlp.

Mimo, że źródłowe pliki pomocy można tworzyć za pomocą dowolnego edytora obsługującego format .rtf, zdecydowanie zalecam kupienie specjalizowanego generatora pomocy. Dobry pakiet tego typu może zaoszczędzić wielu frustracji związanej z pisaniem plików pomocy. Do komercyjnych programów tego typu pomocy zaliczyć można m.in. ForeHelp firmy Fore Front, Inc. (http://www.ff.com) i RoboHelp firmy Blue Sky Software (http://www.blue-sky.com). Ja korzystam głównie z ForeHelp i jestem zadowolony z jego sposobu działania. Istnieją również dobre programy typu shareware –jednym z nich jest HelpScribble dostępny za pośrednictwem strony http://www.ping. be/jg/.

Identyfikatory kontekstu i właściwość HelpContext

Niezależnie od tego, jakiej metody użyjesz do stworzenia pliku pomocy, musisz dokonać wzajemnego przyporządkowania głównych tematów pomocy i numerów kontekstowych. Numer kontekstowy (ang. context number) jest używany przez system pomocy Windows (WinHelp32.exe) do wyświetlania określonej strony z pliku pomocy.

Załóżmy dla przykładu, że w swojej aplikacji posiadasz okno dialogowe Właściwości. Kiedy użytkownik naciska klawisz F1 przy otwartym oknie Właściwości, program przekazuje identyfikator kontekstu dla tego okna do programu WinHelp. WinHelp uruchamia się i wyświetla tę stronę z pliku pomocy, która wyjaśnia zasady funkcjonowania okna Właściwości. Nie jest wymagane istnienie identyfikatora kontekstu dla każdej strony w pliku pomocy, ale wskazane jest posiadanie indeksów dla stron głównych tematów, okien dialogowych i innych ważnych komponentów własnej aplikacji.

Większość komponentów (formularze, elementy menu i kontrolki) posiada właściwość o nazwie HelpContext. Przechowuje ona identyfikator kontekstu, który przekazany zostanie do programu WinHelp w sytuacji, kiedy użytkownik przyciśnie klawisz F1 w chwili, gdy dany komponent będzie komponentem pierwszoplanowym. Domyślną wartością właściwości HelpContext jest 0 co oznacza, że komponent dziedziczy numer kontekstu ze swego okna rodzicielskiego (np. formularza).

 

Być może zauważyłeś, że komponenty SpeedButton i ToolButton nie posiadają właściwości HelpContext. Ponieważ nie są to kontrolki okienkowe, nie są one nigdy w stanie przyjąć stanu aktywności (input focus), dlatego też nie ma możliwości przypisania im odrębnych numerów kontekstowych.

Minimalnym rozwiązaniem w zakresie systemu pomocy dla aplikacji jest zapewnienie pomocy kontekstowej dla każdego z formularzy (okienek dialogowych i okien drugorzędnych). Ustalenie, które komponenty są dla aplikacji na tyle istotne, że zasługują na własny kontekst pomocy, należy oczywiście do programisty; w przypadkach wątpliwych należy raczej tworzyć nowe konteksty niż ryzykować ich brak w sytuacjach, w których oczekiwaliby ich użytkownicy.

Implementowanie pomocy kontekstowej w Delphi

Implementowanie pomocy zależnej od kontekstu w aplikacjach Delphi jest względnie proste. Jak zostało to wspomniane wcześniej, rzeczywista praca związana z dodawaniem pomocy kontekstowej polega na napisaniu pliku pomocy – reszta jest już prosta.

Ustawianie pliku pomocy

Niezależnie od tego, w jaki sposób zaimplementowana zostanie pomoc kontekstowa, najpierw trzeba przekazać do Windows nazwę pliku pomocy stosowanego w naszej aplikacji. W tym celu nazwę pliku pomocy trzeba przypisać właściwości HelpFile obiektu Application. Można zrobić to na dwa sposoby. Prostszy z nich dotyczy fazy projektowania i odbywa się poprzez okno opcji projektu.

Z opcjami projektu zapoznałeś się w rozdziale dziewiątym „Projekty, Edytor Kodu i Eksplorator Kodu”. Wspomniany został wtedy fakt, iż strona Application okna opcji projektu zawiera pole o nazwie Help File, które służy do określenia nazwy pliku pomocy dla aplikacji. W polu tym wystarczy wpisać jego nazwę, a VCL przypisze ją do właściwości HelpFile i od tej pory aplikacja będzie używała tego pliku za każdym razem, gdy użytkownik poprosi o pomoc.

Nazwę pliku pomocy można również ustalić w trakcie pracy programu. Rozwiązanie takie może okazać się niezbędne jeżeli dopuścimy umieszczanie pliku pomocy w katalogu wskazanym przez użytkownika. W takim przypadku lokalizację pliku pomocy można umieścić w Rejestrze Windows (o Rejestrze będzie mowa później, w sekcji „Korzystanie z Rejestru”), a następnie przypisać pełną ścieżkę dostępu do pliku właściwości HelpFile obiektu Application. Przykładowo, fragment funkcji obsługującej zdarzenie OnCreate realizujący to zadanie mógłby wyglądać następująco:

 

var

   Filename : string;

begin

   Filename := GetHelpFileName; {funkcja zdefiniowana przez użytkownika}

   Application.HelpFile := Filename;

Chociaż nie jest to praktyka powszechna, właściwość HelpFile może być modyfikowana w wielu punktach programu, jeżeli uznamy to za niezbędne. Cechę tą można wykorzystać do przełączania się między różnymi plikami pomocy.

Po ustawieniu nazwy pliku pomocy można przejść do rzeczywistej implementacji systemu pomocy.

Udostępnianie klawisza F1

Wszystko co trzeba zrobić, aby udostępnić klawisz F1 formularzom i komponentom, to nadanie właściwości HelpContext odpowiedniego identyfikatora kontekstu pomocy; od tego momentu sprawę przejmuje VCL. Upewnij się, czy przypisałeś nazwę pliku pomocy właściwości HelpFile obiektu Application i czy plik ten zawiera poprawne identyfikatory kontekstu.

Udostępnianie poleceń menu przeznaczonych dla pliku pomocy

Poza udostępnianiem klawisza większość aplikacji oferuje również jeden lub dwa elementy menu związane z kategorią Pomoc (Help). Jeden z tych elementów nosi zazwyczaj nazwę Spis treści (lub Contents). Jego wybranie powoduje wyświetlenie strony zwartości pliku pomocy. Oprócz tego niektóre aplikacje posiadają również element menu o nazwie Tematy pomocy (lub Help Topics), wyświetlający indeks pliku pomocy. (Indeks powstaje w ramach procesu tworzenia pliku pomocy.)

Zaimplementowanie tych i innych elementów pomocy wymaga minimum pracy programistycznej. (W każdym przypadku chodzi tylko o jedną linię kodu.) VCL udostępnia metodę o nazwie HelpCommand, która może zostać użyta do wyświetlenia programu WinHelp w jednym z kilku możliwych trybów. Jeżeli implementowalibyśmy element menu Pomoc | Spis treści, kod ten przyjąłby następującą postać:

 

procedure TForm1.Contents1Click(Sender : TObject);

begin

  Application.HelpCommand(HELP_FINDER, 0);

end;

Metoda HelpCommand wywołuje program WinHelp z wyspecyfikowanym poleceniem. (Kompletną listę dostępnych poleceń znajdziesz – jakżeby inaczej – w systemie pomocy Windows API pod tematem WinHelp.) W tym konkretnym przypadku WinHelp jest wywoływany z poleceniem HELP_FINDER. Jest to rozkaz nakazujący wyświetlenie strony spisu treści – np. takiej jak na rysunku 14.1. Ostatni parametr metody HelpCommand służy do przekazania programowi WinHelp dodatkowych danych. W przypadku polecenia HELP_FINDER parametr ten nie jest wykorzystywany, dlatego ustawiony został na wartość 0.

 

Rysunek 14.1.

Strona spisu treści pomocy programu ScratchPad

 

Żeby WinHelp mógł wyświetlić stronę spisu treści, musi istnieć plik spisu treści dla pliku pomocy. Plik spisu treści jest plikiem tekstowym (z rozszerzeniem .cnt) określającym, w jaki sposób wyświetlona powinna być strona spisu treści. Więcej na ten temat przeczytać można w systemie pomocy programu Microsoft Help Workshop – znajdziesz go w katalogu \Delphi 4\Help\Tools.

 

Dobrze wykonany indeks dla pliku pomocy jest wprost nieoceniony. Jakość pliku pomocy i jego indeksu są najważniejszymi z kryteriów oceny pomocy technicznej, jaką zapewniasz użytkownikom aplikacji – nie zapominaj o tym.

Pomoc kontekstowa na żądanie

W większości przypadków dwie implementacje pomocy, o których mowa była przed chwilą, są w pełni wystarczające dla naszych aplikacji. Jednak czasami zachodzi potrzeba wywołania programu WinHelp w sposób bezpośredni z wyspecyfikowanym identyfikatorem kontekstu. W tym celu VCL udostępnia metodę HelpContext. Metoda ta pobiera jako s...

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • hannaeva.xlx.pl