[ Pobierz całość w formacie PDF ]
.Sytuacje te rozpoznawane s¹ ³atwo napodstawie treœci podpowiedzi, których d³uga czêœæ brzmi wtedy (odpowiednio)„Ctrl+V|Memory Recall” oraz „LCD” – to w³aœnie jest treœci¹ pierwszejinstrukcji if.Druga instrukcja if zapobiega wypisaniu na œrodkowym panelutekstu „LCD”, który pe³ni jedynie rolê identyfikacyjn¹.Dotychczasprzeœledziliœmy dzia³anie podpowiedzi zwi¹zanej z klawiszem „MR”, zobaczmy wiêcteraz, jak funkcjonuje podpowiedŸ dubluj¹ca zawartoœæ wyœwietlacza (patrzwydruk 3.11).Wydruk 3.11.Odœwie¿anie zawartoœci wyœwietlaczavoid __fastcall TMainForm::UpdateLCDScreen(const AnsiString& NewNumber,bool Constant){int NumberWidth = LCDScreen->Canvas->TextWidth(NewNumber);// parametr Constant dodany zosta³ w celu wymuszenia lewostronnego// wyrównania gdy wyœwietlana jest sta³a lub zawartoœæ pamiêciif(Operation == coComplete || Constant){if( (NumberWidth >= LCDScreen->Width)&& (LCDScreen->Alignment == taRightJustify) ){LCDScreen->Alignment = taLeftJustify;}else if( (NumberWidth < LCDScreen->Width)&& (LCDScreen->Alignment != taRightJustify) ){LCDScreen->Alignment = taRightJustify;}}else if(LCDScreen->Alignment != taRightJustify){LCDScreen->Alignment = taRightJustify;}LCDScreen->Caption = NewNumber;int pos = LCDScreen->Hint.Pos("|");int length = LCDScreen->Hint.Length();AnsiString LCDScreenHint= LCDScreen->Hint.SubString(pos, length-pos+1);LCDScreen->Hint = NewNumber + LCDScreenHint;if(NumberWidth >= LCDScreen->Width) LCDScreen->ShowHint = true;else LCDScreen->ShowHint = false;}Powy¿sza funkcja wywo³ywana jest ka¿dorazowo, gdy zawartoœæ wyœwietlacza ma siêzmieniæ w wyniku np.wprowadzenia nowej cyfry czy zmiany reprezentacjiwyœwietlania.Po dokonaniu niezbêdnych ustawieñ, zwi¹zanych z wyrównaniemwyœwietlania, nowa zawartoœæ podstawiana jest pod w³aœciwoœæ Captionwyœwietlacza (bêd¹cego etykiet¹ TLabel).Drugi parametr wywo³ania ma za zadaniewymusiæ lewostronne wyrównanie wówczas, gdy na wyœwietlaczu ma pojawiæ siêjedna z predefiniowanych sta³ych – je¿eli bowiem sta³a nie mieœci siê w ca³oœcina wyœwietlaczu, wa¿niejszy jest jej pocz¹tek ni¿ koniec.Parametr ten jestparametrem domyœlnym i mo¿na go pomin¹æ w wywo³aniu – zak³ada siê wówczas, i¿ma on wartoœæ false, zgodnie z deklaracj¹ funkcji:void __fastcall UpdateLCDScreen(const AnsiString& NewNumber,bool Constant = false);Je¿eli funkcja UpdateLCDScreen() stwierdzi, i¿ kursor myszy znajduje siê wobrêbie wyœwietlacza, zwi¹zana z wyœwietlaczem podpowiedŸ (standardowo „|LCD”)uaktualniana jest teraz tak, i¿ jej krótka czêœæ staje siê kopi¹ zawartoœciwyœwietlacza.Aby ograniczyæ wyœwietlenie podpowiedzi tylko do tych przypadków,gdy zawartoœæ wyœwietlacza staje siê zbyt du¿a, by móg³ on pokazaæ j¹ wca³oœci, ustawiana jest odpowiednio w³aœciwoœæ ShowHint wyœwietlacza:if(NumberWidth >= LCDScreen->Width) LCDScreen->ShowHint = true;else LCDScreen->ShowHint = false;Kontrola migracji skupienia pomiêdzy elementami interfejsuJednym z najwa¿niejszych czynników, warunkuj¹cych wygodê obs³ugi aplikacji,jest sposób przekazywania jej danych wejœciowych.W aplikacjach dla Windows – igeneralnie innych aplikacjach sterowanych zdarzeniami i zorientowanych naobs³ugê graficzn¹ – pierwszorzêdne znaczenie ma sposób obs³ugi klawiatury.Wprzeciwieñstwie bowiem do myszy (i innych urz¹dzeñ wskazuj¹cych) zdarzeniapochodz¹ce od klawiatury nie s¹ zdarzeniami pozycyjnymi, to znaczy nie s¹zwi¹zane z okreœlon¹ lokalizacj¹ na ekranie; ich obs³ug¹ zajmuje siê natomiastwyró¿niona kontrolka interfejsu, nazywana kontrolk¹ skupion¹ (focused), dlategote¿ zdarzenia pochodz¹ce od klawiatury zaliczane s¹ do kategorii zdarzeñskupionych.Gdy zdarzenie skupione trafia do kontrolki skupionej, mo¿liwe s¹ dwa wariantypostêpowania: zdarzenie to mo¿e byæ mianowicie obs³u¿one przez tê kontrolkê,b¹dŸ te¿ nast¹piæ mo¿e przeniesienie skupienia na inn¹ kontrolkê wraz zprzekazaniem jej rzeczonego zdarzenia w celu jego obs³ugi.Za chwilê poka¿emy,jak obydwa te warianty realizowane s¹ w naszym projekcie kalkulatora.Obs³uga zdarzeñ skupionychNasza aplikacja kalkulator mo¿e byæ obs³ugiwana zarówno przez klawiaturê, jak iza pomoc¹ myszy – stosownie do wygody i upodobañ u¿ytkownika.Obs³ug¹ zdarzeñpochodz¹cych od klawiatury zajmuj¹ siê funkcje zdarzeniowe CalculatorKeyDown()i CalculatorKeyUp() – ale tylko wówczas, gdy mo¿liwoœæ wprowadzania danych zklawiatury nie jest zablokowana; w przeciwnym razie zdarzenia OnKeyDown() iOnKeyUp() s¹ „zaœlepione” – nie s¹ im przypisane ¿adne funkcje obs³ugi.Decyduje o tym, jak pamiêtamy, funkcja SetEnableKeyboardInput(), zajmuj¹c¹ siêprze³¹czaniem statusu dostêpnoœci klawiatury; prezentowaliœmy j¹ ju¿ na wydruku3.3, tutaj przytaczamy j¹ ponownie dla kompletnoœci przyk³adu:Wydruk 3.12.Implementacji funkcji SetEnableKeyboardInput()void __fastcall TMainForm::SetEnableKeyboardInput(bool NewEnableKeyboardInput){if(EnableKeyboardInput != NewEnableKeyboardInput){FEnableKeyboardInput = NewEnableKeyboardInput;if(EnableKeyboardInput){OnKeyDown = CalculatorKeyDown;OnKeyUp = CalculatorKeyUp;StatusBar1->Panels->Items[1]->Width = 60;}else{OnKeyDown = 0;OnKeyUp = 0;StatusBar1->Panels->Items[1]->Width = 0;}StatusBar1->Invalidate();}}W konstruktorze formularza g³Ã³wnego pole FEnableKeyboardInput inicjowane jestwartoœci¹ false, tak wiêc przy pierwszym porównaniu w³aœciwoœæEnableKeyboardInput ma wartoœæ false; z kolei pierwsze wywo³anie funkcjiSetEnableKeyboardInput() nastêpuje z wartoœci¹ parametru true (klawiaturastandardowo jest dostêpna), tak wiêc warunek w instrukcji if jest spe³niony;spe³niony jest równie¿ warunek w drugiej instrukcji if (w³aœciwoœæEnableKeyboardInput ma bowiem teraz wartoœæ true), ergo – przy pierwszymwywo³aniu funkcji SetEnableKeyboardInput() nastêpuje przypisanie obs³ugizdarzeniom OnKeyDown i OnKeyUp.Funkcjê obs³ugi pierwszego z wymienionych zdarzeñ przedstawia wydruk 3.13.Wydruk 3.13
[ Pobierz całość w formacie PDF ]