Język opisu formularzy

Język opisu formularzy

Wstęp

Formularze edycyjne reprezentowane są plikami tekstowymi EPR.

Wygląd formularza wyrażony jest poprzez zdefiniowanie komponentów ułożonych na w oknie edycyjnym. Do zdefiniowania położenia poszczególnych elementów stosuje się współrzędne X i Y wyrażone w pikselach. Ponieważ język przewiduje możliwość grupowania elementów współrzędne podaje się względem położenia na najbliższym elemencie grupującym.

Z formularzem powiązany jest zwykle dodatkowy plik akcji ACT, który zawiera implementację zdarzeń wywoływanych na elementach formularza.

Formularz

W opisie składni poszczególnych komponentów stosujemy następującą nomenklaturę:

  • wielkimi literami podajemy słowa kluczowe. Np. LABEL

  • małymi literami bez apostrofów podajemy wartości liczbowe. Np. x oznacza, że w tym miejscu spodziewamy się liczby określającej współrzędną poziomą

  • małymi literami w apostrofach podajemy wartości tekstowe. Np. 'tekst'

  • w nawiasach klamrowych ujęte są opcjonalne elementy składni. Np. {MULTILINE}

  • znak pionowej kreski oddziela od siebie alternatywne warianty składni. Np. {MASK 'wzorzec'|LIMIT size} oznacza, że możliwa jest jedna z podanych składni (nigdy obie naraz).

  • ciąg trzech kropek ... oznacza, że wyżej opisana definicja może występować wielokrotnie

  • pozostałe znaki określają interpunkcję, w szczególności przecinki oddzielają od siebie kolejne atrybuty słów kluczowych.

Definicja główna formularza

BEGIN lista komponentów END

Reguły języka formularzy

Separatory komponentów

Nie ma żadnego znaku separującego. Komponenty oddziela od siebie dowolna liczba znaków spacji, tabulatora lub nowej linii.

Komentarze

Wartości ujęte w nawiasy klamrowe { } są ignorowane. Podobnie ignorowane są wartości od znaku ; do końca linii.

Arytmetyka wartości liczbowych

Wartości liczbowe mogą być wyrażone w postaci wyrażenia arytmetycznego. Dodawanie +, odejmowanie -, mnożenie * oraz dzielenie /. Mogą być ujęte w nawiasy. Np:

LIST '*' OF (469-29)/44 ON 2, 16, 580, 469-29

Łączenie napisów

Napisy (wartości tekstowe) mogą być łączone za pomocą znaku +. Poniższe dwie definicje etykiety są równoważne:

LABEL 'This is Sparta' ON 2,2 LABEL 'This is' +' Sparta' ON 2,2

Zdarzenia

Z edycją formularza związane są zdarzenia, które podzielono na następujące grupy:

SHOW

SHOW nazwa - gdy komponent edycyjny zostaje wyświetlony po raz pierwszy

HELP

HELP nazwa - gdy naciśnięty zostanie przycisk związany z komponentem

ENTER

ENTER nazwa - przy wejściu do edycji pola

CHANGE

CHANGE nazwa - przy zmianie wartości pola

EXIT

EXIT nazwa - przy wyjściu z edycji pola

Elementarne komponenty formularza

LABEL

Stały napis.

LABEL 'tekst' ON x,y

Zdarzenia: brak

BEGIN LABEL 'Visible label' ON 2,4 LABEL 'Verticaly truncated label' ON 2,24 END
epr-label-1.png
epr-label-2.png

Komponent nie ma rozmiaru pionowego, dlatego okno formularza określiło swój rozmiar na podstawie współrzędnych drugiego napisu (to raczej błąd, powinien dodać rozmiar pionowy czcionki).

NO

Napis, w którym mogą występować symbole zmiennych.

NO 'wyrażenie' ON x,y

Zdarzenia: brak

BEGIN NO 'Visible No *.' ON 2,4 NO 'Truncated No *.' ON 2,24 END
epr-no-1.png
epr-no-2.png

Komponent nie ma rozmiaru pionowego, dlatego okno formularza określiło swój rozmiar na podstawie współrzędnych drugiego napisu (to raczej błąd, powinien dodać rozmiar pionowy czcionki).

Komponent nie ma “sensu” poza elementem grupującym LIST i DYNAMIC. Zob. przykłady w tych komponentach by poznać działanie komponentu NO

