Programowanie w języku Delphi » Artykuły

Rave Reports - Visual Designer - podstawy

Wprowadzenie do Visual Designera


W tym artykule postaram się zaprezentować sposób raportowania w Rave Reports z użyciem narzędzia Visual Designer. Użytkownicy posługujący się wcześniej Quick Reports, domyślnym narzędziem raportowania wcześniejszych wersji Delphi, tworzyli raporty z wykorzystaniem własnego kreatora formularzy Delphi. Raporty były zapisywane w DFM, stanowiąc zasoby plików wykonywalnych. Sposób działania Rave Reports jest w tym względzie nieco inny. Dysponują one własnym kreatorem raportów i zapisują je z wykorzystaniem własnego formatu plików. Ma to pewne zalety. Raporty są "autonomiczne", to znaczy, że mogą być wykorzystywane lub uaktualniane niezależnie od aplikacji, a nawet mogą być udostępniane w intranecie lub Internecie za pomocą Nevrona Rave Report Server. Oczywiście, nadal można je zapisać w DFM formularza.

Ok, to spróbujmy stworzyć pierwszy raport za pomocą Visual Designera.

Aby rozpocząć pracę z Visual Rave Reports należy otworzyć Delphi 7 Enterprise, przejść na zakładkę Rave i umieścić na Formie dwa komponenty z tej zakładki:
- RvProject1
- RvSystem1

Ustaw właściwość Engine komponentu RvProject1 na RvSystem1.

RvProject to komponent, który tworzy łącze (link) między aplikacją a raportami, które opracowujemy.
RvSystem jest odpowiedzialny za ogólną konfigurację raportów - decyduje, która drukarka ma być użyta, określa marginesy, liczbę stron itd.

Teraz musimy otworzyć Rave Visual Designer. Można to zrobić w dwojaki sposób:
- klikamy dwa razy na komponent RvProject1
- klikamy prawym klawiszem myszy na komponent RVProject1 i z menu kontekstowego wybieramy "Rave Visual Reports"
Naszym oczom ukaże się Rave Visual Reports (w moim przypadku jest to Rave Reports 5.0), który wizualnie przypomina Delphi (patrz na rysunek poniżej).

<image>http://4programmers.net/bin/ravevisualreports1.jpg</image>

U góry znajduje się menu, pasek narzędzi i paleta składników (Component Pallete), która zawiera komponenty stosowane w raportach. Po lewej stronie jest inspektor obiektów (Object Inspector), który służy do ustawienia właściwości komponentów raportu. Pośrodku znajduje się Page Designer modułu Event Editor, a po lewej stronie jest bardzo przydatny widok drzewa projektu (Project Treeview). Czyli układ znany z Delphi:)

Ok, teraz trochę teorii:)

Plik Rave Project File może zawierać jeden lub więcej raportów. W ten sposób ich wspólne elementy mogą znajdować się w jednej lokalizacji, nazywanej Global Pages(do tego jeszcze powrócimy). Gdy rozwiniesz węzeł Report Library widoku drzewa projektu(Project Treeview), zobaczysz, że aktualnie pracujesz nad raportem nr 1 (Report1). Klikając jego ikonę, spowodujesz wyświetlenie właściwości w oknie inspektora obiektów.

Wystarczy teorii:). Zróbmy w końcu pierwszy raport.

1. Kliknij na Report1 w Tree View
2. w Inspektorze obiektów zmień jego nazwę na PierwszyRaport(nie mozna stosować spacji w nazwie) (właściwość Name).
3. Przejdź na kartę Standard palety składników, wybierz składnik Text i dodaj go do projektu.
4. Zmień właściwości tekstu i dostosuj rozmiar oraz położenie. Ja zrobiłem to w nastepujacy sposób:
   a. Zmieniłem właściwość Font obiektu Text na Arial,20
   b. we właściwości Text komponentu Text1 wpisałem "Pierwszy raport w Rave Visual Raports"
   c. zmieniłem właściwość Truncate komponentu Text1 na False

Rave nie posiada właściwości "auto size". Możesz skorzystać z właściwości zaokrąglania (Truncate), by uzyskać ten efekt - gdy wartość Truncate jest false, tekst zostanie wydrukowany w całości niezależnie od szerokości (Width) ustawionej w czasie projektowania.

