Korištenje "Engine" objekta
Korištenje "Engine" objekta
Već smo rekli da "Engine" objekat predstavlja motor izvještaja, koji upravlja konstrukcijom izvještaja. Proces raspoređivanja traka 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 štampane regije, koja je obično manja od fizičkih dimenzija stranice. Veličina štampane regije zavisi od svojstava stranice izvještaja "LeftMargin", "TopMargin", "RightMargin" i "BottomMargin". Veličina štampane regije u pikselima vraća se funkcijama "Engine.PageWidth" i "Engine.PageHeight".
Na kraju, "FreeSpace" je visina slobodnog prostora na stranici. Ako postoji traka "Page Footer" na stranici, njena 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će trake slobodni prostor smanjuje na stranici, to se uzima u obzir prilikom izračunavanja "FreeSpace".
Kako se konstruiraju stranice izvještaja? FastReport jezgro prikazuje trake na stranici sve dok ima dovoljno slobodnog prostora. Kada više nema slobodnog prostora, traka "Page Footer" se štampa (ako je potrebno) i kreira se nova prazna stranica. Kao što je već rečeno, nakon prikazivanja sljedeće trake visina slobodnog prostora se smanjuje. Štaviše, prikaz sljedeće trake počinje od trenutne pozicije, koja je definirana koordinatama na X-osi i Y-osi. Trenutna pozicija se vraća funkcijama "Engine.CurX" i "Engine.CurY". Nakon štampanja sljedeće trake, CurY se automatski povećava za visinu štampane trake. Nakon što se kreira nova stranica, "CurY" je jednako "0." "CurX" se mijenja prilikom štampanja višekolonnih izvještaja.
"Engine.CurX" i "Engine.CurY" su dostupni ne samo za čitanje već i za pisanje. To znači da se trake mogu pomjerati povećanjem ili smanjenjem ovih vrijednosti. Na primjer, u izvještaju koji liči na ovo:

Može se štampati na sljedeći način:

To se postiže pisanjem handler-a za događaj "OnBeforePrint" trake:
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
Engine.CurX := Engine.CurX + 5;
end;
Promjena "CurY" može uzrokovati preklapanje traka, 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 tački u izvještaju, nakon čega štampanje nastavlja od vrha nove izlazne stranice. U našem primjeru prekid se može umetnuti nakon štampanja 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 traka štampana). Također imajte na umu da sistemska varijabla "Line" vraća sekvencijalni broj zapisa.
Metoda "Engine.NewColumn" umetne prekid kolone u višekolonim izvještajima. Ako više nema slobodnih kolona na stranici, tada se kreira nova stranica.
Račun sa Uplatnicama
Sljedeći primjer je predstavljen na otisak naručnica i računa sa uplatnicama. Oni su dostupni samo za slovenačko i hrvatsko zakonodavstvo. Takvi izvještaji su '2U2 - Račun - UPN - Obrazac' za slovenačko 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 štampati uplatnicu uvijek tačno na dnu stranice. Da bismo prisilili ovo ponašanje, postavljamo trenutnu vertikalnu poziciju (Engine.CurY) trake sažetka izvještaja tako da postoji tačno dovoljno prostora za prikaz na ovoj stranici. To radimo sa sljedećim kodom:
procedure UPNOnBeforePrint(Sender: TfrxComponent);
begin
...
Engine.CurY := Engine.CurY + Engine.FreeSpace - UPN.Height - 1;
end;
Prilikom kreiranja izvještaja, uplatnica će preklapati postojeći tekst ako je previsoka. Tako da moramo ispraviti naš kod da štampamo uplatnicu 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;