Korištenje "Engine" objekta
Korištenje "Engine" objekta
Već smo rekli da "Engine" objekt predstavlja motor izvještaja, koji upravlja konstrukcijom izvještaja. Proces raspoređivanja bendova na stranici može se upravljati korištenjem svojstava i metoda motora. Prvo malo teorije.
Donji dijagram prikazuje različite dimenzije stranice izvještaja.

Fizičke dimenzije stranice su svojstva "PaperWidth" i "PaperHeight", vidljiva u inspektoru objekata kada je stranica odabrana. Dakle, veličina A4 stranice je 210 x 297mm.
"PageWidth" i "PageHeight" su dimenzije područja za ispis, koje je obično manje od fizičkih dimenzija stranice. Veličina područja za ispis ovisi o svojstvima stranice izvještaja "LeftMargin", "TopMargin", "RightMargin" i "BottomMargin". Veličina područja za ispis u pikselima vraća se funkcijama "Engine.PageWidth" i "Engine.PageHeight".
Na kraju, "FreeSpace" je visina slobodnog prostora na stranici. Ako postoji bend "Page Footer" na stranici, njegova visina se uzima u obzir prilikom izračunavanja "FreeSpace". Ova visina se vraća u pikselima funkcijom "Engine.FreeSpace". Imajte na umu da se nakon prikazivanja sljedećeg benda slobodni prostor smanjuje na stranici, to se uzima u obzir prilikom izračunavanja "FreeSpace".
Kako se konstruiraju stranice izvještaja? FastReport jezgra prikazuje bendove na stranici sve dok ima dovoljno slobodnog prostora. Kada više nema slobodnog prostora, bend "Page Footer" se ispisuje (ako je potrebno) i stvara se nova prazna stranica. Kao što je već rečeno, nakon prikazivanja sljedećeg benda visina slobodnog prostora se smanjuje. Štoviše, prikaz sljedećeg benda počinje od trenutne pozicije, koja je definirana koordinatama na X-osi i Y-osi. Trenutna pozicija vraća se s "Engine.CurX" i "Engine.CurY". Nakon ispisa sljedećeg benda, CurY se automatski povećava za visinu ispisanog benda. Nakon što se stvori nova stranica, "CurY" je jednako "0." "CurX" se mijenja prilikom ispisa višekolonnih izvještaja.
"Engine.CurX" i "Engine.CurY" dostupni su ne samo za čitanje već i za pisanje. To znači da se bendovi mogu pomaknuti povećanjem ili smanjenjem ovih vrijednosti. Na primjer, u izvještaju koji izgleda ovako:

Može se ispisati na sljedeći način:

To se postiže pisanjem handlera za događaj benda "OnBeforePrint":
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
Engine.CurX := Engine.CurX + 5;
end;
Promjena "CurY" može uzrokovati preklapanje bendova, na primjer:

Postignuto ovim skriptom:
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
Engine.CurY := Engine.CurY - 15;
end;
Metoda "Engine.NewPage" umetne prekid stranice na bilo kojoj potrebnoj točki u izvještaju, nakon čega se ispis nastavlja s vrha nove izlazne stranice. U našem primjeru prekid se može umetnuti nakon ispisa drugog zapisa:
procedure MasterData1OnAfterPrint(Sender: TfrxComponent);
begin
if <Line> = 2 then
Engine.NewPage;
end;
Imajte na umu da smo koristili događaj "OnAfterPrint" (to jest, nakon što je bend ispisan). Također imajte na umu da "Line" sistemska varijabla vraća redni broj zapisa.
Metoda "Engine.NewColumn" umetne prekid kolone u višekolonim izvještajima. Ako više nema slobodnih kolona na stranici, tada se stvara nova stranica.
Račun s nalogom za plaćanje
Sljedeći primjer prikazan je na ispisu naloga i računa s nalozima za plaćanje. Oni su dostupni samo za slovensko i hrvatsko zakonodavstvo. Takvi izvještaji su '2U2 - Račun - UPN - Obrazac' za slovensko i '2U7 - Račun - HUB 3A - Obrazac' za hrvatsko zakonodavstvo. Možete vidjeti dizajn ovih izvještaja otvaranjem dizajnera izvještaja iz registra izvještaja.
Želimo ispisati nalog za plaćanje uvijek točno na dnu stranice. Da bismo prisilili ovo ponašanje, postavljamo trenutnu vertikalnu poziciju (Engine.CurY) benda sažetka izvještaja tako da postoji točno dovoljno prostora za prikazivanje na ovoj stranici. To radimo s sljedećim kodom:
procedure UPNOnBeforePrint(Sender: TfrxComponent);
begin
...
Engine.CurY := Engine.CurY + Engine.FreeSpace - UPN.Height - 1;
end;
Kada se stvara izvještaj, nalog za plaćanje će preklapati postojeći tekst ako je previsok. Stoga moramo ispraviti naš kod da ispišemo nalog za plaćanje na sljedećoj stranici u ovom slučaju.
procedure UPNOnBeforePrint(Sender: TfrxComponent);
begin
...
if Engine.CurY > Engine.CurY + Engine.FreeSpace - UPN.Height - 1 then
Engine.NewPage;
Engine.CurY := Engine.CurY + Engine.FreeSpace - UPN.Height - 1;
end;