I jeszcze jedna uwaga.
Domyślnie nie są wyświetlane zmiany właściwości Name, Pos i Size. Jeśli jednak chciałbyś je widzieć, kliknij prawym klawiszem myszy inspektora obiektów i odznacz pole "Exclude Name, Size and Pos changes" w menu kontekstowym.

Ok, już możemy obejrzeć nasz raport.
Z poziomu Rave Visual Reports można to zrobić na dwa sposoby:
- poprzez naciśnięcie klawisz F9,
- poprzez wybranie z menu File ->Execute Reports,

Wynik przedstawiony jest na rysunku poniżej.

<image>http://4programmers.net/bin/ravevisualreports2.jpg</image>

Ok, teraz przyłączmy raport do tworzonej aplikacji.

1. Zapiszmy plik raportu File ->Save as. Ja zapisałem plik pod nazwą RaveRaport1.rav.
2. Można już zamknąć Rave Visual Raports.
3. Powracamy do projektu tworzonego w Delphi.
4. Klikamy na komponent RvProject1 i we właściwości ProjectFile tego komponentu musimy odnaleźć przed chwilą zapisany plik RaveRaport1.rav.
5. Umieszczamy na Formie komponent Button1. Ja zmieniłem właściwość Caption na "Pokaż raport".
6. oprogramowujemy zdarzenie onClick komponentu Button1

procedure TForm1.Button1Click(Sender: TObject);
begin
    RvProject1.Execute;  //wywołanie raportu
end;


7. Zapisujemy wszystko i już możemy uruchamiać naszą aplikacje i ogladać stworzony przez nas raport.

I kolejna uwaga(chyba się powtarzam:)).
RvProject1.Execute zadziałało w tej chwili tylko dlatego, że mamy tylko jeden raport w tym projekcie. Gdyby raportów było więcej, należałoby najpierw wywołać SelectReport, aby wybrać raport przed uruchomieniem Execute, lub wywołać ExecuteReport bezpośrednio w odniesieniu do konkretnego raportu. Tak naprawdę kod obsługi zdarzenia onClick dla komponentu Button1 powinien wyglądać następująco:

procedure TForm1.Button1Click(Sender: TObject);
begin
    if RvProject1.SelectReport('PierwszyRaport',false) then
       RvProject1.Execute;
end;


SelectReport pierwszym parametrem jest nazwa raportu (to co wpisaliśmy we właściwości Name dla raportu podczas pracy w Rave Visual Designer). Drugi parametr określa czy jest to pełna nazwa:
- wartość False określa, że nie jest to pełana nazwa,
- wartość True określa, że zdefiniowaliśmy pełną nazwę,
Funkcja SelectReport zwraca True jeśli jest wszystko ok, lub False gdy coś się nie powiedzie.
Tak wiec w warunku jeśli jest wszystko ok to wyświetlamy raport, a gdyby coś było nie tak, to nie wyświetli się nic.

I kolejna uwaga:)
Jak już skompilujemy aplikację i zajdzie potrzeba zmiany czegoś w raporcie to otwieramy Rave Visual Raport nanosimy zmiany i zapisujemy - nie musimy kompilować ponownie aplikacji.


Interakcja z aplikacją


Jeżeli wcześniej pracowałeś z Quick Reports, możesz być przyzwyczajony do manipulowania obiektami w czasie rzeczywistym - zmiana pozycji, tekstu i widoczności (Position, Text i Visibility). W końcu, były to po prostu Obiekty(TObjects) Jest to możliwe również za pomocą Reve Reports, ale jest to nieco trudniejsze. Nie ma jednak powodów do niepokoju - Rave dostarcza innego rozwiązania tego problemu. Są nim parametry. Tak więc w swoich raportach możesz korzystać z parametrów. Możesz je zdefiniować korzystając z właściwości
- parametrów projektu,
- raportu,
- strony.
Parametry można zdefiniować w dowolnie wybranym z tych trzech miejsc - jest ich tyle po prostu dla łatwiejszego dostępu. Projekt i raport możesz wybrać jedynie posługując się widokiem drzewa projektu. Natomiast stronę możesz wybrać albo z widoku drzewa projektu, albo klikając jej tytuł nad kreatorem strony.
Jedną z możliwości wykorzystania parametrów jest ich wydruk. I tak na przykład, jeżeli tytuł raportu ma być zdefiniowany przez użytkownika, możesz przenieść go z aplikacji do raportu jako parametr

