[ Pobierz całość w formacie PDF ]
.hpp:extern PACKAGE AnsiString __fastcall GetShortHint(const AnsiString Hint);extern PACKAGE AnsiString __fastcall GetLongHint(const AnsiString Hint);Je¿eli wiêc u¿yjemy znaku „|” do podzielenia tekstu podpowiedzi na trzy czêœci,to czêœci te wyodrêbniæ mo¿na równie¿ przy u¿yciu wymienionych funkcji:part1 = GetShortHint(HintText);part2 = GetShortHint (GetLongHint(HintText);part3 = GetLongHint (GetLongHint(HintText));Za³Ã³¿my wiêc, i¿ trzy czêœci podpowiedzi przeznaczone bêd¹ do wyœwietlenia(kolejno) w okienku, na œrodkowym panelu i prawym panelu; poniewa¿ w³aœciwoœæApplication–>Hint zawiera tylko dwie ostatnie czêœci (pierwsza zosta³awczeœniej „odfiltrowana” przez kontrolkê), wystarczy tylko rozdzieliæ te czêœcipomiêdzy w³aœciwe panele:// œrodkowy panelStatusBar1–>Panels–>Items[1]–>Text = GetShortHint(Application–>Hint);// prawy panelStatusBar1–>Panels–>Items[2]–>Text = GetLongHint(Application–>Hint);W poprzednim punkcie zaprezentowaliœmy tworzenie i wykorzystanieniestandardowej klasy okna podpowiedzi (TCalculatorHintWindow); problem w tym,i¿ nasza aplikacja pos³uguje siê równie¿ podpowiedziami standardowymi.Aktualnie stosowana klasa okna podpowiedzi wskazywana jest (jak wczeœniejpisaliœmy) przez zmienn¹ HintWindowClass i zadaniem aplikacji jest w³aœciweprze³¹czanie jej pomiêdzy klasami THintWindow i TCalculatorHintWindow.„Prze³¹czanie” takie dokonywane jest w ramach zdarzenia OnHint obiektuApplication, które to zdarzenie delegowane jest do identycznie nazwanegozdarzenia komponentu ApplicationEvents1:Wydruk 3.10.Obs³uga zdarzenia Application->OnHint za pomoc¹ komponentuTApplicationEventsvoid __fastcall TMainForm::ApplicationEvents1Hint(TObject *Sender){if(Application->Hint == "Ctrl+V|Memory Recall"|| Application->Hint == "LCD"){// 10 sekund.powinno wystarczyæ.Application->HintHidePause = 10000;HintWindowClass = __classid(TCalculatorHintWindow);}else{Application->HintHidePause = HintDisplayTime;HintWindowClass = __classid(THintWindow);}if(Application->Hint != "LCD"){// œrodkowy panelStatusBar1->Panels->Items[1]->Text = GetShortHint(Application->Hint);// prawy panelStatusBar1->Panels->Items[2]->Text = GetLongHint(Application->Hint);}}Koniecznoœæ u¿ycia niestandardowych podpowiedzi (TCalculatorHintWindow) zdarzasiê tylko wówczas, gdy kursor znajduje siê na klawiszu „MR” (podpowiedŸwyœwietla wówczas zawartoœæ pamiêci) lub w obrêbie wyœwietlacza (je¿eliwyœwietlana liczba nie mieœci siê w ca³oœci na wyœwietlaczu, mo¿na ja zobaczyæw ca³oœci w³aœnie dziêki podpowiedzi).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
[ Pobierz całość w formacie PDF ]