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