Ok, ale dość teorii, zobaczmy jak to działa w praktyce.

Stwórzmy nowy raport, aby zobaczyć jak działają parametry. Ten raport będzie bardzo podobny do pierwszego, jednak tekst będzie zdefiniowany przez użytkownika. Zabieramy się do pracy.

1. Otwórz Delphi
2. Umieść na Formie dwa Buttony
   a. ja zmieniłem właściwość Caption Button1 na "Pokaż raport 1" a Button2 na "Pokaż raport 2"
3. Przejdź na zakładkę Rave i umieść na Formie komponenty RvProject1 i RvSystem1
4. Znień właściwość Engine komponentu RvProject1 na RvSystem1
5. Zapisz projekt
6. Otwórz Rave Visual Designer (dwa razy kliknij na RvProject1)
7. Zmień nazwę raportu na RaportzPapametrami (właściwość Name w inspektorze obiektów)
8. Dodaj do raportu komponent DataText1 i zmień właściwość Font na Arial,20
   a. kliknij następnie na właściwość DataField. Otworzy się nowe okno Data Text Editor
   b. w polu Data Text (w oknie Data Text Editor) wpisz 'Raport przygotowany przez '+ Param.Imie. Imie będzie naszym parametrem. Teraz trzeba stworzyć parametr.
9. Aby stworzyć parametr Imie kliknij lewym klaiwszem myszy na RaveProject w Project Treeview(drzewie komponentów)
10. Następnie w Object Inspektorze kliknij właściwość Parameters. Otworzy się nowe okno Strings Editor
11. W oknie Strings Editor wpisz "Imie" i naciśnij Ok
12. Zapisz raport jako RaveRaport2.rav
13. Przejdź do Delphi
14. Ustaw właściwość ProjectFile komponentu RvProject1 na nowostworzony plik RaveRaport2.rav
15. Oprogramuj zdarzenia onClick dla komponentów Button1 i Button2

procedure TForm1.Button1Click(Sender: TObject);
begin
    RvProject1.Open; //otwieramy RvProject
    //sprawdzamy czy raport o nazwie RaportzParametrami da się wyświetlić
    if RvProject1.SelectReport('RaportzParametrami',False) then
    begin    //jeśli tak to...
       RvProject1.SetParam('Imie','Artura M.'); //ustawiamy parametr Imie na "Artur M."
       RvProject1.Execute;  //wyświetlamy raport
    end;
    RvProject1.Close;  //zamykamy rvProject1
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
    RvProject1.Open;
    if RvProject1.SelectReport('RaportzParametrami',False) then
    begin
       RvProject1.SetParam('Imie','Mistrza'); //ustawiamy parametr Imie na "Mistrza"
       RvProject1.Execute;
    end;
    RvProject1.Close;
end;


Widok raportu z parametrem Imie ustawionym na "Artura M."

<image>http://4programmers.net/bin/ravevisualreports3.jpg</image>


Widok raportu z parametrem Imie ustawionym na "Mistrza"

<image>http://4programmers.net/bin/ravevisualreports4.jpg</image>


A oto cały kod programu

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RpBase, RpSystem, RpDefine, RpRave, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    RvProject1: TRvProject;
    RvSystem1: TRvSystem;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
    RvProject1.Open;
    if RvProject1.SelectReport('RaportzParametrami',False) then
    begin
       RvProject1.SetParam('Imie','Artura M.');
       RvProject1.Execute;
    end;
    RvProject1.Close;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
    RvProject1.Open;
    if RvProject1.SelectReport('RaportzParametrami',False) then
    begin
       RvProject1.SetParam('Imie','Mistrza');
       RvProject1.Execute;
    end;
    RvProject1.Close;
end;
 
end.


I kolejna uwaga
Gdybyś dodał nowy raport do pliku Raveraport2.rav (można tak zrobić - gdy skończysz projektować jeden raport wybierz File->New Raport i możesz projektować drugi raport). Możesz posłużyć się poleceniem RvProject1.GetReportList, by uzyskać listę dostępnych raportów i dodać ją na przykład do ComboBox lub RadioGroup. Ułatwi to użytkownikowi wybór raportów.


Ustawienia globalne (Global pages)

