[ Pobierz całość w formacie PDF ]
.Metoda uruchamiana jest w momencie dodawania i usuwania przycisku.W dalszym ci¹gu mo¿na zmniejszyæ rozmiar paska poni¿ej rozmiarówpojedynczego przycisku}begin// pozycja pierwszego przyciskuif Index = 0 thenbeginTopAlign := 0;LeftAlign := 0;end;{ Przy niewystarczaj¹cej szerokoœci tworzony jest nastêpny wiersz }if (LeftAlign + FRunButtons[Index].Width) > Width thenbeginTopAlign := TopAlign + FRunButtons[Index].Height;LeftAlign := 0;end;FRunButtons[Index].Left := LeftAlign;FRunButtons[Index].Top := TopAlign;LeftAlign := LeftAlign + FRunButtons[Index].Width;end;end.Implementacja obiektu TRunBtnItemKonstruktor TRunBtnItem.Create() tworzy egzemplarz przycisku — TddgRunButton —i przypisuje wskazanie na niego polu FRunButton.Ka¿dy element kolekcji posiadaswój w³asny egzemplarz przycisku.Pewnego komentarza wymagaj¹ dwie poni¿szelinie konstruktora:FRunButton := TddgRunButton.Create(TRunButtons(Collection).FLaunchPad);FRunButton.Parent := TRunButtons(Collection).FLaunchPad;Pierwsza linia powoduje utworzenie obiektu TddgRunButton i ustanowienie relacjiw³asnoœci z nadrzêdnym paskiem narzêdziowym, który jest jednoczeœniew³aœcicielem kolekcji.Jak zapewne pamiêtasz, w³aœcicielem komponentu mo¿e byætylko inny komponent, czyli obiekt wywodz¹cy siê z klasy TComponent; anikolekcja, ani jej elementy nie spe³niaj¹ tego warunku, nie mog¹ byæ wiêcw³aœcicielami przycisków TddgRunButton.Pojawia siê tu jednak pewien problem.W³aœcicielem przycisku jest co prawdakomponent nadrzêdny (TddgLaunchPad), lecz tworzenie jego egzemplarza odbywasiê w konstruktorze elementu kolekcji — TRunBtnItem.Podczas zapisu formularzaw strumieniu, zostan¹ w nim zapisane równie¿ przyciski TddgRunButton; podczasodczytu formularza nast¹pi ich podwojenie — oprócz zestawu odczytanego zestrumienia powstanie drugi ich zestaw, utworzony przez konstruktory elementówkolekcji.St¹d wniosek, i¿ nale¿y zapobiec zapisywaniu przycisków w strumieniu;nale¿y w tym celu przedefiniowaæ metodê GetChildren() paska narzêdziowego tak,by zaw³aszczone przez niego komponenty klasy TddgRunButton nie by³y brane poduwagê:procedure TddgLaunchPad.GetChildren(Proc: TGetChildProc; Root: TComponent);varI: Integer;beginfor I := 0 to ControlCount - 1 doif not (Controls[i] is TddgRunButton)thenProc(TComponent(Controls[I]));end;Takie przedefiniowanie automatycznie zapobiega jeszcze jednej niepo¿¹danejrzeczy — mianowicie zwalnianiu przycisków przez pasek narzêdziowy podczas jegodestrukcji; przyciski s¹ zwalniane w destruktorach elementów kolekcji i niemo¿na zwalniaæ ich powtórnie.Druga z prezentowanych instrukcji konstruktora czyni pasek narzêdziowykontrolk¹ rodzicielsk¹ w stosunku do przycisków, co zapewnia utrzymanie ichw³aœciwej reprezentacji graficznej.Znaczenie pozosta³ych metod, bêd¹cych w wiêkszoœci metodami dostêpowymiw³aœciwoœci, wyjaœnione jest w komentarzach towarzysz¹cych kodowi Ÿród³owemu.Implementacja kolekcji TRunButtonsKonstruktor Create() po utworzeniu kolekcji przypisuje wskazanie na komponentnadrzêdny (którym jest pasek narzêdziowy) polu FLaunchPad; jest onowielokrotnie wykorzystywane w treœci modu³u.Metoda Update()wywo³ywana jest wówczas, gdy którykolwiek element kolekcjizasygnalizuje zmianê.Powoduje ona wywo³anie metody UpdateRunButton()paskanarzêdziowego, ustawiaj¹cej pewne jego „geometryczne” w³aœciwoœci, w efekcieczego nastêpuje ponowne rozmieszczenie przycisków na panelu paska.Pozosta³e metody s¹ metodami dostêpowymi w³aœciwoœci kolekcji; znaczeniewa¿niejszych z nich zosta³o wyjaœnione za pomoc¹ komentarzy.Implementacja paska narzêdziowego TddgLaunchPadKonstruktor i destruktor paska to procedury nieskomplikowane; utworzeniu(zwolnieniu) egzemplarza paska towarzyszy jednoczesne utworzenie (zwolnienie)kolekcji.Przedefiniowanie metody GetChildren() ma zwi¹zek z niepo¿¹danymi konsekwencjamifaktu, i¿ pasek narzêdziowy jest w³aœcicielem przycisków TddgRunButton; okonsekwencjach tych pisaliœmy omawiaj¹c implementacjê obiektów TRunBtnItem.Metoda UpdateRunButton() — a raczej jej iteracyjne wywo³anie — powodujeodœwie¿enie wygl¹du paska.Treœæ metody wyklucza „chowanie siê” przyciskówpoza pionowymi krawêdziami komponentu; mo¿liwe jest natomiast jego pionoweprzewijanie, jako ¿e wywodzi siê on z klasy TScrollBox.Edycja kolekcji i jej elementów w dialogowymedytorze w³aœciwoœciPo szczegó³owym opisie komponentu TddgLaunchPad, kolekcji TRunButtons oraz jejelementów TRunBtnItem, zaprezentujemy teraz edytor umo¿liwiaj¹cy manipulowaniezawartoœci¹ tej kolekcji, czyli dodawanie do niej i usuwanie z niej przyciskówTddgRunButton
[ Pobierz całość w formacie PDF ]