W naszych poprzednich artykułach w ramach programu edukacyjnego "Akademik" nauczyliśmy się instalować FastReportw Lazarusie, opanowaliśmy pracę z diagramami, wykresami i kodami kreskowymi, oraz połączyliśmy raport z danymi. Teraz zajmiemy się formularzami dialogowymi.
Często trzeba ustawić pewne parametry lub przekazać dane przed wyświetleniem raportu. Oczywiście, można to zrobić przy pomocy środowiska programistycznego, ale FastReport posiada własne środki do projektowania form dialogowych. Poza standardowymi stronami, możesz w swoim raporcie wykorzystać kilka form dialogowych.
Aby utworzyć nowy formularz należy użyć przycisku w przyborniku projektanta - dodaje on nową stronę do raportu. Po przejściu na stronę z formularzem dialogowym zmieni się pole operacyjne projektanta - teraz jest to formularz, na którym można umieszczać obiekty - elementy sterujące.
Jak widać na rysunku, proces modelowania formularza dialogowego jest podobny do pracy z formularzami w każdym nowoczesnym środowisku programistycznym. Formularz dialogowy posiada specjalną siatkę, która pozwala wygodnie rozmieszczać na nim obiekty.
Elementy kontrolne
Obiekty formularza dialogowego są standardowe dla wszystkich nowoczesnych środowisk programistycznych. Aby umieścić element sterujący, należy kliknąć obiekt, a następnie odpowiednie miejsce na formularzu.
Element |
Tytuł |
Tytuł |
|
TfrxLabelControl |
Element kontrolny służy do wyświetlania objaśnień na formularzu dialogowym. |
|
TfrxEditControl |
Element sterujący służy do wprowadzania wiersza tekstu z klawiatury. |
|
TfrxMemoControl |
Element sterujący służy do wprowadzania kilku linii tekstu z klawiatury. |
|
TfrxButtonControl |
Elementem sterującym jest przycisk. |
|
TfrxCheckBoxControl |
Elementem sterującym jest flaga, która może być włączona lub wyłączona. Obok flagi wyświetlane jest objaśnienie. |
|
TfrxRadioButtonControl |
Elementem sterującym jest analog klucza przełączającego z zależnym mocowaniem. Z tego powodu nie jest on używany samodzielnie. |
|
TfrxListBoxControl |
Elementem sterującym jest lista linii z możliwością wyboru jednej z nich. |
|
TfrxComboBoxControl |
Elementem sterującym jest rozwijana lista linii z możliwością wyboru jednej z nich. |
|
TfrxPanelControl |
Elementem sterującym jest panel, który służy do połączenia kilku elementów sterujących. |
|
TfrxGroupBoxControl |
Elementem sterującym jest panel z objaśnieniem, który służy do połączenia kilku kontrolek. |
|
TfrxPageControl |
Kontrolka pozwala na połączenie kilku zakładek zawierających różne kontrolki na tym samym formularzu podczas procesu projektowania. |
|
TfrxDateEditControl |
Elementem sterującym jest pole do wprowadzania daty za pomocą rozwijanego kalendarza. |
|
TfrxImageControl |
Elementem sterującym jest obraz w formacie BMP, ICO, WMF lub EMF. |
|
TfrxBevelControl |
Element kontrolny służy do formatowania formularza dialogowego. |
|
TfrxBitBtnControl |
Elementem sterującym jest przycisk z obrazkiem. |
|
TfrxSpeedButtonControl |
Elementem sterującym jest przycisk z obrazkiem. |
|
TfrxMaskEditControl |
Elementem sterującym jest pole do wprowadzania danych według ustalonego szablonu. |
|
TfrxCheckListBoxControl |
Elementem sterującym jest lista linii z flagami. |
|
DBLookupComboBox |
Elementem sterującym jest lista pól wybranej kolumny w tabeli. |
Raport “Hello, World!”z formularzem dialogowym
Teraz, używając formularza dialogowego, utworzymy raport wyświetlający okno powitania przed jego utworzeniem. Aby to zrobić:
- Utwórz nowy raport i dodaj do niego formularz dialogowy.
- Umieść obiekty TfrxLabelControl, TfrxButtonControl na formularzu.
- Ustawianie właściwości obiektów:
TfrxLabelControl: Caption = 'Hello, World!' TfrxButtonControl: Caption = 'OK' Default = True ModalResult = mrOk
Dla formularza ustaw właściwość BorderStyle = bsDialog.
Po zakończeniu ustawiania formularza dialogowego wróć do strony raportu i umieść w niej obiekt "Text" z tekstem w środku. Uruchomienie wykonania raportu i wyświetlenie formularza:
Jeśli klikniesz przycisk OK, raport zostanie utworzony i wyświetlony. Jeżeli zamkniesz okno przyciskiem krzyżyka, to raport nie zostanie zbudowany. Tak działa algorytm dialogu w FastReport: jeżeli są dostępne formularze dialogowe, to raport zostanie utworzony tylko w przypadku, jeżeli każdy formularz został zamknięty przyciskiem OK, czyli został zwrócony ModalResult = mrOk. Dlatego ustawimy właściwość ModalResult naszego przycisku na równą mrOk.
Wprowadzanie parametrów i przekazywanie ich do raportu
Skomplikujmy nasz przykład, aby pokazać, w jaki sposób można przekazać wartości wprowadzone do formularza dialogowego do raportu. W tym celu skomplikujemy nasz formularz w następujący sposób:
Na stronie raportu umieszczamy obiekt "Text" z następującą treścią w środku:
You've entered: [Edit1.Text]
Uruchom raport i zobacz, że parametr, który wprowadziliśmy jest wyświetlany poprawnie. Inne obiekty formularza dialogowego mogą być adresowane w ten sam sposób. Ponieważ każdy obiekt ma unikalną nazwę w ramach projektu, może być użyty w dowolnym miejscu dokumentu.
Współdziałanie elementów sterujących
Za pomocą skryptu można w prosty sposób zaimplementować logikę funkcjonowania formularza dialogowego, np. interakcję pomiędzy jego kontrolkami. Rozważmy prosty przykład. Modyfikujemy nasz formularz w następujący sposób:
Dwukrotne kliknięcia na obiekt "CheckBox" – stworzy obsługę zdarzenia OnClick. Napisz następujący kod:
PascalScript: | |
1 2 3 4 |
procedure CheckBox1OnClick(Sender: TfrxComponent); begin Button1.Enabled := not CheckBox1.Checked; end; |
C++ Script: | |
1 2 3 4 |
void CheckBox1OnClick(TfrxComponent Sender) { Button1.Enabled = !CheckBox1.Checked; } |
Po uruchomieniu raportu warto sprawdzić, jak przycisk reaguje na zmianę stanu flagi.
Kilka formularzy dialogowych
Rozważmy, jak działa raport z dwoma formularzami dialogowymi. Utwórzmy raport z dwoma oknami dialogowymi i jedną stroną:
Pierwszy formularz dialogowy:
Drugi formularz dialogowy:
Dla przycisków OK i Cancel ustawiamy właściwości ModalResult (odpowiednio mrOk i mrCancel). Teraz uruchamiamy raport. Najpierw będziemy musieli odpowiedzieć na pytania z pierwszego okna dialogowego (imię, czy masz dzieci), a następnie, po kliknięciu przycisku OK - z drugiego (imiona dzieci). Po kliknięciu przycisku OK w drugim oknie dialogowym, raport zostanie zbudowany. Tak działa rdzeń FastReport - jeżeli jest kilka okien dialogowych, to są one wyświetlane w kolejności ich wytworzenia i każde następne okno dialogowe zostanie wyświetlone po kliknięciu przycisku OK w poprzednim oknie dialogowym (z właściwością ModalResult = mrOk). Jeżeli którekolwiek z okien dialogowych zostanie anulowane (przy pomocy przycisku Anuluj lub ikony krzyżyka w pasku tytułowym), to wytwarzanie raportu zostanie zatrzymane.
Zarządzanie formularzami raportów
W poprzednim przykładzie, oba formularze dialogowe są wyświetlane niezależnie od tego, czy zaznaczyliśmy flagę “Have children”czy nie. Teraz pokażemy, jak ukryć drugie okno dialogowe w przypadku, gdy ta flaga nie jest zaznaczona. W tym celu utworzymy handler OnClick dla przycisku OK w pierwszym oknie dialogowym (kliknij dwukrotnie na przycisk, aby utworzyć handler):
PascalScript: | |
1 2 3 4 |
procedure Button1OnClick(Sender: TfrxComponent); begin DialogPage2.Visible := CheckBox1.Checked; end; |
C++Script: | |
1 2 3 4 |
void Button1OnClick(TfrxComponent Sender) { DialogPage2.Visible = CheckBox1.Checked; } |
Ten kod ukrywa drugi formularz dialogowy (DialogPage2), jeżeli flaga nie jest zaznaczona. Jeśli uruchomimy wykonywanie raportu, zobaczymy, że wszystko działa poprawnie.
Inny sposób zarządzania formularzami polega na wykorzystaniu zdarzenia raportu OnRunDialogs. Aby wytworzyć handler tego zdarzenia należy wybrać obiekt Raport w drzewie raportów lub w inspektorze obiektów i przejść do zakładki "Zdarzenia" w inspektorze. Podwójne kliknięcie na zdarzenie OnRunDialogs utworzy odpowiedni handler.
W handlerze wpisujemy następujący kod:
PascalScript: | |
1 2 3 4 5 6 7 8 9 |
procedure frxReport1OnRunDialogs(var Result: Boolean); begin Result := DialogPage1.ShowModal = mrOk; if Result then begin if CheckBox1.Checked then Result := DialogPage2.ShowModal = mrOk; end; end; |
C++Script: | |
1 2 3 4 5 6 7 8 9 |
void frxReport1OnRunDialogs(bool &Result); { Result = DialogPage1.ShowModal == mrOk; if (Result) { if (CheckBox1.Checked) Result = DialogPage2.ShowModal == mrOk; } } |
Handler działa w następujący sposób: wyświetlamy pierwsze okno dialogowe. Jeżeli zostało ono zamknięte przyciskiem OK, to sprawdzamy stan flagi CheckBox1 i w razie potrzeby wyświetlamy drugie okno dialogowe. Jeżeli handler zwraca Result = True, to raport jest budowany; jeżeli Result = False, to raport jest zatrzymywany.