Gdy pewne części raportów są wspólne dla dwóch lub więcej raportów, możesz je umieścić w "global pages". Wyobraźmy sobie, że mamy nagłówek raportu z autorem raportu i datą wydruku raportu. Chcielibyśmy, aby nagłówek znalazł się w każdym raporcie. Jak to zrobić?

Otwieramy Delphi i tworzymy interfejs aplikacji:
- dwa Buttony
- RvProject1 z karty Rave
- RvSystem1 z karty Rave
Zmieniamy właściwość Engine RvProject1 na RvSystem1, zapisujemy wszystko i klikamy dwa razy na RvProject aby otworzyć Rave Visual Designer.

Dodaj teraz do projektu tworzonego w Visual Designerze "global page", posługując się menu File/New Global Page, lub skrótem na pasku zadań.

Ja na karcie GlobalPage1 umieściłem komponent Section1 z palety Standard i na nim komponent Text1 - zmieniłem jego właściwosć Text na "Global Pages - komponenty Section, Text, DataText i FontMaster". Dodatkowo umieściłem dwa komponenty DataText1 i DataText2, kliknąłem na ich właściwość DataField i w nowym oknie(Data Text Editor) w polu Data Text wpisałem 'Autor raportu: '+ Param.Imie dla pierwszego komponentu i 'Dzisiejsza data: ' + Param.Data dla drugiego komponentu. Umieściłem dodatkowo dwa komponenty FontMaster (komponentów tych wogóle nie widać nawet podczas projektowanie raportu - można je odnaleźć jedynie w oknie Project Treeview) i dla pierwszego ustawiłem właściwość Font na Arial,16 a dla drugiego na Arial,12. I na koniec komponentowi Text1 zmieniłem właściwość FontMirror na FontMaster1 a komponentom DataText1 i DataText2 właściwość FontMirror na FontMaster2. W ten sposób przypisałem krój i wielkość czcionki do tych komponentów zdefiniowaną w komponentach FontMaster. Po co to robić? Zamiast zmieniać właściwości czcionki wielu elementów nagłówka na te same, wystarczy powiazać je ze składnikiem FontMaster, dostępnym na karcie Standard palety składników i tam ustawić właściwości czcionki. W ten sposób łatwiej będzie zmienić właściwości czcionki w przyszłości, gdy zajdzie taka potrzeba. Powiedzmy że mamy 30 komponentów Text (taka sytuacja też jest możliwa) i wszystkie mają mieć taki sam wygląd - gdy w przyszłości zajdzie potrzeba zmiany wyglądu wszystkich komponentów Text to wystarczy zmienić czcionkę tylko w komponencie FontMaster, a nie w każdym z 30 komponentów Text.
Ok, zostało nam jeszcze zdefiniowanie parametrów użytych w nagłówku Global Pages (są to parametry Imie i Data). Robiliśmy to juz raz - ale przypomnę. Klikamy na GlobalPages1 w oknie Project Treeview i wybieramy Parameters w Inspekorze Obiektów. W oknie które się ukaże (Strings Editor) w kolejnych liniach wpisujemy Imie i Data (tak jak jest to pokazane na rysunku poniżej)

<image>http://4programmers.net/bin/ravevisualreports5.jpg</image>


Następnie stwórzymy dwa raporty. Jak na rysunkach poniżej:

<image>http://4programmers.net/bin/ravevisualreports6.jpg</image>

<image>http://4programmers.net/bin/ravevisualreports7.jpg</image>


Na samej górze każdego raportu umieść tylko komponent Section z karty Standard (bez żadnych innych komponentów) - poniżej możesz umieszczać co tylko ci się podoba - ja w Report1 umieściłem komponenty z karty Drawing:
- Line component - linia, którą można w dowolny sposób obracać, wydłużać itp
- HLine component - linia pozioma
- VLine component - linia pionowa
z karty Standard:
- umieściłem kilka komponentów Text
- i kilka komponentów FontMaster
z karty Bar Code:
- Code39BarCode component - jeden z dostępnych na tej karcie kodów paskowych

Na drugim raporcie Report2 umieściłem
- 2 komponenty Bitmap i wczytałem do nich bitmapę poprzez właściwość Image(taka sama procedura postępowania jak w przypadku komponentu Image w Delphi - tylko że w Delphi bitmapę wczytuje się do właściwości Picture)
- komponenty Vline i HLine
- komponent Text

