QBS >> Elementy standardowe >> Q-Tenberg >> Podręcznik do Q-Tenberga >> Lekcja 5

Lekcja 5: Bufory

 

Lekcja 5 dogłębnie omawia ideę i zastosowanie buforów, które łączą kod programu z elementami wydruku.

Wydruk składa się z dwóch zasadniczych części: ustawienia elementów graficznych oraz programu dostarczającego danych. Części te są od siebie mocno niezależne i będą omówione oddzielnie. Synchronizacją obu tych części zajmuje się specjalny algorytm [FillMachine.java], który pilnuje, aby w odpowiednim momencie przechodzić do dalszej części ustawienia i odpowiednio łamać je na strony.

Bufory

Aby program qvl mógł sterować zawartością wydruku, musi mieć jakieś miejsce do wkładania preparowanych przez siebie danych. Służą do tego bufory. Prawie każdy element ustawienia ma swój bufor, a niektóre z nich nawet kilka (np tabela ma oddzielne bufory dla nagłówka, ciała i stopki, a także dla każdej linii.) Oczywiście nie musimy używać wszystkich buforów, tylko te, które akurat są nam potrzebne. Bufory ustawione są w drzewa, których hierarchia odpowiada hierarchii elementów ustawienia - czyli bufory tabelki zawierają bufory jej komórek etc.

Najlepiej zademonstruje nam to prosty przykład (TRZEBA GO ZROZUMIEĆ!)


rys.1 Przykładowa tabelka - trzy kolumny, jeden wiersz nagłówka i jeden wiersz ciała


rys.2 Drzewo buforów dla powyższej tabelki. Porównajmy z tabelką: całość tabelki to bufor TAB. Nagłówkowi odpowiada HEAD, zaś ciału - BODY. Oba z nich zawierają po jednym wierszu (LINE1) składającym się z trzech komórek (CELL, CELL_1 i CELL_2), zaś w każdej z komórek tabelki mamy pole tekstowe (TEXT).

Podgląd buforów w programie przedstawi nam to drzewo w nieco mniej przyjemny sposób. Wyglądać ono będzie następująco:


rys.3 To samo drzewo buforów przedstawione przez program.

W rzeczywistości wszystkie bufory całego wydruku ułożone są w jedno duże drzewo. Jego wierzchołek nazywa się mainBuf.


rys.4 Jeszcze raz to samo drzewo umieszczone w głównym drzewie buforów całego wydruku.

Operacje na buforach z poziomu QVL

Na buforach możemy wykonać cztery zasadnicze operacje w programie QVL:

  1. Buffer getBuffer(String name)
    zwraca nam bufer-dziecko o podanej nazwie. W powyższym przykładzie mając na zmiennej t bufor TAB możemy otrzymać bufor tekstu w pierwszej komórce wywołując:
    Buffer text = t.getBuffer("HEAD").getBuffer("LINE1").getBuffer("CELL").getBuffer("TEXT")
    możemy to samo też wywołać skrótowo:
    Buffer text = t.getBuffer("HEAD.LINE1.CELL.TEXT")
  2. void set(Object val)
    operacja ustawienia bufora - przykład:
    text.set("Hello world");
  3. void fix()
    operacja zafiksowania wartości w buforze - oznacza to, że wartość jaka już jest, jest ostateczna. (Przekłada się to np. na żądanie nowej linii tabeli)

  4. void put(Object val)
    jest to podstawowa operacja wrzucenia do bufora - w rzeczywistości złożenie set i fix.

Ponadto niektóre bufory udostępniają dodatkowe metody:

Skróty w wołaniu buforów

Jak wykazała praktyka, pisanie wyciąganie konretnego buforu poprzez pisanie pełnej ścieżki dostępu (np."S.F.TAB.BODY.LINE1.CELL_1.TAB.HEAD.LINE1.TEXT") bywało dość uciążliwe. Aby ułatwić życie powstał mechanizm skrótów w wołaniu buforów. Otóż podaną powyżej ścieżkę można skrócić poprzez wyrzucenie dowolnych węzłów ze środka, o ile powstały w ten sposób skrót będzie jednoznacznie identyfikował tą ścieżkę. (czyli gdy nie istnieje inna ścieżka o takim samym skrócie).
Zobaczmy to na rysunku poglądowym:


rys.5 Wybrane dwa prawidłowe, jednoznaczne skróty: HEAD.CELL_2 i TAB.IMIE


rys.6 Skrót BODY.TEXT jest niejednoznaczny i w związku z tym nieprawidłowy.

W praktyce dobrze jest przemianować używane bufory typu TEXT, aby móc bezpośrednio się do nich odwoływać:


rys.7 Nowe drzewo buforów dla naszej tabelki po przemianowaniu buforów TEXT w ciele tabelki na LP, IMIE i NAZWISKO. Dzięki temu zabiegowi możemy bezpośrednio odwoływać się do tych buforów skrótami TAB.LP, TAB.IMIĘ i TAB.NAZWISKO

Następna lekcja