[ Pobierz całość w formacie PDF ] .My zaś DecisionGraphdodamy do formularza CustomerCTReport, skonstruowanego wcześniej.Skorzystamy przy tym z komponentów DecisionCube istniejących już naformularzu.By do formularza CustomerCTReport dodać nowy wykres tego rodzaju,należy wykonać następujące czynności:1.Naciśnij SHIFT+F12 i załaduj CustomerCTReport, wybierając go z listyformularzy.2.Właściwość Align komponentu DecisionGrid zmień na alTop i podnieśjego dolną krawędz tak, by zajmował on jedynie około połowy wolnegomiejsca w środkowej części formularza.3.W niezajętej strefie formularza, zwolnionej właśnie przez komponentDecisionGrid, umieść komponent DecisionGraph i ustaw jegowłaściwość Align na alClient.Powinien wówczas zająć resztę wolnegomiejsca na formularzu.4.Jego DecisionSource ustaw na znajdujący się na formularzu komponentDecisionSource.Bezpośrednio po tym powinien wyświetlić się nowywykres słupkowy.5.Zmodyfikuj nowy wykres, klikając go dwukrotnie, a następnie w edytorzeklikając fiszkę Titles.Tytuł (Title) wykresu zmień na Sales byCountry and Year, po czym kliknij Close.Nasz nowy wykres jest już gotowy.Jako etykiet dla osi X i słupków używa on krawędziswego komponentu DecisionCube.Pola SUM kostki używa jako osi Y.Zobaczmy teraz, jak nowy wykres wygląda w fazie wykonania.Zapiszmy nasząpracę, uruchommy aplikację REPORTS i kliknijmy przycisk Preview dla raportuSales by Country.Rysunek 19.12 pokazuje, co powinniśmy wtedy zobaczyć.Rozdział 19 Raporty 605Rysunek 19.12.Nasz nowyDecisionGraphw fazie wykonania.By przekonać się, jak ściśle powiązane są ze sobą nasze komponentyDecisionGrid iDecisionGraph, przeciągnijmy w komponencieDecisionPivot kolumnę Order_Date ponad kolumną Country i upuśćmyją z jej prawej strony.Będzie to miało taki skutek, że kolumny zamienia sięmiejscami (na co wskazuje kursor myszy), co z kolei przekręci tabelę.Zauważmy, że gdy obracamy DecisionCube, zmianie ulega zarówno tabela, jaki wykres - tak jak to pokazano na rysunku 19.13.Rysunek 19.13.KomponentDecisionPivotmoże obracaćzarównoDecisionGrid, jaki DecisionGraph.Nasz nowy wykres jest teraz w pełni ukończony.Wychodzimy z aplikacjiREPORTS i powracamy do Delphi.Wzbogacanie raportówPonieważ pamiętaliśmy, by możliwie wiele naszych raportów oprzeć na wspólnym przodku , wzbogacenie ich en masse jest już tylko drobnostką.Wykorzystując606 Część IVokoliczność, że wszystkie one wywodzą się z klasy CustomerReport, doobszaru tytułowego każdego raportu dodamy systemową nazwę użytkownikaosoby, generującej raport.Aby na naszych raportach umieścić pole z nazwą użytkownika, trzeba wykonaćnastępujące kroki:1.Załaduj CustomerReport z powrotem do edytora formularzy Delphi.2.Dwa komponenty QRLabel umieść po prawej stronie obszaru tytułowegow jednej linii z datą wydruku raportu.Pierwszy z nich nazwijUserNameLabel, drugi laUserName.Ponieważ komponenty te zostanąodziedziczone przez inne formularze, muszą mieć unikalne nazwy wśródwszystkich formularzy hierarchii.Zakładanie, że domyślne nazwy nadawaneprzez Delphi na jednym formularzu nie będą w konflikcie z takimiż nazwami nainnych, nie jest bynajmniej bezpieczne.3.Kontrolki te umieść obok siebie, przy czym prawa kontrolka powinna kończyćsię na prawym marginesie raportu.4.Ustaw Caption etykiety UserNameLabel na User Name:.WłaściwośćAlignment etykiety laUserName ustaw na taRightJustify.5.Dwukrotnie kliknij zdarzenie OnPrint komponentu laUserNamei w następujący sposób zmodyfikuj procedurę obsługi zdarzenia:procedurę TListReport.laUserNamePrint(sender: TObject; varValue: String);varMaxNameLen : Integer;beginMaxNameLen := 30;SetLength(Value, MaxNameLen);GetUserName(PChar(Value), MaxNameLen);SetLength(Value, Pred(MaxNameLen));//Nazwa powraca jako łańcuch zakończony zeremend;Podprogram ten, by nadać wartość przekazanemu mu parametrowi Value,wywołuje procedurę API Windowsa o nazwie GetUserName.To, co zostanieumieszczone w Value, zostanie wydrukowane w raporcie.Należy zwrócić uwagęna konwersję typu (typecasting), konieczną dla przekazania Value do proceduryjako łańcucha w stylu C.Po powrocie z GetUserName zmienna MaxNameLen(w której GetUserName umieścił ilość bajtów przekopiowanych do Value)zostaje użyta do nastawienia długości Value przed powrotem z kodu obsługizdarzenia.Jest to w istocie środek zabezpieczający służący zapewnieniu, żełańcuch będzie poprawnie zakończony.Rozdział 19 Raporty 607By ujrzeć efekt naszych modyfikacji, uruchamiamy ponownie aplikację REPORTSi wchodzimy do podglądu niektórych z raportów, opartych na CustomerReport,.Zobaczymy, że z wyjątkiem raportu krzyżowego, każdy z nich ma terazpole użytkownika w prawym górnym rogu.Choć dodaliśmy je tylko jeden razw jednym miejscu, to zmiana ta przeniosła się na wszystkie formularze potomne.Wyobrazmy sobie, ile pracy można by zaoszczędzić, gdyby wszyscy programiściaplikacji Delphi projektowali systemy w pełni korzystające z tej niezwykleefektywnej właściwości.Na rysunku 19.14 widzimy nasz Raport listowyo klientach z dodanym nowym polem.Rysunek 19.14.Dziękidziedziczeniuformularzy możnadaleko sięgającychzmian dokonaćw przysłowiowąsekundę
[ Pobierz całość w formacie PDF ] zanotowane.pldoc.pisz.plpdf.pisz.plmikr.xlx.pl
|