[ Blue82 @ 22.10.2008. 21:34 ] @
Potrebno mi je hitno jer projekat mora do sutra biti gotov pa Vas molim da ko zna odmah odgovori. Kako mogu da proverim da li je stampa pocela na novom listu papira? Znaci if stampa novi papir then... ja menjam dalje. Kako dobiti tu informaciju?
[ stefanpn @ 22.10.2008. 23:46 ] @
Kako to mislis if stampapocelananovompapiru then ... !?

Koji metod za stampanje koristis?
[ Blue82 @ 23.10.2008. 09:28 ] @
Koristim printer.print nesto i sada ne moram voditi racuna o tome kada ce poceti novi list jer on kada se popuni jedan po defaultu pocinje stampati novi list e sada samo trebam da skontam kada je poceo da stampa taj novi list pa da mu zadam sta tada da radi jer npr ponovo treba da odstampa zaglavlje a ne samo da pocne da redja suve podatke. Ja sam to resio na povuci-potegni nacin gde korisnihk manuelno ogranicava koliko podataka staje na jednoj strani cisto da bi program bio danas funkcionalan da ga mozemo testirati. ali iako ce to raditi i tako potreban mi je elegantniji nacin za resavanje istog jer to treba da radi po automatizmu. Ako se promene margine ili slicno treba automatski da stampa kako treba a ne da se rucno podesava. Znaci potrebno mi je da li postoji komanda koja ce mi vretiti npr true ili false u zavisnosti od toga da li je poceo da stampa novi list jer on to svakako zna, samo treba jos i mene da obavesti :)
[ Aleksandar Ružičić @ 23.10.2008. 12:50 ] @
skrati sebi muke, stampaj iz worda :)

jedino sto word mora da ti bude instaliran na tom sistemu...
[ Marko_L @ 23.10.2008. 16:15 ] @
Printer objekat nema funkciju koja će ti vratiti informaciju da li je prešao na novu stranu ili ne, ali uz malo truda možeš jednostavno da izvršiš tu proveru sa par linija koda. Jedan od načina jeste da očitavaš CurrentY printera i upoređuješ da li je manji od prethodnog. Ako jeste, znači da je printer prešao na novu stranu. To bi izgledalo nekako ovako
Code:
Dim i As Long
Dim lCurrY as Double
Printer.CurrentY = 100
Printer.Print "Header"
Printer.Print
For i = 1 to 100
   lCurrY = Printer.CurrentY
   Printer.Print "Something"
   If Printer.CurrentY < lCurrY Then 'Presli smo na novu stranu
      Printer.CurrentY = 100
      Printer.Print Header
      Printer.Print
   End If
Next i

Dakle, ova procedura za štampanje prvo setuje CurrentY printera na 100 (recimo da na toj koordinati želimo da imamo header na svakoj strani), a zatim štampa tekst headera. Onda štampamo prazan red da napravimo razmak od headera i štampamo dalje tekst red po red. Pre svakog odštampanog reda očitamo trenutnu Y koordinatu printera i smeštamo je u varijablu. Zatim, čim odštampamo red, trenutna koordinata printera će se pomeriti za onoliko jedinica (twipsa, pixela sa čime već radiš) kolika je visina teksta, a posle štampe proveravamo da li je y koordinata koju smo smestili u varijablu veća od trenutne y koordinate printera (ako je printer prešao na novu stranu, ona bi trebalo da bude 0 ili kolika je već margina, pa će sasvim sigurno biti manja od poslednjeg odštampanog reda na prethodnoj strani) i po tome znamo da li smo prešli na novu stranu ili ne. Naravno, nisam ovo testirao, tako da je moguće da ne radi tačno kako treba, ali uz malo modifikacija, trebalo bi da radi.
Drugi način je da ručno izračunaš koliko teksta može da stane na stranu koristeći TextHeight svojstvo printer objekta, pa na osnovu toga proveriš da li si prešao na novu stranu ili ne. Naravno trebaš da znaš kolika je visina papira. Recimo da radiš sa A4 čija visina iznosi 16840 twipsa i da su gornja i donja margina po, šta znam 250 twipsa. Dakle, ovako nešto
Code:
Dim i As Long
Dim lTopMargin As Double
Dim lBottomMargin as Double
Dim lHeight as Double
lTopMargin = 250
lBottomMargin = 250
Printer.CurrentY = lTopMargin
Printer.Print "Header"
lHeight = lTopMargin + Printer.TextHeight("Header")
Printer.Print
lHeight = lHeight + Printer.TextHeight("A")
For i = 1 to 100
   If lHeight + lBottomMargin => 16840 Then 'Presli smo na novu stranu
      Printer.CurrentY = lTopMargin
      Printer.Print "Header"
      lHeight = lTopMargin + Printer.TextHeight("Header")
      Printer.Print
      lHeight = lHeight + Printer.TextHeight("A")
   End If      
   Printer.Print "Something"
   lHeight = lHeight + Printer.TextHeight("Something")   
Next i

Ovo takođe nije testirano, ali po nekoj logici trebalo bi da radi :) Cela stvar može da bude mnogo fleksibilnija ako se od toga napravi funkcija koja će na osnovu nekih parametara da vraća True ili False, ali i ovo će da radi posao.

Najbolje rešenje za štampanje je svakako korišćenje report designera kao što su Crystal Report, ActiveReports i slični, jer dozvoljavaju jednostavno kreiranje izveštaja u WYSIWYG maniru i rešavaju većinu stvari za koje je inače potrebno dosta kodiranja kao što su crtanje tabela, poravnanja, header, footer, podešavanje margina, itd. plus imaju podršku za izvlačenje podataka iz baza podataka, pravljenje upita, conditioning, sumiranje, hijerarhijski prikaz... itd. No, problem kod ovih alata je što su relativno skupi. Postoji doduše verzija Crystal Reportsa (mislim da je 4.6) koja dolazi uz VB6, ali je užasno teško naterati da radi sa bazama novijim od Access97, tako da je za manje projekte možda bolje rešenje napraviti svoje procedure za štampu.

Dobro rešenje može biti i ovo što je Aleksandar pomenuo, a to je korišćenje Office paketa, ne mora to da bude Word, može i Excel ili Access-ovi reportsi, jer je rad sa office objektima maksimalno olakšan u VB-u, tako da imamo pristup svim funkcijama koje imaju ti alati, pa možemo vrlo jednostavno lepo formatirati izveštaj (pa i napraviti template ako treba), ali kao što je već pomenuto, to zahteva da klijent ima instaliran Office paket na svom računaru, tako da ovo rešenje valja koristiti ako radimo softver za specifičnog naručioca za koga znamo da na svim mašinama ima instaliran Office, ali ako se radi softver za prodaju, onda ovo treba izbegavati, jer ne možemo nekoga terati da kupuje MS Office samo da bi naš softver radio kod njega.

U svakom slučaju, korišćenjem printer objekta se mogu odraditi odlični izveštaji, ali ovo zahteva mnogo više truda i vremena, jer sve mora da se ručno iskodira, tako da treba odabrati metodu koja je najpogodnija za specifičan slučaj.
[ Blue82 @ 23.10.2008. 18:31 ] @
Marko hvala, ovo prvo radi. Samo se treba setiti. Word ne moze jer u toj firmi zajebavaju pa ogranicavaju sta ko na kojoj funkciji moze da koristi a po njihovom misljenju kontroloru poste ne treba Office tako da sam pravio rucno. U svakom slucaju mnogo hvala za mnogo Vaseg truda.
Pozdrav!