Ok i teraz bardzo ważna sprawa. W obu raportach należy zmienić właściwość Mirror komponentu Section1, tego który powinien znajdować się na samej górze obu raportów) na GlobalPage1.Section1 - w ten sposób przypisujemy stworzony w GlobalPages1 nagłówek do obu raportów - oba raporty będą mieć identyczny nagłówek.
Sekcje to logiczne grupy komponentów. Można ich używać do grupowania komponentów w celu ich łatwego przemieszczania w obrębie raportu
Ok, teraz wracamy do Delphi i oprogramowujemy zdarzenia naciśnięcia przycisków. Nier ma tu nowych rzeczy, więc nie powinno być problemów ze zrozumieniem kodu.

procedure TForm1.Button1Click(Sender: TObject);
begin
    RvProject1.Open;
    if RvProject1.SelectReport('Report1',False) then
    begin
       RvProject1.SetParam('Imie','Artura M.');//definiowanie parametru Imie
       RvProject1.SetParam('Data',DateToStr(date));//definiowanie parametru Data
       RvProject1.Execute;
    end;
    RvProject1.Close;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
    RvProject1.Open;
    if RvProject1.SelectReport('Report2',False) then
       RvProject1.Execute;
    RvProject1.Close;
end;


A cały kod programu powinien wyglądać tak.
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RpBase, RpSystem, RpDefine, RpRave, StdCtrls, RpRender,
  RpRenderPDF, RpRenderCanvas, RpRenderPrinter;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    RvProject1: TRvProject;
    RvSystem1: TRvSystem;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
    RvProject1.Open;
    if RvProject1.SelectReport('Report1',False) then
    begin
       RvProject1.SetParam('Imie','Artura M.');
       RvProject1.SetParam('Data',DateToStr(date));
       RvProject1.Execute;
    end;
    RvProject1.Close;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
    RvProject1.Open;
    if RvProject1.SelectReport('Report2',False) then
       RvProject1.Execute;
    RvProject1.Close;
end;
 
end.


Przygotowane przeze mnie raporty wyglądają w następujący sposób.

<image>http://4programmers.net/bin/ravevisualreports8.jpg</image>

<image>http://4programmers.net/bin/ravevisualreports9.jpg</image>


Zmienne po inicjalizacji (Post-Initialize Variables)


Zmienne po inicjalizacji, to zmienne, których wartość staje się znana dopiero po wydrukowaniu raportu. Brzmi to troche dziwnie:), ale pomyśl choćby o liczbie stron raportu. Poznasz ją dopiero, gdy wydrukujesz raport. W rzeczywistości TotalPages to zmienna raportu, która może być bez problemu drukowana za pomocą komponentów DataTexts, podobnie jak to robiliśmy w przypadku Parameters.


Druk warunkowy (Conditional Printing)


Czasami zachodzi potrzeba wydrukowania tylko części raportu, w zależności od warunków. Rave dysponuje bardzo skutecznym rozwiązaniem w tym zakresie. Można warunkowo tworzyć lustrzane kopie sekcji, posługując się wartościami pól lub parametrami.
Jak to wygląda w praktyce? Zaczynamy nowy projekt - użytkownik będzie mógł wybrać typ nagłówka(raport bez nagłówka, raport z nagłówkiem pierwszym, raport z nagłówkiem drugim)

1. Otwórz Delphi.
2. Dodaj do Formy RvSystem1 i RvProject1 z kary Rave.
3. Ustaw właściwość Engine RvProject1 na RvSystem1
4. Dodaj do Formy komponent Button1 i zmień właściwość Caption na "Pokaż raport"
5. Dodaj do Formy ComboBox1. Skasuj zawartość właściwość Text i do Items dodaj 3 możliwości:
   Raport bez nagłówka
   Raport z imieniem
   Raport z dzisiejszą datą