TEXT

Napis, który jest redagowany na podstawie zawartości pola rekordu (często jest to pole tymczasowe). Opcja FLOAT pozwala dynamicznie zwiększać wysokość pola w stosunku do zawartości.

TEXT 'pole' {FLOAT} ON x,y,width,height

Zdarzenia: SHOW pole

BEGIN TEXT 'T.1' ON 2,4,200,20 TEXT 'T.2' FLOAT ON 2,28,200,20 TEXT 'T.3' ON 2,52,200,20 END
epr-text-1.png
epr-text-2.png

Komponent interpretuje język formatowania tekstu “richedit” opisany na https://sowa.atlassian.net/wiki/spaces/sqldoc/pages/458980

PANEL

Nieedytowalny panel z zawartością tekstową.

PANEL 'pole' ON x,y,width,height

Zdarzenia: SHOW pole

BEGIN PANEL 'P.1' ON 2,2,200,40 END
epr-panel.png

Komponent interpretuje język formatowania tekstu “richedit” opisany na https://sowa.atlassian.net/wiki/spaces/sqldoc/pages/458980

FIELD

Komponent edycji pola tekstowego. Jeśli występuje sekcja MASK 'wzorzec', to wzorzec określa reguły edycyjne. Jeśli występuje sekcja LIMIT size, to oznacza ograniczenie wielkości tekstu pola.

Edytowany tekst jest przewijany w poziomie.

FIELD 'pole' {MASK 'wzorzec'|LIMIT size} ON x,y,width

Zdarzenia: SHOW pole | ENTER pole | EXIT pole | CHANGE pole

BEGIN FIELD 'A' ON 2,4,200 FIELD 'B' LIMIT 5 ON 2,28,200 FIELD 'C' MASK '999;0; ' ON 2,52,200 FIELD 'D' MASK '9999-999999-99;*; ' ON 2,76,200 END
epr-field-1.png
epr-field-2.png

Maska ma strukturę zgodną z maskami komponentów w Delphi. Zob. http://docwiki.embarcadero.com/Libraries/Athens/en/System.MaskUtils.TEditMask

DICTIONARY

Komponent edycji pola tekstowego połączonego z przyciskiem “szukaj w KHW”.

DICTIONARY 'pole' ON x,y,width

Zdarzenia: SHOW pole | ENTER pole | EXIT pole | CHANGE pole | HELP pole

BEGIN DICTIONARY 'T.1' ON 2,4,200 DICTIONARY 'T.2' ON 2,28,200 END
epr-dictionary.png

DATE

Komponent edycji pola daty.

DATE 'pole' ON x,y,width

Zdarzenia: SHOW pole | ENTER pole | EXIT pole | CHANGE pole

BEGIN DATE 'D' ON 2,4,100 END
epr-date-1.png
epr-date-2.png

Komponent pozwala wprowadzić datę nie będącą datą, ale potem to kontroluje. Powinien kontrolować prewencyjnie.

MONTH

Komponent wyboru miesiąca i roku.

MONTH 'pole' ON x,y

Zdarzenia: SHOW pole | ENTER pole | EXIT pole | CHANGE pole

BEGIN MONTH 'M' ON 2,4 END
epr-month.png

NUMBER

Komponent edycji pola liczby stałoprzecinkowej. Atrybut size określa liczbę wszystkich znaków (wliczając w to przecinek, jeśli dotyczy). Opcjonalny atrybut dec określa liczbę miejsc po przecinku.

NUMBER 'pole' MASK size{,dec} ON x,y,width

Zdarzenia: SHOW pole | ENTER pole | EXIT pole | CHANGE pole

BEGIN NUMBER 'N.1' MASK 10 ON 2,4,100 NUMBER 'N.2' MASK 10,2 ON 2,28,100 END
epr-number-1.png
epr-number-2.png

SPIN

Komponent edycji pola liczby całkowitej z przyciskami zwiększania / zmniejszania wartości. Sekcja LIMIT określa przedział dozwolonych wartości.

SPIN 'pole' MASK size {LIMIT min{,max}} ON x,y,width

Zdarzenia: SHOW pole | ENTER pole | EXIT pole | CHANGE pole

