[ Pobierz całość w formacie PDF ]
.Przy okazji nale¿y jednak rozwi¹zaæ pewien istotnyproblem: otó¿ panel w momencie ulokowania go na pasku kontrolnym TControlBarzyskuje dodatkowe „obrze¿e” o wielkoœci 11 pikseli z lewej strony (tzw.uchwytprzeci¹gania) i po 2 piksele na pozosta³ych krawêdziach, lecz obrze¿e to niejest uwzglêdniane we w³aœciwoœciach: Left, Top, Right, Bottom, Width i Heightpanelu, mimo i¿ jego obecnoœæ nale¿y uwzglêdniæ przy planowaniu uk³adu panelina pasku kontrolnym; do obliczeñ nale¿y wiêc wzi¹æ nie oryginalne wspó³rzêdne irozmiary paneli, lecz zmodyfikowane o wymienione rozmiary obrze¿a.Zdarzenie OnResizeZdarzenie OnResize generowane jest po ustaleniu nowych rozmiarów kontrolki iumo¿liwia zmianê jej wygl¹du b¹dŸ te¿ wykonanie innych operacji zwi¹zanych zezmian¹ rozmiarów.Nie nale¿y w ramach obs³ugi zdarzenia OnResize zmieniaæw³aœciwoœci Constraints – nale¿y w tym celu pos³u¿yæ siê zdarzeniemOnConstrainedResize.W naszym kalkulatorze wykorzystujemy zdarzenie OnResize do adjustacji etykietzawartych w panelu – tle wyœwietlacza po zmianie jego szerokoœci:Wydruk 3.26.Adjustacja etykiet wyœwietlaczavoid __fastcall TMainForm::LCDPanelResize(TObject *Sender){UpdateHistoryLabel(HistoryLabel->Caption);UpdateLCDScreen(LCDScreen->Caption);if(LCDPanel->Floating && MainForm->Visible) SetFocus();}Powy¿sza funkcja wykonuje trzy zasadnicze czynnoœci: uaktualnia etykietêhistorii obliczeñ, uaktualnia „g³Ã³wn¹” zawartoœæ wyœwietlacza oraz zapewniaprzeniesienie skupienia na formularz g³Ã³wny.Uaktualnienie „g³Ã³wnej” zawartoœci, czyli etykiety LCDScreen, odbywa siê przezporównanie nowej zawartoœci (przekazanej przez parametr) z obecn¹ (ukrywaj¹c¹siê pod w³aœciwoœci¹ Caption), skonfrontowaniem tego porównania z now¹szerokoœci¹ panelu LCDPanel i ew.wyœwietleniu nowej zawartoœci.FunkcjêUpdateLCDScreen() prezentowaliœmy ju¿ na wydruku 3.11 – dla kompletnoœciprzytoczymy go tutaj ponownie:Wydruk 3.27.Uaktualnianie „g³Ã³wnej” zawartoœci wyœwietlaczavoid __fastcall TMainForm::UpdateLCDScreen(const AnsiString& NewNumber){int NumberWidth = LCDScreen->Canvas->TextWidth(NewNumber);if(Operation == coComplete){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;}Scenariusz realizowany przez powy¿sz¹ funkcjê sk³ada siê z trzech zasadniczychetapów:Sprawdzana jest szerokoœæ (w pikselach) nowego tekstu do wyœwietlenia (ten„nowy” tekst jest w tym przypadku to¿samy z zawartoœci¹ „tytu³u” etykiety(Caption)).Wybierany jest odpowiedni tryb wyrównywania zawartoœci etykiety w jej w³asnychgranicach (w³aœciwoœæ Alignment) zale¿ny od tego, czy ¿¹dana operacja ju¿ siêzakoñczy³a (tj.czy wyœwietlony zosta³ wynik), czy jeszcze trwa.Je¿eli pozakoñczonej operacji etykieta nie jest dostatecznie szeroka do wyœwietleniakompletnego wyniku, wymuszane jest lewostronne wyrównanie zawartoœci, pocz¹tekwyniku jest bowiem zazwyczaj wa¿niejszy od jego koñcówki (je¿eli ju¿ oczywiœciemusimy wybieraæ); przy dostatecznej szerokoœci wybierane jest wyrównanieprawostronne.Je¿eli operacja jeszcze siê nie zakoñczy³a (Operation ró¿ne jestod coComplete), to oznacza, ¿e wyœwietlana wartoœæ jest w³aœnie edytowana lubmo¿e byæ edytowana za chwilê – w takiej sytuacji najwa¿niejsze s¹ cyfry nowowprowadzane, a wiêc wymusiæ nale¿y wyrównanie prawostronne.Je¿eli nowa zawartoœæ nie mieœci siê w oknie wyœwietlacza, jest ona podstawianapod w³aœciwoœæ Hint etykiety LCDScreen, by mog³a byæ na ¿¹danie wyœwietlona (wca³oœci) w formie podpowiedzi kontekstowej.Uaktualnienie etykiety HistoryLabel jest nieco prostsze, bowiem sposóbwyœwietlania jej treœci nie ma ¿adnego odniesienia do bie¿¹cego statusuoperacji:Wydruk 3.28.Uaktualnianie etykiety historii obliczeñvoid __fastcall TMainForm::UpdateHistoryLabel(const AnsiString& NewHistory){int HistoryWidth = HistoryLabel->Canvas->TextWidth(NewHistory);if( (HistoryWidth >= HistoryLabel->Width)&& (HistoryLabel->Alignment == taLeftJustify) ){HistoryLabel->Alignment = taRightJustify;}else if( (HistoryWidth < HistoryLabel->Width)&& (HistoryLabel->Alignment != taLeftJustify) ){HistoryLabel->Alignment = taLeftJustify;}HistoryLabel->Caption = NewHistory;}Podobnie jak w przypadku etykiety LCDScreen nowa zawartoœæ konfrontowana jest zd³ugoœci¹ etykiety.Je¿eli etykieta nie jest dostatecznie szeroka, bywyœwietliæ sw¹ zawartoœæ, wymuszane jest wyrównanie prawostronne, by widoczneby³y elementy z „historii najnowszej”; w przeciwnym razie tekst wyrównywanyjest lewostronnie.Ostatni¹ czynnoœci¹ zwi¹zan¹ ze zmian¹ rozmiarów wyœwietlacza jest przywrócenieskupienia formularzowi g³Ã³wnemu w sytuacji, gdy wyœwietlacz jest wydokowany,sam zaœ formularz g³Ã³wny jest widoczny – badanie tego ostatniego warunku jestkonieczne, poniewa¿ zdarzenie OnResize kontrolki zawartej w formularzu mo¿ezostaæ wygenerowane jeszcze przed pierwszym wyœwietleniem formularza [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • luska.pev.pl
  •