6. Zapisz projekt
7. Otwórz Rave Visual Designer klikajac dwa razy na RvProject1
8. Dodaj do projektu raportu komponent Text1 (z karty Standard) i zmień jego właściwości Text na "Raport z wydrukiem warunkowym", Font na Arial,20
9. Stwórz nową Sekcję File->New Global Page
10. Umieść w ustawieniach globalnych komponent Section1 z karty Standard i DataText1 z karty Report
11. Ustaw właściwość Fonts komponentu DataText1 na Arial,20 i kliknij dwa razy na właściowość DataField i w oknie Data Text Editor w polu Data Text wpisz 'Raport przygotowany przez '+Param.Imie
12. Stwórz parametr Imie. Kliknij GlobalPages1 w Project Treeview, a nastepnie dwa razy na właściwość Parameters i w oknie String Editor wpisz "Imie"
13. Stwórz nową Sekcję File->New Global Page
14. Umieść w ustawieniach globalnych komponent Section1 z karty Standard, komponent Rectangle z karty Drawing i DataText1 z karty Report
15. Ustaw właściwość Fonts komponentu DataText1 na Arial,20 i kliknij dwa razy na właściowość DataField i w oknie Data Text Editor w polu Data Text wpisz 'Raport stworzony '+Param.Data
16. Stwórz parametr Data. Kliknij GlobalPages2 w Project Treeview, a nastepnie dwa razy na właściwość Parameters i w oknie String Editor wpisz "Data"
17. Dodaj do raportu Parametr Rodzaj_naglowka (załóżmy, że będzie on przyjmował wartości naglowek_pierwszy i naglowek_drugi)
18. Dodaj do naszego raportu (Page1 w Report1) komponent DataMirrorSection1 (odpowiednik komponentu Section) i kliknij dwa razy właściwość DataMirrors i ustaw wszystko tak jak na rysunku poniżej(aby stworzyć nową linię w Data Mirrors kliknij przycisk ADD i w Field Value wpisz naglowek_pierwszy, a w Mirrored Section wybierz GlobalPages1.Section1, naciśnij ponownie ADD i to samo zrób dla naglowek_drugi i Global2.Section1)
<image>http://4programmers.net/bin/ravevisualreports10.jpg</image>

19. Kliknij dwukrotnie na właściwość DataField komponentu DataMirrorSection1 i w nowootworzonym oknie Data Text Editor wybierz w polu Project Parameters wartość Rodzaj_naglowka i naciśnij Insert Parameter (wtedy w polu Data Text pojawi się Param.Rodzaj_naglowka) lub wpisz w pole Data Text Param.Rodzaj_naglowka
20. Zapisz raport w pliku RaveReport4.rav
21. Wróć do Delphi ustaw właściwość ProjectFile komponentu RvProject1 na plik RaveReport4.rav i oprogramuj zdarzenie onClick dla komponentu Button1

procedure TForm1.Button1Click(Sender: TObject);
begin
    RvProject1.Open;//otwieramy RvProject
    if RvProject1.SelectReport('Report1',False) then//wybieramy raport który chcemy pokazać
    begin
    case Combobox1.ItemIndex of //jeśli w polu combobox użytkownik wybierze...
      1: begin //...wartość "Raport z Imieniem" to...
            RvProject1.SetParam('Imie','Artura');//...ustawiamy parametr Imie
            RvProject1.SetParam('Rodzaj_naglowka','naglowek_pierwszy');//...i ustawiamy parametr Rodzaj_naglowka na "naglowek pierwszy"
         end;   
      2: begin//...wartość "Raport z dzisiejszą datą" to...
            RvProject1.SetParam('Data',DateToStr(Date));//...ustawiamy parametr Data na dzisiejszą datę
            RvProject1.SetParam('Rodzaj_naglowka','naglowek_drugi');//...i ustawiamy parametr Rodzaj_naglowka na "naglowek drugi"
         end;
    end;
    RvProject1.Execute; // pokaż raport
    end;
    RvProject1.Close; // zamknij RvProject1
end;


Jeśli użytkownik w polu ComboBox1 nie wybierze nic albo wybierze "Raport bez nagłowka" to parametr "Rodzaj_naglowka" nie jest ustawiany i raport drukowany jest bez jakiegokolwiek nagłówka. Kod całego programu przedstawiam poniżej.

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RpBase, RpSystem, RpDefine, RpRave, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    ComboBox1: TComboBox;
    RvProject1: TRvProject;
    RvSystem1: TRvSystem;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
    RvProject1.Open;
    if RvProject1.SelectReport('Report1',False) then
    begin
       case Combobox1.ItemIndex of
         1: begin
               RvProject1.SetParam('Imie','Artura');
               RvProject1.SetParam('Rodzaj_naglowka','naglowek_pierwszy');
            end;
         2: begin
               RvProject1.SetParam('Data',DateToStr(Date));
               RvProject1.SetParam('Rodzaj_naglowka','naglowek_drugi');
            end;
       end;
       RvProject1.Execute;
    end;
    RvProject1.Close;
