Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [VB.NET] Osa printistä häviää..?

Sam76 [30.11.2009 14:36:26]

#

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

Sam76 [01.12.2009 22:38:35]

#

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..

groovyb [28.12.2009 12:11:19]

#

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 :)

Sam76 [28.12.2009 13:46:08]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta