[ Pobierz całość w formacie PDF ]
.Right);int UndockBottom = Registry->ReadInteger("Settings\\Display","UndockBottom",UndockedRect.Bottom);if(UndockRight > Screen->Width){int Offset = UndockRight - Screen->Width;UndockedRect.Right -= Offset;UndockedRect.Left -= Offset;if(UndockedRect.Left < 0) UndockedRect.Left = 0;}if(UndockBottom > Screen->Height){int Offset = UndockBottom - Screen->Height;UndockedRect.Bottom -= Offset;UndockedRect.Top -= Offset;if(UndockedRect.Top < 0){Offset = 0 - UndockedRect.Top;UndockedRect.Top = 0;UndockedRect.Bottom += Offset;}}LCDPanel->ManualFloat(UndockedRect);}// Formularz g³Ã³wnyint top, left, height, width;top = Registry->ReadInteger("Settings\\Position","MainFormTop",Top);left = Registry->ReadInteger("Settings\\Position","MainFormLeft",Left);height = Registry->ReadInteger("Settings\\Size","MainFormHeight",Height);width = Registry->ReadInteger("Settings\\Size","MainFormWidth",Width);if(width > Screen->Width) width = Screen->Width; // b³¹d !if(left+width > Screen->Width){left -= (left+width) - Screen->Width;}if(height > Screen->Height) height = Screen->Height; // b³¹d !if(top+height > Screen->Height){top -= (top+height) - Screen->Height;}Top = top;Left = left;Height = height;Width = width;// Pasek statusuStatusBar1->Visible = Registry->ReadBool("Settings\\StatusBar","Visible",StatusBar1->Visible);//if(!StatusBar1->Visible) Height -= StatusBar1->Height;EnableKeyboardInput = Registry->ReadBool("Settings","EnableKeyboard",EnableKeyboardInput);// Pasek kontrolnystd::list BandList;for(int i=0; iControlCount; ++i){AnsiString ControlPath = "Settings\\ControlBar\\";ControlPath += ButtonsControlBar->Controls[i]->Name;int ControlLeft = Registry->ReadInteger(ControlPath,"Left",ButtonsControlBar->Controls[i]->Left);int ControlTop = Registry->ReadInteger(ControlPath,"Top",ButtonsControlBar->Controls[i]->Top);int ControlHeight = Registry->ReadInteger(ControlPath,"Height",ButtonsControlBar->Controls[i]->Height+2);bool ControlVisible = Registry->ReadBool(ControlPath,"Visible",ButtonsControlBar->Controls[i]->Visible);BandList.push_back(TControlBandInfo(ButtonsControlBar->Controls[i],ControlLeft,ControlTop,ControlHeight,ControlVisible));}BandList.sort();std::list::iterator pos;for(pos = BandList.begin(); pos != BandList.end(); ++pos){pos->Control->Visible = false;}for(pos = BandList.begin(); pos != BandList.end(); ++pos){pos->Control->Top = pos->Top;pos->Control->Left = pos->Left;pos->Control->Visible = pos->Visible;}// zresetuj wymiary paska kontrolnegoTop = top;Left = left;Height = height;Width = width;}Podobnie jak w przypadku zapisu do Rejestru, fizyczny odczyt danych zokreœlonej lokalizacji nie przedstawia ¿adnego problemu, skomplikowananatomiast staje siê w³aœciwa interpretacja tych danych.Œwiadczy o tymchocia¿by sam rozmiar wydruku 3.42, którego zawartoœæ, choæ w wiêkszoœciwystarczaj¹ca czytelna, w dwóch przypadkach wymaga jednak dodatkowychwyjaœnieñ.Gdy panel wyœwietlacza pojawiæ ma siê w pozycji wydokowanej, nale¿y u¿yæ jegometody ManualFloat(), której parametrem jest prostok¹t okreœlaj¹cy miejscepojawienia siê kontrolki po jej wydokowaniu.Ustawienia zapisane w Rejestrzezawieraj¹ co prawda jego wspó³rzêdne (UndockLeft, UndockTop, UndockRight,UndockBottom) i wydawa³oby siê, ¿e nie ma nic prostszego, jak utworzyæ z nichrzeczony prostok¹t; niestety, pewne cechy specyficzne funkcji ManualFloat()przes¹dzaj¹ o tym, i¿ „lewa” i „górna” wspó³rzêdna przekazanego prostok¹taodnosz¹ siê nie do samej kontrolki, lecz obudowuj¹cego j¹ okna, czego nie mo¿napowiedzieæ o „dolnej” i „prawej” wspó³rzêdnej.Uzyskalibyœmy wiêczniekszta³cony prostok¹t, co przy tak drobiazgowych wyliczeniach, jakiezastosowaliœmy w przypadku naszego wyœwietlacza, jest nie do przyjêcia.Zamiasttego u¿yliœmy wiêc „lewej” i „górnej’ wspó³rzêdnej oraz niezale¿nie zapisanychrozmiarów samego wyœwietlacza (UndockWidth i UndockHeight):TRect UndockedRect(UndockLeft,UndockTop,UndockLeft + LCDPanel->UndockWidth,UndockTop + LCDPanel->UndockHeight);Tak naprawdê to nie mo¿na bezkrytycznie podchodziæ do ¿adnej danej zapisanej wRejestrze i to nawet nie z powodu ewentualnych przek³amañ czy b³êdów: kontrolkastworzona w œrodowisku o du¿ej rozdzielczoœci (np.1280´1024) mo¿e po prostunie zmieœciæ siê na ekranie o rozdzielczoœci du¿o mniejszej (np.640´480);dotyczy to szczególnie formularzy.Dlatego te¿ konieczna jest weryfikacjaka¿dej odczytanej wspó³rzêdnej i ka¿dego odczytanego rozmiaru – oto jak naszaaplikacja przeprowadza tak¹ weryfikacjê w stosunku do kontrolki wyœwietlacza:if(UndockRight > Screen->Width){int Offset = UndockRight - Screen->Width;UndockedRect.Right -= Offset;UndockedRect.Left -= Offset;if(UndockedRect.Left < 0) UndockedRect.Left = 0;}if(UndockBottom > Screen->Height){int Offset = UndockBottom - Screen->Height;UndockedRect.Bottom -= Offset;UndockedRect
[ Pobierz całość w formacie PDF ]