Moro.
Olen harrastanut tekstin tulostamista alhaalla olevalla koodilla. Nyt kuitenkin huomasin että printPreviewDialog ei näytä kuin osan tulostettavasta tekstistä jos se on vähänkään pidempi (n. 10 tai enemmän). Yritin selvittää että mistähän moinen johtuisi mutta en keksinyt ongelmalle mitään järkevää selitystä (ja näin ollen ratkaisuakaan:). Onko jollain aiheesta kokemusta ja kannattaisikohan ks. tapahtuma tehdä jotenkin toisella tavalla?
ps. sorry kun laitan näin pitkän koodin..
Public Sub KasitteleSivu(ByVal sender As Object, ByVal ev As PrintPageEventArgs) Dim PrintDocument1 As New PrintDocument Try Dim k As Single = 35 Static intCurrentChar As Int32 sivu = sivu + 1 ev.Graphics.DrawString(PrintOtsikko, Me.titlefont4, Brushes.Black, 325, k) k += 50 ev.Graphics.DrawString(PrintNimi, Me.PrintFont3, Brushes.Black, 100, k) k += 20 Dim PrintAreaHeight, PrintAreaWidth, marginLeft, marginTop As Int32 With PrintDocument1.DefaultPageSettings PrintAreaHeight = 910 ''''''.PaperSize.Height - .Margins.Top - .Margins.Bottom PrintAreaWidth = .PaperSize.Width - .Margins.Left - .Margins.Right marginLeft = 100 'vasen marginaali marginTop = 110 'ylämarginaali End With Dim intLineCount As Int32 = CInt(PrintAreaHeight / PrintFont.Height) Dim rectPrintingArea As New RectangleF(marginLeft, marginTop, PrintAreaWidth, PrintAreaHeight) Dim fmt As New StringFormat(StringFormatFlags.LineLimit) Dim intLinesFilled, intCharsFitted As Int32 ' annetaan tulostettava teksti ev.Graphics.MeasureString(Mid(tulostettava, intCurrentChar + 1), PrintFont, _ New SizeF(PrintAreaWidth, PrintAreaHeight), fmt, intCharsFitted, intLinesFilled) ev.Graphics.DrawString(Mid(tulostettava, intCurrentChar + 1), PrintFont, _ Brushes.Black, rectPrintingArea, fmt) intCurrentChar += intCharsFitted If intCurrentChar < tulostettava.Length Then ev.HasMorePages = True Else ev.HasMorePages = False intCurrentChar = 0 End If Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub Public Sub PrintPK() PrintOtsikko = "Päiväkirja" Dim PrintDocument1 As New PrintDocument sivu = 1 tulostettava = Form1.PK_kaikki.Text AddHandler PrintDocument1.PrintPage, AddressOf KasitteleSivu printpreviewdialog1.Document = PrintDocument1 printpreviewdialog1.ShowDialog() End Sub
Tämä on hankala, etenkin kun tuossa koodissa ei varsinaisesti ole kommentteja. Olisiko tässä mahdollista, että jossain kohtaa tulisi ns muuttujan overflow(meniköhän termi oikein?)? Olen kyllä olevinaan käynyt senkin vaihtoehdon läpi ja en löytänyt mitään kohtaan, missä muuttajan koko olisi tullut vastaan. Oisko mitään ideaa että miten tätä kannattaisi lähtä purkamaan?
Tai sitten pitää heittää koko koodi kuikkaan ja tehdä alusta asti uudelleen..
tässä C# esimerkki yhdestä print sovellutuksesta jota käytin edellisessä projektissa:
private void Esikatselu_button1_Click(object sender, EventArgs e) { PrintDocument pd = new PrintDocument(); pd.PrintPage += new PrintPageEventHandler(pd_PrintPage); string DTBP = Esikatselu.richTextBox1.Text; // richtextbox joka sisältää tulostettavan tekstin MyReader = new StringReader(DTBP); pd.Print(); } private void pd_PrintPage(object sender, PrintPageEventArgs e) { float linesperpage; float yPos = 0; float LeftMargin = e.MarginBounds.Left; float TopMargin = e.MarginBounds.Top; int count = 0; Font printFont = Esikatselu.richTextBox1.Font; SolidBrush myBrush = new SolidBrush(Color.Black); linesperpage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics); string line = null; while (count < linesperpage && (line = MyReader.ReadLine()) != null) { e.Graphics.DrawString(line, printFont, myBrush,LeftMargin, yPos); yPos = TopMargin + (count * printFont.GetHeight(e.Graphics)); count++; } if (line != null) e.HasMorePages = true; else e.HasMorePages = false; myBrush.Dispose(); }
hyvin yksinkertainen esimerkki, ei varmaan ole ongelmia vb käännössä.
###EDIT###
Eihän mulla tässä printfiledialogia ollutkaan, pitänee kaivaa se koodin osio kunhan sen paikannan :)
Kiitos esimerkistä. Nyt onkin sopivasti pari päivää tässä vapaata, joten pitäne kattoa jos vaikka saisin tältä pohjalta tämänkin ratkaistua.
Aihe on jo aika vanha, joten et voi enää vastata siihen.