end;
 
end.


A oto widok raportu, gdy użytkownik wybrał "Raport bez nagłówka" lub gdy nie wybrał nic w polu ComboBox1

<image>http://4programmers.net/bin/ravevisualreports11.jpg</image>



... gdy użytkownik wybrał "Raport z imieniem"

<image>http://4programmers.net/bin/ravevisualreports12.jpg</image>


... gdy użytkownik wybrał "Raport z dzisiejsżą datą"

<image>http://4programmers.net/bin/ravevisualreports13.jpg</image>


Ok, to by było na tyle, jeśli chodzi o podstawy Rave Visual Designer'a. Mam nadzieję, że od tej pory nie będzie juz problemów z tworzeniem raportów w Delphi po przeczytaniu poprzedniego mojego artykułu (http://4programmers.net/article.php?id=602) i tego myślę, że powinniście dać sobie radę ze stworzeniem raportów w Rave Reports - bardziej "łopatologicznie" juz nie mogłem tego problemu przedstawić - jak znajdę czas to napiszę jeszcze kolejne arty na temat zaawansowanych funkcji Rave Reports. Pozdrawiam i czekam na Wasze komentarze.

Mozecie ściagnać wszystkie prezentowane z tym arcie programy - aby wszystko działało na waszych kompach to pozmieniajcie tylko właściwość ProjectFile dla komponentu RvProject1 na wasze ścieżki, nio chyba, że umieścicie je w takiej samej lokalizacji jak u mnie :) (H:\Documents and Settings\hawk\Pulpit\Rave - Visual Designer\)

10 komentarzy

duf 2011-05-26 11:53

Świetny start. A jak na komponencie BMP dynamicznie wstawiać tekst? Wczytałem plik .bmp do komponentu i jest to formularz. Teraz chciałbym go z poziomu programu wypełnić dynamicznie i umieścić w raporcie. Czy muszę w każdym polu formularza umieścić komponent DataText z parametrem np Param.text i z poziomu programu nadawać im różne wartości tekstowe? Czy może jest jakiś inny prostszy sposób. Dziękuję.

czarekg 2010-05-11 09:55

W celu weliminowania pojawiania sie okna wyboru urządzenia (preview, printer, file) po uruchomieniu naszego programu nalezy w inspektorze obiektow dla komponentu RvSystem rozwinac pozycje SystemSetups a nastepnie ustawic wartosc ssAllowSetup na false. Z poziomu kodu programu nalezy to zrobic w nastepujacy sposob (zakladajac, ze komponent nazywa sie odpowiednio RvSystem1).

RvSystem1.SystemSetups:= RvSystem1.SystemSetups - [ssAllowSetup]; - wylaczone okienko wyboru urzadzenia.

abix 2007-05-02 15:49

Art na 5+
Wszystko super ale... Przy wykonaniu  .Execute pokazuje mi się okienko wyboru urządzenia.
Czy wie ktoś jak można, bezpośrednio z kodu wywołać  Preview?
Mam RaveReports 7.5BE

masterO 2006-10-03 08:54

To sa pierodly nam jest potrzebny jak wydrukowac MASTER/DETAIL report
i btw mila kopia: http://www.borland.pl/tech/wprowadzenie_do_Rave_Reports_1.shtml
Jest to wprowadzenie do Rave Reports. Część I opisuje sposób pracy z raportami na bazie kodu. Autor - Leonel Togniolli NICE

luki1000 2006-07-18 11:27

A jak umieścić dane z Bazy danych FIREBIRD ??

keinxor 2006-03-13 06:48

Naprawde super art, tak trzymaj !!!

neves 2005-02-22 15:45

Daje 6 ;) bo art jest  dobry i w Pl necie jest zapotrzebowanie na takie artykóły.

brodny 2005-02-21 19:07

Taak :) I obrazkami nas zmusza do czytania ;P

jas_dream 2005-02-21 19:00

fajne te komponenty