BEGIN SPIN 'SPIN.1' MASK 6 ON 2,4,100 SPIN 'SPIN.2' MASK 1 LIMIT 1 ON 2,28,100 SPIN 'SPIN.3' MASK 1 LIMIT 1,3 ON 2,52,100 SPIN 'SPIN.4' MASK 3 LIMIT 0,999 ON 2,76,100 END
epr-spin-1.png
epr-spin-2.png

Forma bez limitu jest poprawna składniowo, ale nie ma sensu praktycznego, bo nic nie kontroluje.

Forma z limitem podanym bez zakresu jest poprawna składniowo, ale nie ma w ogóle sensu. Komponent wówczas pozwala na dowolne liczby, także ujemne.

CHECK

Komponent edycji pola boolowskiego.

CHECK 'pole' MASK 'tekst' ON x,y,width

Zdarzenia: SHOW pole | ENTER pole | EXIT pole | CHANGE pole

BEGIN CHECK 'A' MASK 'Checkbox with insufficient width' ON 2,4,100 CHECK 'B' MASK 'Checkbox without insufficient width' ON 2,28,200 END
epr-checkbox.png

RADIO

Komponent wyboru wartości pola z podanej listy. Lista ma budowę wartość|nazwa|..., gdzie wartość jest dozwoloną wartością pola, a nazwa etykietą przycisku wyboru.

RADIO 'pole' OF 3 MASK 'lista' ON x,y,width,height

Zdarzenia: SHOW pole | ENTER pole | EXIT pole | CHANGE pole

BEGIN RADIO 'GAGA' OF 3 MASK 'A|Choice A|B|Choice B|C|Choice C|' ON 2,4,400,50 END
epr-radio.png

COMBO

Komponent listy wyboru wartości pola dla podanej listy. Lista ma budowę wartość|nazwa|..., gdzie wartość jest dozwolona wartością pola, a nazwa tekstem wyświetlanym na liście.

COMBO 'pole' MASK 'lista' ON x,y,width

Zdarzenia: SHOW pole | ENTER pole | EXIT pole | CHANGE pole

BEGIN COMBO 'C' MASK '|No choice|A|Choice A|X|Choice X|' ON 2,4,200 END
epr-combo-1.png
epr-combo-2.png

MEMO

Komponent edycji pola tekstowego zajmujący na ekranie dowolną liczbę wierszy. Edytowany tekst jest przewijany w pionie. Opcja MULTILINE pozwala na wprowadzanie znaków ENTER, separujących odrębne wiersze. W treści pola znak ten jest reprezentowany przez sekwencję ESC'/'. Opcja FLOAT pozwala dynamicznie zwiększać wysokość pola w stosunku do zawartości.

MEMO 'pole' {MULTILINE} {FLOAT} ON x,y,width,height

Zdarzenia: SHOW pole | ENTER pole | EXIT pole | CHANGE pole

BEGIN MEMO 'A' ON 2,4,400,50 MEMO 'F' FLOAT ON 2,58,400,50 MEMO 'M' MULTILINE ON 2,112,400,50 END
epr-memo-1.png
epr-memo-2.png
epr-memo-3.png

MARKERS

Komponent edycji pola tekstowego zajmujący na ekranie dowolną liczbę wierszy. Edytowany tekst jest przewijany w pionie. W tekście można umieszczać znaczniki (np. separatory podpól).

Dozwolone znaczniki określa parametr lista, który ma budowę: znak|kod{*}|nazwa|.... Pierwszy znak definiuje znak rozpoznawczy znacznika (np. % lub ^). Kolejne elementy tworzą pary kodu znacznika i nazwy znacznika prezentowanej w menu wyboru. Znak gwiazdki stosuje się jeśli znacznik może występować wielokrotnie. Opcja FLOAT pozwala dynamicznie zwiększać wysokość pola w stosunku do zawartości.

MARKERS 'pole' MASK 'lista' {FLOAT} ON x,y,width,height

Zdarzenia: SHOW pole | ENTER pole | EXIT pole | CHANGE pole

BEGIN MARKERS 'MARKERS.1' MASK '^|a|subfield A|b|subfield B|c*|multi subfield C|' ON 2,4,400,20 MARKERS 'MARKERS.2' MASK '^|x|subfield X|y*|multi subfield Y|z|subfield Z|' FLOAT ON 2,28,400,20 MARKERS 'MARKERS.3' MASK '%|t*|test|' ON 2,52,400,60 END
epr-markers-1.png
epr-markers-2.png
epr-markers-3.png

