[ Pobierz całość w formacie PDF ]
.Przyczyn¹ jest to,¿e Windows nie mia³ szansy zmieniæ kursora przed wejœciem programu w pêtlê.Podczas wykonywania pêtli aplikacja nie jest w stanie przetwarzaæ ¿adnychkomunikatów – ³¹cznie z tym nakazuj¹cym zmianê kursora.Rozwi¹zaniem jestwymuszenie na Windows przetwarzania komunikatów oczekuj¹cych w pêtlikomunikatów (ang.message loop) w trakcie wykonywania pêtli przez program:Application.ProcessMessages;Teraz aplikacja umo¿liwia swobodny przep³yw komunikatów, a kursor zmienia swójwygl¹d w chwili, gdy rozpoczyna siê pêtla.Oczywiœcie, mo¿na równie¿ zmieniæ kursor dla indywidualnego komponentu.Przyk³adowo – program graficzny mo¿e zmieniaæ kursor w obszarze u¿ytkowym(klienta) w zale¿noœci od bie¿¹cego narzêdzia rysowania.W takim przypadku nienale¿y zmieniaæ kursora dla obiektu Screen, poniewa¿ chcemy, aby kursorprzyjmowa³ kszta³t strza³ki gdy znajdzie siê nad paskiem narzêdzi, paskiemstanu, menu lub dowolnym innym komponentem, jaki wystêpowaæ mo¿e w formularzu.Nale¿y wtedy ustawiæ kursor tylko dla komponentu reprezentuj¹cego okno u¿ytkoweaplikacji:PaintBox.Curosr := crCross;Kursor zostanie zmieniony tylko dla jednego okreœlonego komponentu, natomiastpozosta³e z nich stosuj¹ swoje w³asne predefiniowane kursory.£adowanie i korzystanie z kursorów u¿ytkowychZa³adowanie kursora u¿ytkowego wymaga trochê wiêcej pracy.Jak zosta³o towspomniane wczeœniej, lista kursorów dostêpnych dla aplikacji przechowywanajest przez w³aœciwoœæ Cursors klasy TScreen.U¿ycie kursora u¿ytkowego wymagawykonania kilku kroków:Stwórz kursor w Edytorze Graficznym lub innym edytorze zasobów i zapisz go jakoplik.res.Za pomoc¹ dyrektywy kompilatora $R w³¹cz ten plik do swojego programu.Za³aduj kursor do tablicy Cursors za pomoc¹ funkcji LoadCursor.Zaimplementuj kursor przypisuj¹c odpowiedni¹ wartoœæ indeksu w³aœciwoœci Cursorformularza, obiektu Screen lub dowolnego innego komponentu.Sposób wykonania dwóch pierwszych kroków zosta³ omówiony w rozdziale jedenastympodczas rozwa¿añ na temat Edytora Graficznego i w rozdziale ósmym, w którymmowa by³a o zasobach.Po do³¹czeniu kursora do pliku.exe mo¿na w prosty sposóbza³adowaæ go do tablicy Cursors, za pomoc¹ funkcji LoadCursor:Screen.Cursors[1] := LoadCursor(HInstance, 'MOJKURSOR');Kod ten dzia³a przy za³o¿eniu, ¿e posiadasz kursor o nazwie MOJKURSOR i chceszmu przypisaæ indeks 1 w liœcie kursorów (pamiêtaj, ¿e pozycje od –17 do 0 s¹wykorzystywane przez kursory wbudowane).Za³adowanie kursora musi siê odbyætylko raz, dlatego prawdopodobnie najlepszym miejscem na przeprowadzenie tejoperacji jest procedura obs³uguj¹ca zdarzenie OnCreate.Wszystkie kursory s¹ ³adowane do w³aœciwoœci Cursors obiektu Screen niezale¿nieod tego, czy s¹ one nastêpnie wykorzystywane przez obiekt Screen, formularz,czy komponent.Istnieje tylko jedna tablica Cursors i nale¿y ona do obiektuScreen.Aby skorzystaæ z okreœlonego kursora, wystarczy przypisaæ go w³aœciwoœci Cursorobiektu Screen lub dowolnego innego komponentu:PaintBox.Cursor := 1;Je¿eli posiadasz kilka w³asnych kursorów, mo¿esz utworzyæ dla nich sta³e oodpowiednich nazwach, zamiast stosowaæ wartoœci liczbowe, które s¹ ³atwe dopomylenia.Przy zastosowaniu tej metody poprzedni kod wygl¹da³by nastêpuj¹co:constcrHELION = 1;{w dalszej czêœci kodu …}Screen.Cursors[crHELION] := LoadCursor(HInstance, 'MOJKURSOR');{jeszcze w dalszej czêœci kodu…}PaintBox.Cursor := crHELION;Jak widaæ, ³adowanie i implementowanie w³asnych kursorów nie jest trudne, kiedywiadomo jak to siê robi.Kod przeznaczony dla tego rozdzia³u zawieraprzyk³adowy program o nazwie CursTest, demonstruj¹cy zagadnienia omawiane w tejsekcji.PodsumowanieW rozdziale tym pozna³eœ niektóre cechy decyduj¹ce o jakoœci aplikacji dlaWindows, a tak¿e przekona³eœ siê, w jaki sposób mo¿na zaimplementowaæ je wew³asnych programach.Powinienem Ciê ostrzec, i¿ ³atwo mo¿na popaœæ w przesadêstosuj¹c we w³asnych aplikacjach zbyt du¿o takich cech jak paski kontrolne,paski stanu, czy kursory.Stosuj w swoich aplikacjach wszelkie niezbêdnedekoracje, ale nie przesadzaj z nimi.Pod koniec rozdzia³u zapozna³eœ siê zmechanizmami drukowania.W niektórych przypadkach mechanizm ten jest wbudowanyw komponent, a wtedy drukowanie staje siê operacj¹ niezwykle ³atw¹.W innychsytuacjach niezbêdna staje siê wspó³praca z klas¹ TPrinter – ale nawet wtedydrukowanie pozostaje rzecz¹ ³atw¹ do zaimplementowania.WarsztatWarsztat sk³ada siê z pytañ kontrolnych oraz æwiczeñ utrwalaj¹cych ipog³êbiaj¹cych zdobyt¹ wiedzê.Odpowiedzi do pytañ mo¿esz znaleŸæ w dodatku A.Pytania i odpowiedzi* Czy mogê jednoczeœnie wy³¹czyæ dostêp do wszystkich komponentów na moim paskunarzêdzi?Tak.Ustaw w³aœciwoœæ Enabled paska narzêdzi na wartoœæ False.* Zauwa¿y³em, ¿e komponenty TCoolBar i TControlBar s³u¿¹ w przybli¿eniu do tegosamego celu.Którego z nich powinienem u¿ywaæ?Moja rada brzmi: u¿ywaj TControlBar.Istnieje wiele wersji bibliotekipodstawowych kontrolek firmy Microsoft – COMCTL32.DLL.TCoolBar jestnadbudowany wokó³ kontrolki cool bar firmy Microsoft, a przez to zale¿ny odwersji biblioteki COMCTL32.DLL jak¹ u¿ytkownik zainstalowa³ w swojej maszynie.TControlBar dzia³a niezale¿nie od COMCTL32.DLL, dlatego jego zachowanie waplikacji nie bêdzie siê zmieniaæ od systemu do systemu.* Jak mam umieœciæ bitmapê na pasku stanu?Stwórz pasek wielopanelowy.Zmieñ styl panelu, który przechowywaæ bêdziebitmapê, na psOwnerDraw.Nastêpnie, we wnêtrzu procedury obs³uguj¹cej zdarzenieOnDrawPanel, u¿yj metody Draw klasy TCanvas aby narysowaæ bitmapê na panelu.* W jakim celu powinienem zajmowaæ siê czymœ takim, jak udostêpnianie poleceñelementów menu i przycisków paska zadañ?Poniewa¿ u¿ytkownicy oczekuj¹ konsekwentnego interfejsu.Je¿eli którekolwiekpolecenia s¹ niedostêpne (w menu lub na pasku), powinny byæ one przyciemnione.Jest to wizualna wskazówka dla u¿ytkownika, ¿e dane polecenia w ogóle istniej¹,ale chwilowo nie maj¹ zastosowania.* Jestem u¿ytkownikiem Delphi od d³u¿szego czasu.Mam ju¿ zaimplementowanysystem udostêpniania poleceñ.Jak¹ korzyœæ da mi przejœcie na mechanizm akcji ilist akcji?Akcje stanowi¹ pewnego rodzaju centraln¹ lokalizacjê, z której mo¿naprzeprowadzaæ wszelkie operacje udostêpniania poleceñ.W przeciwieñstwie dow³asnego kodu udostêpniania poleceñ, który rozrzucony jest po ca³ym obszarzekodu aplikacji, akcje pozwalaj¹ na umieszczenie ca³ego kodu w jednym miejscu.* Chcê aby moja aplikacja by³a w stanie wyprowadzaæ dane pochodz¹ce z kontrolkidu¿ego obszaru edycji.Jak naj³atwiej to zrobiæ?Najprostszym rozwi¹zaniem jest zastosowanie komponentu RichEdit.Do drukowaniajego zawartoœci mo¿na wykorzystaæ jego metodê Print.* Zauwa¿y³em, ¿e zarówno obiekt Printer, jak i jego w³aœciwoœæ Canvas posiadaj¹w³aœciwoœæ Handle.Jaka ró¿nica wystêpuje miêdzy nimi?W tym przypadku nie ma ¿adnej ró¿nicy.Je¿eli zaistnieje potrzeba wywo³aniafunkcji Windows API, która wymaga uchwytu do kontekstu urz¹dzenia drukarki,mo¿na u¿yæ uchwytu Printer.Handle lub Printer.Canvas.Handle.* Po zmianie kursora w g³Ã³wnym formularzu, jego wygl¹d jest poprawny nad samymformularzem, ale gdy znajdzie siê nad dowolnym z przycisków jest mu przywracanykszta³t strza³ki
[ Pobierz całość w formacie PDF ]