Elikkä seuraavanlainen probleema,
Eli käytän siis Visual studio 2010, vissiin aika samanlainen kuin 2008. Ja olen väsännyt sellasta yksinkertasta ohjelmaa jossa tietoja voidaan syöttää tietokantaan ja hakea sieltä. Nyt sitten ensimmäinen ongelma on se, että kun tiedot haetaan tietokannasta textboxeihin niin ne pitäisi saada tulostettua. Ja pitäisi saada väännettyä ulkoasuksi lomakkeen tapainen. Eli laatikoita joissa ns. ohjeteksti yläkulmassa. Tämä ohjeteksti onnistuisi tekemällä esim. label kenttä jossa on tämä "ohje". Tässä siis malli mitä tarkoita: http://fi.openoffice.org/kaappaukset/
Olen saanut tehtyä Printdocumentilla niin että tulostaa textboxien sisällön, mutta ne kaikki menee yhteenkohtaan päällekkäin tulostettaessa. Mitenkä siis voin muokata tuota tulostuksen ulkoasua? Eli mitenkä saan järjestettyä textboxeja ja label kenttiä niinkuin haluan ja sitten vielä tulostaa ne siinä asetelmassa. Todennäköisesti selitin liian sekavasti, jos näin niin koitan uudestaan.
Olen tosiaan vasta aloitetullut käyttämään visual studiota joten järkeviä vastauksia.
Tavallaan ihmettelen että miten olet saanut tekstiä niin että ne "menee yhteenkohtaan päällekkäin tulostettaessa", kun DrawStringiä ei edes voi kutsua ilman sijaintia (Point tai Rectangle tai erillinen x ja y). Tietty jos käsket piirtää jokaisen tekstin samaan pisteeseen, niin päällekkäinhän ne menee.
Heh,
Niinkuin sanoin olen vasta alottanu, kävin kirjastosta hakee kirjan ja sitä oon lueskellu. Vissiin menny paikan määrityskohta ohi :D. Eli copy&pastesin valmiista ohjelmasta ton printtauksen. Nyt saan mitä haluankin, kiitoksia!
Ite olen kokenut että copy&paste ja sitte koodin tarkastelu ja muokkaus ollu mulle parhaimpia keinoja oppia. Yleensä aikansa kestää, että pääsee jyvälle.
tee vaikka siten, että lisäät pictureboxin lomakkeelle johon sitten lisäilet kontrolleja (textboxit yms.), tämän jälkeen tallennat pictureboxin sisällön vaikka jpegiksi ja tulostat kuvan.
huom. kontrollit pictureboxiin!
Sub uusiboksi TextBox Teksti1 = new TextBox() Teksti1.Location = new Point(200,200) Teksti1.Size = new System.Drawing.Size(100,20) this.pictureBox1.Controls.Add(Teksti1) End Sub
eipä pysty editoimaan :)
elikäst tuli jotain vb:n ja C#:n sekoitusta näemmä aamu-unisena.
Public Class Form1 Dim Teksti1 As New TextBox() Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load kentat() End Sub Sub kentat() Teksti1.Location = New Point(200, 200) Teksti1.Size = New Size(100, 12) PictureBox1.Controls.Add(Teksti1) End Sub End Class
groovyb kirjoitti:
tee vaikka siten, että lisäät pictureboxin lomakkeelle johon sitten lisäilet kontrolleja (textboxit yms.), tämän jälkeen tallennat pictureboxin sisällön vaikka jpegiksi ja tulostat kuvan.
Toivon, että tämä oli vitsi, vaikkei naurattanut.
Ei kuvaa tartte tiedostoksi tallentaa. Mutta bitmapin tulostus on helppoa, verrattuna siihen että joka kentän borderit piirtäisi gdillä ja sovittelisi merkkijonoja. Tekee bitmapin picturebox.imagesta,skaalaa, ja printtaa ulos vaikka printdocumentilla.
ja ei, ei ollut vitsi.
groovyb kirjoitti:
ja ei, ei ollut vitsi.
No, voi tosiaan olla että lomakkeiden tulostus 96 dpi tarkkuudella printteristä, joka kykenisi 600 dpi tarkkuuteen ei naurattaisi käyttäjääkään.
Eipä tuo nyt niin huono tarkkuus ole, kun kyse on kuitenkin lomakkeesta.
Eli veikkaan että käyttäjää ei edes kiinnostaisi.
tarkkuus on kuitenkin sama kuin 17" näytöllä 1280 × 1024 × 24bit.
No itseäni kiinnostaisi kyllä sen verran että jos softaa pitäisi valita niin moisen tempun tekevä softa lentäisi suhteellisen automaattisesti hylkyyn. Tietty jos ainoa kilpaileva softa maksaisi useita tuhansia euroja enemmän niin saattaisin hammasta purren ottaa sen käyttöön tai jos kyseessä on kohtuu yksinkertainen softa, tehdä itse kunnollisen.
No miksi käyttäjälle kannattaisi ilmoittaa että miten tulostus tapahtuu.
Jos tekee tulostuksen ilman printdialogia pelkästään printdocumentilla, ja näytölle ainoastaan printdocumentin vakiohässäkkädialogin "Printing jotain File x/x"
Tuskin käyttäjä rupeaa paperillaan vertaamaan lomakelaatua eri tulostustarkkuuksiin. varsinkin lomaketarkkuuden ollessa noinkin hyvä.
Kyse ei kuitenkaan ole mistään tekstinkäsittelyohjelmasta, vaan ohjelmasta joka hakee tietokannasta tavaraa ja tulostaa vakiolomakkeena.
Jaa, no onneksi minulla ei yksikään ohjelma tulosta printscreenlaatua tulostustoiminnolla ja toisaalta onneksi en myöskään ole niin sokea ettenkö huomaisi sitä kahden metrin päästä jos näin tapahtuisi. Voisi melkein kysyä että miksi ohjelmassa olisi edes tulostustoiminto, jos printscreenilläkin saisi saman lopputuloksen.
Mutta joo. Ilmeisesti olit tosiaan ihan tosissasi. Oletin vaan alunperin, kun kysyjä oli tekemässä ihan oikein, ja aloit neuvoa miten asia tehdään väärin, että olisit ehkä ollut leikkimielellä liikkeellä.
groovyb kirjoitti:
No miksi käyttäjälle kannattaisi ilmoittaa että miten tulostus tapahtuu.
No ei sillä varmaan mitään väliä olisikaan kertoa. Jos ohjelma tuottaa "paskaa" niin ei minuakaan suuremmin kiinnosta, miten ohjelma saa sen aikaiseksi.
Tietysti sisäisessä käytössä tulosteen luettavuus ja edustavuus ei välttämättä ole aivan pakollisia asioita. Mutta miksi niitä tietoja edes tulostettaisiin paperille, jos sitä paperia ei ole tarkoitus lähettää mihinkään?
Hetkinen, mistä lähtien 96 dpi ei ole luettavaa?
Ehkä jos on sokea, mutta sitten onkin ihan sama mikä tarkkuus on kyseessä.
Edustavuus on taasen tasan sellainen minkä lomakkeesta tekee.
Ja kyllä, printscreen ajaa saman asian jos itse skaalaa ja leikkaa turhakkeet pois ja tulostaa erikseen. Mutta monen muunkin asian voi korvata. Nyt kuitenkin oli kyse ohjelmoinnin helpottamiseksi näinkin yksinkertaisessa asiassa.
Hemmetti, eihän edes tarvita tulostimia kun kynälläkin voi kirjoittaa.
kaikessa voi aina hifistellä, mutta tuskin monikaan meistä on kalliita fonttikirjastojakaan ostanut sen takia että saisi tekstin näyttämään laadukkaammalta, ellei sitten satu kirjapainoa omistamaan.
yhteenvetona, imagen tulostus on helppoa ja joskus kätevää.
Kun taitoa riittää ja tarvetta hienolle ja tarkalle tulostukselle on, kannattaa opetella oikeita tulostustekniikoita.
Mutta on turhaa provosoitua ja väittää mitään paskaksi. Moni asia on tehty vain ohjelmoinnin helpottamiseksi, laadusta tinkien, ja silti päivittäin käytämme näitä heikompia tekniikoita. Harva ohjelmiasiakaan paskaksi väittää vaikka viekin enemmän muistia ja tehoja kuin assemblyllä väännetty vastaava. Tai alkaa haukkumaan ihmisten SDL-viritelmiä paskoiksi kun OpenGL:llä tekisi paljon nopeampia. Niinkuin tässäkin tapauksessa, tulostuslaatu ei ole edes huono. Tekstistä saa hyvin selvää, niinkuin logoistakin. helpompaa vaan ohjelmoida jos tarve ei ole paremmalle laadulle. Eipä siitä nyt niin hirveästi ole aikaa kun tavallisia rasteri bitmap -fontteja käytettiin jatkuvasti. Eikä siinä auttanut printterin tarkkuus kun fontti skaalatuessaan huononi.
groovyb kirjoitti:
Hetkinen, mistä lähtien 96 dpi ei ole luettavaa?
Suunnilleen siitä lähtien kun se tulostetaan paperille. Näytöllä luettavuutta parannetaan pehmennyksellä, joka toisaalta tulostettaessa huonontaa tilannetta ennestään. Siis ruudulta kaapattu ja tulostettu näyttää kopa vielä huonommalta kuin 96dpi m/v-tuloste. Jos olet tosissasi sitä mieltä ettei heikko resoluutio vaikuta luettavuuteen niin miksiköhän kaikkia painotuotteita ei tehdä 96dpi tarkkuudella. Tosiasiassa jopa 300 dpi vs 600 dpi tulosteiden välillä on selkeä luettavuusero varsinkin pienillä kirjasinkoilla.
lainaus:
Ehkä jos on sokea, mutta sitten onkin ihan sama mikä tarkkuus on kyseessä.
Siis nimenomaan sokea täytyy olla ettei havitse selvää eroa luettavuudessa. Viestistäsi tulee vähän sellainen kuva, että et tiedä mitä "luettavuus" tarkoittaa. Se siis tarkoittaa sitä kuinka sujuvaa ja mukavaa lukeminen on. Tietenkin sitä pitää pystyä lukemaan, mutta pelkkä kirjaimien erottaminen toisistaan ei riitä hyvään luettavuuteen.
lainaus:
Edustavuus on taasen tasan sellainen minkä lomakkeesta tekee.
Pointti olikin siinä että printscreenlomakkeesta ei saa edustavaa millään - paitsi ehkä jos haetaan jotain 8-bit retrohenkeä ja tehdään se muutenkin vaikka C64-tyylillä.
lainaus:
Nyt kuitenkin oli kyse ohjelmoinnin helpottamiseksi näinkin yksinkertaisessa asiassa.
Eihän tuo edes helpota. Siinäkin tapauksessa, että lomakepohja olisi ohjelmoitu lomakkeeksi niin sen tulostaminen onnistuisi ihan yhtä helposti kunnollakin. Nyt oli vielä lisäksi lomakepohja valmiiksi paperimuotoisena tehtynä, joten ruutulomakkeen tekeminen olisi lähinnä lisävaivaa.
lainaus:
yhteenvetona, imagen tulostus on helppoa ja joskus kätevää.
Kun taitoa riittää ja tarvetta hienolle ja tarkalle tulostukselle on, kannattaa opetella oikeita tulostustekniikoita.
Ja kun kysyjä oli jo käyttämässä oikeaita tulostekniikoita, niin tottakai hänelle kannattaa neuvoa miten asia tehdään huonommin?
lainaus:
Mutta on turhaa provosoitua ja väittää mitään paskaksi. Moni asia on tehty vain ohjelmoinnin helpottamiseksi, laadusta tinkien, ja silti päivittäin käytämme näitä heikompia tekniikoita. Harva ohjelmiasiakaan paskaksi väittää vaikka viekin enemmän muistia ja tehoja kuin assemblyllä väännetty vastaava. Tai alkaa haukkumaan ihmisten SDL-viritelmiä paskoiksi kun OpenGL:llä tekisi paljon nopeampia. Niinkuin tässäkin tapauksessa, tulostuslaatu ei ole edes huono.
Tulostuslaatu on tässä tapauksessa todella huono ja laadun heikennys on aivan kohtuuton suhteessa säästettyyn aikaan, varsinkin kun ajansäästöä ei edes tulisi. Muutenkin jos ohjelma on hidas tai syö muistia paljon, niin prossuja ja muistia saa kaupasta. Jos ohjelma ei vaan osaa tehdä kunnollista, niin siinä ei auta mikään muu kuin ohjelman vaihto.
Mun on oikeasti hyvin vaikea uskoa että vakavalla naamalla kehtaat väittää että näiden luettavuus on yhtä hyvä ja että useimmat käyttäjät ei pettyisi jos ohjelma tuottaisi tuon screenprint-mukaisen tulosteen:
http://grez.info/putka/print.jpg
http://grez.info/putka/screenprint.jpg
Lyijytäytekynä on ihan vaan mittakaavan saamiseksi.
Muistutan yhä, ettei kyse ole screenshotista. vaan bitmapista, jonka resoluutiota voi toki muuttaa Bitmap.Setresolutionilla.
http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.setresolution.
lainaus:
Remarks
--------------------------------------------------------------------------------Use this method to set the desired resolution on a newly created bitmap. Changing the resolution of the image does not change its physical size.
ja jos lomake on jo lähellä A4 kokoa (niinkuin aika lähellä normaalistikin lomakkeita täytellään wordillä etc fullscreeninä), ei skaalaus ole mikään valtava.
groovyb kirjoitti:
Muistutan yhä, ettei kyse ole screenshotista. vaan bitmapista, jonka resoluutiota voi toki muuttaa Bitmap.Setresolutionilla.
Niin, tuo esimerkkikään ei ollut screenshotti, vaan nimenomaan 96dpi bittikartta, jonka kerroit olevan yhtä luettava kuin kunnollinen tuloste.
Toki jos tehdään vaikka 4960 pikselin levyinen bittikartta, niin onhan se tulostettuna tietysti yhtä tarkka kuin jos 600dpi tulostimella lätkisi tekstit suoraan printerin grafiikkapinnalle. En vaan oikein ymmärrä miksi tämä asia pitäisi tehdä normaalia vaikeammin. Tai ehkä pystyt demonstroimaan miten teet kätevästi esimerkiksi tuon aloitusviestissä olleen lomakkeen (tai osan siitä) mainostamallasi tekniikalla.
samanlaista lomakettahan ei toki tarvinnut tehdä, vaan vastaavanlaista.
Eli sellaista missä kentän oikeassa yläkulmassa on otsikko ja alla laatikko.
näin minä sen ymmärsin.
mutta tässä lyhyt esimerkki (lomakkeelle vedetty menustrip tulostus ja esikatselu napein, printdocument ja printpreviewdialog)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace sdgsdg { public partial class Form1 : Form { public Form1() { InitializeComponent(); } PrintDialog PD = new PrintDialog(); Bitmap MemoryImage; private void Form1_Load(object sender, EventArgs e) { printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(PrintDocument1_PrintPage); panel1.BackColor = Color.White; Size _Size = new Size(panel1.Width, panel1.Height); MemoryImage = new Bitmap(_Size.Width,_Size.Height); MemoryImage.SetResolution(150f, 150f); Init_Controls(); } private void Init_Controls() { //Etunimet //#################################### Label LB1 = new Label(); LB1.Location = new Point(100, 50); LB1.Size = new Size(200, 20); LB1.Text = "Etunimet"; LB1.Font = new Font(LB1.Font.FontFamily.Name, 14); LB1.BackColor = Color.White; panel1.Controls.Add(LB1); //#################################### TextBox TB1 = new TextBox(); TB1.Text = "Olavi"; TB1.Location = new Point(100, 75); TB1.Size = new Size(200, 40); TB1.Font = new Font(TB1.Font.FontFamily.Name, 20); panel1.Controls.Add(TB1); //#################################### //Sukunimi //#################################### Label LB2 = new Label(); LB2.Location = new Point(100, 120); LB2.Size = new Size(200, 20); LB2.Text = "Sukunimi"; LB2.Font = new Font(LB1.Font.FontFamily.Name, 14); LB2.BackColor = Color.White; panel1.Controls.Add(LB2); //#################################### TextBox TB2 = new TextBox(); TB2.Text = "Virta"; TB2.Location = new Point(100, 145); TB2.Size = new Size(200, 40); TB2.Font = new Font(TB2.Font.FontFamily.Name, 20); panel1.Controls.Add(TB2); //#################################### } private void tulostaToolStripMenuItem_Click(object sender, EventArgs e) { panel1.DrawToBitmap(MemoryImage, panel1.ClientRectangle); PD.Document = printDocument1; DialogResult DR = PD.ShowDialog(); if (DR == DialogResult.OK) { printDocument1.Print(); } printDocument1.Dispose(); } private void PrintDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { e.Graphics.DrawImage(MemoryImage, 0, 0); } private void esikatseluToolStripMenuItem_Click(object sender, EventArgs e) { panel1.DrawToBitmap(MemoryImage, panel1.ClientRectangle); printDocument1.OriginAtMargins = true; printPreviewDialog1.Document = printDocument1; printPreviewDialog1.ShowDialog(); } } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.