BUTTON

Przycisk z napisem służący do generowania zdarzeń. Opcjonalny atrybut DEFAULT pozwala stworzyć przycisk, który przyjmuje focus domyślnego przycisku formularza (w szczególności używane jest to do zatwierdzania podformularzy).

BUTTON 'nazwa' MASK 'napis' {DEFAULT} ON x,y,width,height

Zdarzenia: SHOW nazwa | HELP nazwa

BEGIN BUTTON 'BENJAMIN' MASK 'CLICK ME' ON 2,4,100,20 END
epr-button.png

SPEED

Przycisk z ikoną służący do generowania zdarzeń.

SPEED 'nazwa' MASK 'ikona' ON x,y,width,height

Zdarzenia: SHOW nazwa | HELP nazwa

BEGIN SPEED 'TEST' MASK 'KHW.BMP' ON 2,4,20,20 SPEED 'SPEED' MASK 'USUN.BMP' ON 24,4,20,20 END
epr-speed.png

MENU

Komponent menu hierarchicznego, zdefiniowanego poprzez lista. Parametr ten ma budowę: nazwa|napis|... lub |napis|lista||.

MENU 'lista' LABEL 'nazwa' ON x,y

lub wariant menu aktywowanego jako ikona:

MENU 'lista' MASK 'IKONA.BMP' ON x,y,width,height

Zdarzenia: HELP nazwa

BEGIN MENU '1|First item|2|Second item|3|Third item|' LABEL 'Simple menu' ON 2,4 MENU 'S|Single item||Submenu|1|First submenu item|2|Second submenu item|||' LABEL 'Hard menu' ON 2,24 MENU 'S|Single item||Submenu|1|Just submenu item||Even more submenu|X|First extreme item|Y|Second extreme item|||||' LABEL 'Extreme menu' ON 2,44 MENU 'A|Item A|B|Item B|C|Item C|' MASK 'KHW.BMP' ON 2,64,20,20 END
epr-menu-1.png
epr-menu-2.png
epr-menu-3.png
epr-menu-4.png

Elementy grupujące

ON

Grupa komponentów. Współrzędne elementów listy komponentów podaje się względem punktu (0,0). Na formularzu współrzędne zostaną przesunięte o wektor (x,y).

ON x,y BEGIN lista komponentów END
BEGIN ON 2,2 BEGIN LABEL 'ON 1' ON 0,0 FIELD 'B.1' ON 0,18,100 END ON 112,2 BEGIN LABEL 'ON 2' ON 0,0 FIELD 'B.2' ON 0,18,100 END ON 50,48 BEGIN LABEL 'ON 3' ON 0,0 FIELD 'B.3' ON 0,18,100 END END
epr-on.png

SCROLL

Grupa komponentów umożliwiająca umieszczenie wewnątrz komponentów przekraczających wielkość grupy, co powoduje pojawienie się scrollbara przewijającego zawartość. Współrzędne elementów listy komponentów podaje się względem punktu (0,0). Na formularzu współrzędne zostaną przesunięte o wektor (x,y).

SCROLL ON x,y,width,height BEGIN lista komponentów END
BEGIN SCROLL ON 2,2,400,100 BEGIN LABEL 'Item 1' ON 0,0 FIELD 'I.1' ON 0,18,350 LABEL 'Item 2' ON 0,40 FIELD 'I.2' ON 0,58,350 LABEL 'Item 3' ON 0,80 FIELD 'I.3' ON 0,98,350 LABEL 'Item 4' ON 0,120 FIELD 'I.4' ON 0,138,350 END END
epr-scroll-1.png
epr-scroll-2.png

Rozmiar komponentu określa jego zewnętrzne granice. Dlatego ważne jest, przy określaniu jego rozmiarów, by uwzględnić obszar dla ewentualnie potrzebnego paska przewijania. Najlepiej dodać ok. 20px do rozmiaru horyzontalnego do zabezpieczenia miejsca na scrollbar.

FRAME

Grupa komponentów otoczona ramką z etykietą. Współrzędne elementów listy komponentów podaje się względem punktu (0,0). Na formularzu współrzędne zostaną przesunięte o wektor (x,y).

