Zjištění počtu stránek při tisku   otázka

VB.NET, Tisk

Dobrý den,

píšu Windows Forms Aplikaci, která by kromě jiného měla umožnit i tisk různých reportů. K tisku využívám komponentu PrintPreviewControl a třídu PrintDocument. Vše funguje k maximální spokojenosti až na jeden drobný problém. Potřeboval bych na každé stránce vytisknout její číslo ve formátu n/m, kde n je číslo aktuální stránky a m je celkový počet stránek. Číslo aktuální stránky není problém, ale celkový počet stránek je "ořech". Nevíte o nějakém jednoduchém fíglu, jak zjistit počet celkový počet stránek pro tisk? Je mi vcelku jasné, že pokud k tisku používám PrintDocument tak se jeho obsah vytváří dynamicky a tudíž dopředu nevím, kolik stránek bude potřeba tisknout dokud program pro obsluhu tisku nezpracuje poslední stránku, jenže v tu dobu je již obsah zobrazen v náhledu.

Budu vděčný za jakékoliv nakopnutí. Děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Musíte si před vykreslením první stránky sám nějakou vlastní logikou spočítat, kolik toho budete tisknout. To ovšem může být dost netriviální problém.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji za odpověď.

Obával jsem se, že to tak bude muset být. Problém je v tom, že obsah, který potřebuji na stránkách tisknout je velice různorodý a nedá se tedy jednoduše předem zjistit, kolik stránek celkem zabere (jako například u tabulkových dat).

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pustil jsem se do psaní kódu, který před samotným tiskem zjišťuje celkový počet stránek. Ke zjišťování, kolik řádků textu mohu umístit na stránku vycházím z výšky a šířky stránky, přičemž ke zjištění množství alokovaných řádků při nastavené šířce stránky využívám funkci MeasureString a její vlastnost Height.

Narazil jsem ale na jeden problém. Řekněme, že mám textový řetězec "Tisková sestava". Vertikální rozměr textu zjistím následujícím způsobem:

Dim Y as integer = g.MeasureString("Tisková sestava", Dim Y As Integer = g.MeasureString("Tisková sestava", New Font("Arial", 12), PageWidth, New StringFormat(StringFormatFlags.LineLimit)).Height

Výsledek je 20. Potud vše v pořádku.

Problém ale nastane, když naprosto shodný kód vložím do metody, která slouží k vykreslování textu na stránku - tedy do kódu pro obsluhu tisku. V tom případě obdržím jako výsledek hodnotu 21, což je rozdíl. Při větším množství textových řádků na stránce pak může být celkový rozdíl způsobený touto nepřesností již značný a může dojít k chybnému vyhodnocení požadovaného počtu stránek.

Netušíte, kde by mohl být problém? Jak je možné, že stejná funkce se stejnými parametry vrací pokaždé jinou hodnotu?

Je možné, že by toto způsobovalo nastavení nějaké vlastnosti třídy Graphic, kterou při tisku přejímám z parametru PrintEventArgs a ve funkci, kterou používám před samotným tiskem ke zjištění počtu stránek tuto třídu vytvářím následujícím způsobem:

Dim g As Graphics
Using b As New System.Drawing.Bitmap(1, 1)
      g = System.Drawing.Graphics.FromImage(b)
End Using

Budu moc vděčný za jakékoliv nasměrování správný směrem.

Díky moc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Omlouvám se za chybně uvedený kód. Správně má být samozřejmě toto:

Dim Y As Integer = g.MeasureString("Tisková sestava", New Font("Arial", 12), PageWidth, New StringFormat(StringFormatFlags.LineLimit)).Height 

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback