Folosind obiectul "Engine"
Folosind obiectul "Engine"
Am spus deja că obiectul “Engine” reprezintă motorul raportului, care gestionează construcția raportului. Procesul de aranjare a bandelor pe o pagină poate fi gestionat folosind proprietățile și metodele motorului. Mai întâi, puțină teorie.
Diagrama de mai jos arată diferite dimensiuni ale paginii raportului.

Dimensiunile fizice ale paginii sunt proprietățile “PaperWidth” și “PaperHeight”, vizibile în inspectorul de obiecte atunci când pagina este selectată. Așadar, dimensiunea unei pagini A4 este de 210 x 297mm.
“PageWidth” și “PageHeight” sunt dimensiunile regiunii imprimabile, care este de obicei mai mică decât dimensiunile fizice ale paginii. Dimensiunea regiunii imprimabile depinde de proprietățile paginii raportului “LeftMargin”, “TopMargin”, “RightMargin” și “BottomMargin”. Dimensiunea regiunii imprimabile în pixeli este returnată de funcțiile “Engine.PageWidth” și “Engine.PageHeight”.
În cele din urmă, “FreeSpace” este înălțimea spațiului liber pe o pagină. Dacă există o bandă "Page Footer" pe pagină, înălțimea acesteia este luată în considerare atunci când se calculează “FreeSpace”. Această înălțime este returnată în pixeli de funcția “Engine.FreeSpace”. Rețineți că după afișarea următoarei benzi, spațiul liber este redus pe pagină, acest lucru este luat în considerare atunci când se calculează “FreeSpace”.
Cum sunt construite paginile raportului? Nucleul FastReport afișează benzile pe o pagină atâta timp cât există suficient spațiu liber. Când nu mai rămâne spațiu liber, banda “Page Footer" este imprimată (dacă este necesar) și se creează o nouă pagină goală. Așa cum s-a spus deja, după afișarea următoarei benzi, înălțimea spațiului liber este redusă. În plus, afișarea următoarei benzi începe din poziția curentă, care este definită de coordonate pe axa X și axa Y. Poziția curentă este returnată de “Engine.CurX” și “Engine.CurY” respectiv. După imprimarea următoarei benzi, CurY crește automat cu înălțimea benzii imprimate. După ce se creează o pagină nouă, “CurY” este egal cu “0.” “CurX” se schimbă atunci când se imprimă rapoarte cu coloane multiple.
“Engine.CurX” și “Engine.CurY” sunt disponibile nu doar pentru citire, ci și pentru scriere. Aceasta înseamnă că benzile pot fi mutate prin incrementarea sau decrementarea acestor valori. De exemplu, într-un raport asemănător cu acesta:

Poate fi imprimat în următorul mod:

Aceasta se realizează prin scrierea unui handler pentru evenimentul “OnBeforePrint” al benzii:
procedură MasterData1OnBeforePrint(Sender: TfrxComponent);
începe
Engine.CurX := Engine.CurX + 5;
sfârșit;
Schimbarea “CurY” poate face ca benzile să se suprapună, de exemplu:

Realizată prin acest script:
procedură MasterData1OnBeforePrint(Sender: TfrxComponent);
începe
Engine.CurY := Engine.CurY - 15;
sfârșit;
Metoda “Engine.NewPage” inserează o întrerupere de pagină în orice punct necesar dintr-un raport, după care imprimarea continuă de la partea de sus a noii pagini de ieșire. În exemplul nostru, o întrerupere poate fi inserată după imprimarea celui de-al doilea record:
procedură MasterData1OnDupăPrint(Sender: TfrxComponent);
începe
dacă <Line> = 2 atunci
Engine.NewPage;
sfârșit;
Rețineți că am folosit evenimentul “OnAfterPrint” (adică, după ce banda a fost imprimată). De asemenea, rețineți că variabila de sistem “Line” returnează numărul secvențial al recordului.
Metoda “Engine.NewColumn” inserează o întrerupere de coloană în rapoartele cu coloane multiple. Dacă nu mai există coloane libere pe pagină, atunci se creează o pagină nouă.
Factură cu ordine de plată
Exemplul următor este prezentat pe printout-ul de ordine și facturi cu ordine de plată. Acestea sunt disponibile doar pentru legislația slovenă și croată. Astfel de rapoarte sunt '2U2 - Factură - UPN - Formular' pentru slovenă și '2U7 - Factură - HUB 3A - Formular' pentru croată legislație. Puteți vedea designul acestor rapoarte deschizând designerul de rapoarte din registrul de rapoarte.
Vrem să imprimăm întotdeauna ordinul de plată exact în partea de jos a paginii. Pentru a forța acest comportament, setăm poziția verticală curentă (Engine.CurY) a benzii de sumar a raportului astfel încât să existe suficient spațiu exact pentru a-l afișa pe această pagină. Facem acest lucru cu următorul cod:
procedură UPNOnBeforePrint(Sender: TfrxComponent);
începe
...
Engine.CurY := Engine.CurY + Engine.FreeSpace - UPN.Height - 1;
sfârșit;
Când se creează raportul, ordinul de plată se va suprapune textului existent dacă este prea înalt. Așadar, trebuie să corectăm codul nostru pentru a imprima ordinul de plată pe pagina următoare în acest caz.
procedură UPNOnBeforePrint(Sender: TfrxComponent);
începe
...
dacă Engine.CurY > Engine.CurY + Engine.FreeSpace - UPN.Height - 1 atunci
Engine.NewPage;
Engine.CurY := Engine.CurY + Engine.FreeSpace - UPN.Height - 1;
sfârșit;