FRAME 'etykieta' ON x,y,width,height BEGIN lista komponentów END
BEGIN FRAME 'Frame label' ON 2,2,400,200 BEGIN LABEL 'Item 1' ON 10,20 FIELD 'I.1' ON 10,38,350 LABEL 'Item 2' ON 10,60 FIELD 'I.2' ON 10,78,350 LABEL 'Item 3' ON 10,100 FIELD 'I.3' ON 10,118,350 LABEL 'Item 4' ON 10,140 FIELD 'I.4' ON 10,158,350 END END
epr-frame.png

Rozmiar komponentu określa jego zewnętrzne granice, komponenty wewnątrz są rozkładane wg zewnętrznych granic. Powinny one mieć współrzędne odpowiednio zwiększone, by nie nadpisywać obszaru ramki. Zalecane jest:

  • dodać 10px do lewej współrzędnej

  • dodać 20px do górnej współrzędnej

 

LIST

Definicja listy powtarzalnych elementów. Współrzędne komponentów opisujących element listy podaje się względem punktu (0,0). Symbol zmienna (dowolny znak np. * lub +) używana jest w nazwach pól komponentów. Parametr liczba określa liczbę jednocześnie wyświetlanych elementów listy.

LIST 'zmienna' OF liczba ON x,y,width,height BEGIN komponenty elementu listy END
BEGIN LIST '*' OF 4 ON 2,2,350,280 BEGIN NO 'No *.' ON 4,16 TEXT 'T.*' ON 50,10,290,20 FIELD 'X.*' ON 4,36,336 END END
epr-list-1.png
epr-list-2.png

TABS

Definicja listy kart o podanych wymiarach. Tytuł karty określa etykieta, a następujący po niej blok zawiera listę komponentów karty. Może występować wiele takich definicji kart.

(uwaga: w implementacji dla Windows wybór kart jest z prawej strony komponentu)

TABS ON x,y,width,height 'etykieta' BEGIN lista komponentów END ... END
BEGIN TABS ON 2,2,300,200 'First tab' BEGIN MEMO 'F' FLOAT ON 2,2,260,50 END 'Second tab' BEGIN CHECK 'BOX' MASK 'Check it out' ON 2,2,260 END END END
epr-tabs-1.png
epr-tabs-2.png

Rozmiar komponentu określa jego zewnętrzne granice. Dlatego ważne jest, przy określaniu jego rozmiarów, by uwzględnić obszar dla tabów z prawej strony komponentu. Należy założyć ok 20px na ten obszar.

DYNAMIC

Definicja formularza obejmującego zmienną listę elementów. Bieżąca postać listy określana jest przez pole rekordu. Wartość pola ma postać: etykieta|wystąpienie|{U}|....

DYNAMIC 'pole' OF 'zmienna' ON x,y,width,height 'etykieta' BEGIN lista komponentów END ... END

Zdarzenia: SHOW pole

BEGIN DYNAMIC '#.1' OF '*' ON 2,2,200,150 'G1' BEGIN NO '* =' ON 4,8 FIELD 'A.*' ON 28,4,160 END 'G2' BEGIN NO '* =' ON 4,8 CHECK 'C.*' MASK 'Checkbox in group 2' ON 28,4,150 END END END
epr-dynamic.png

Rozmiar komponentu określa jego zewnętrzne granice. Dlatego ważne jest, przy określaniu jego rozmiarów, by uwzględnić obszar dla ewentualnie potrzebnego paska przewijania. Najlepiej dodać ok. 20px do rozmiaru horyzontalnego do zabezpieczenia miejsca na scrollbar.

FORM

Definicja podformularza uruchamianego przyciskiem “lupa”. Przycisk wyświetlany jest we współrzędnych (icon_x,icon_y), natomiast okno podformularza pojawi się we współrzędnych (form_x,form_y).

FORM 'nazwa' MASK 'napis' {SPEED 'ikona'} ON icon_x,icon_y, form_x, form_y BEGIN lista komponentów END
BEGIN FORM 'X' MASK 'Form' SPEED 'pole.bmp' ON 4,4,24,24 BEGIN LABEL 'Hello World' ON 2,2 FIELD '#.1' ON 2,20,200 END END
epr-form-1.png
epr-form-2.png