Jetzt hab ich mal wieder etwas mehr Zeit und steh noch vor gleichem Problem.
Hat niemand nen heissen Tip für mich wie ich konkret das endlosdrucken verhinder ?
So, nachdem die Hitze erstmal vorbei ist trau ich mich auch wieder an mein Laptop 🙂
Original von FZelle
Und selbst wenn er die Funktion aufruft, wird es "lustig".Sollte tatsächlich mehr als eine Seite zu drucken sein, wird nämlich dann
gedruckt, bis das Papier alle ist.Bei jedem betreten der Funktion wird von vorne gedruckt, und das
auch noch immer an die selbe Position.Und Irgendwann wird auch der Speicher knapp, weil die Font-Handles nicht
Disposed werden.
Ich hab das Forum jetzt mehrmals durchsucht nach dem drucken mehrerer Seiten.
Ich bin heute leider nicht zur Lösung gekommen.
private void printDocument1_PrintPage(int seite, object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics g = e.Graphics;
float lineH = g.MeasureString("X", new Font("Verdana", 10, FontStyle.Regular)).Height;
int y = 100;
int z = 1;
for (int i = 0; i < listBox1.Items.Count; i++)
{
g.DrawString("(" + z + ") " + listBox1.Items[i].ToString(), new Font("Verdana", 10, FontStyle.Regular), Brushes.Black, 50, y);
y += (int)lineH;
if (y >= e.MarginBounds.Bottom)
{
e.HasMorePages = true;
return;
}
z++;
}
e.HasMorePages = false;
}
Ok, sind mehr als 1 Seite da tritt das e.HasMorePages = true; in kraft, die for Schleife wird neu begonnen und es gibt endlosseiten.
Das hab ich soweit verstanden.
Wie übergeb ich denn dann jetzt die aktuelle Stelle der Listboxeinträge an die printDocument1_PrintPage Funktion ?
Wenn ich diese übergabe habe dann brauch ich ja im Grunde nur die For-Schleife daran anpassen.
Das mit dem Dispose versuch ich jetzt mal in den Kopf zu bekommen.
Ich glaub ich werd mir doch mal endlich nen Buch dazu besorgen.
Das war die Lösung.
Ich danke dir.
Ausdruck rennt zwar noch nicht richtig und sieht bisschen dumm aus, aber das bekomm ich denke ich in den Griff.
Vielen Dank nochmal.
Asche auf mein Haupt, kannst du das bitte für nen totalen Noob übersetzen ?
Original von Programmierhans
Läuft er überhaupt in den printDocument1_PrintPage rein ?
Anscheinend tut er dies nicht.
Ne Idee warum nicht ?
Sorry das ich jetzt so blöd frage, aber wie überprüf ich das ?
Bin ziemlicher Neuling auf dem Gebiet.
Hallo,
ich hab mal wieder ein Problem.
Ich versuche seit heute mittag es hinzubekommen Einträge einer Listbox zu drucken.
Habe hier das Forum durchsucht, so ziemlich alles probiert was nach einer Lösung aussehen könnte und google hab ich auch zum qualmen gebracht.
Das hier ist der momentane Codestand den ich habe, aber es kommt immer nur eine leere Seite.
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics g = e.Graphics;
float lineH = g.MeasureString("X", new Font("Verdana", 10, FontStyle.Regular)).Height;
int y = 100;
foreach (string str in listBox1.Items)
{
g.DrawString(str, new Font("Verdana", 10, FontStyle.Regular), Brushes.Black, 50, 100);
y += (int)lineH;
if (y >= e.MarginBounds.Bottom)
{
e.HasMorePages = true;
return;
}
}
e.HasMorePages = false;
}
private void vorschauToolStripMenuItem_Click(object sender, EventArgs e)
{
if (printPreviewDialog1.ShowDialog() == DialogResult.OK)
{
printDocument1.Print();
}
}
private void druckenToolStripMenuItem1_Click(object sender, EventArgs e)
{
PrintDialog printDialog1 = new PrintDialog();
printDialog1.Document = printDocument1;
DialogResult result = printDialog1.ShowDialog();
if (result == DialogResult.OK)
{
printDocument1.Print();
}
}
Es gibt hier im Forum ein Thread wo auch jemand das Problem mit der leeren Seite hat, aber irgendwie haben mich die Hinweise in dem Thread nicht weiter gebracht.
Kann mir hier jemand nen hilfreichen Schups geben ?
Hallöchen,
ich hab mal wieder ein Problem.
Ich wollte mein kleines Programm mal um eine kleine Vorschaufunktion erweitern.
Klappt auch alles soweit wunderbar mit GetThumbnail() usw., aber bei größeren Bildern dauert das manchmal >2 Sekunden.
Ist schon recht nervig wenn sich da einer dann viele Bilder vorher einmal anschauen möchte.
Wenn ich die Umrechnung weg lasse und die Picturebox auf Strech stelle damit das gesamte Bild zu sehen ist dauerts auch recht lang.
Das muss doch auch anders gehen.
Es gibt neben der Vorschau Funktion von Windows noch etliche andere Programme die sowas machen und da dauerts auch nicht so lang.
Hat da jemand nen Tip für mich ?
Das hier ist mein Code...
private void SetImage(PictureBox pPictureBox, Image pImage)
{
pPictureBox.Image = this.GetThumbnail(pImage, pPictureBox.ClientRectangle);
}
private Image GetThumbnail(Image pImage, Rectangle pBounds)
{
Image ret = new Bitmap(pBounds.Width, pBounds.Height);
Graphics g = Graphics.FromImage(ret);
g.FillRectangle(new SolidBrush(Color.Transparent), 0, 0, ret.Width, ret.Height);
float factor = Math.Max((float)pImage.Width / (float)pBounds.Width, (float)pImage.Height / (float)pBounds.Height);
g.DrawImage(pImage, 0, 0, (float)pImage.Width / factor, (float)pImage.Height / factor);
g.Dispose();
return ret;
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBox1.SelectedItems.Count == 1)
{
Image img = Image.FromFile(@textBox1.Text + "\\" + listBox1.SelectedItem.ToString());
this.SetImage(this.pictureBox2, img);
}
}
Soooo
Aller Anfang ist bekanntlich schwer 🙂
Ich habe Stunden, fast schon Tage gebraucht bis ich es in meinen Kopf bekam 🙂
Ich kann nicht sagen wie oft ich die Postings hier nochmal gelesen habe, aber sie haben mir definitiv die Lösung gebracht.
Ich hab alles in einer Klasse gelassen, für jedes bearbeiten der Controls, sei es auch nur das deaktivieren und aktivieren, eine Methode angelegt.
Eine Methode für die Verarbeitung angelegt.
Thread mit dieser Methode angelegt, BeginInvoke überall eingesetzt und es rennt wie es rennen soll.
Nachdem ich das mit dem BeginInvoke raus hatte war es eine Sache von paar Minuten 😉
Ich bedanke mich bei allen die mir geholfen haben.
Schön das es noch Foren gibt wo Anfänger die auch manchmal nervig werden so behandelt werden wie hier.
Daumen hoch dafür.
Und ihr werdet noch einiges von mir zu lesen bekommen 🙂
Ich bekomm das nicht auf die Reihe.
Ich habe nun alles an Code was Du gesagt hast in eine Methode Namens resizePic in der selben Klasse gelegt und die Threadklasse entfernt.
Bei der Ausführung des Programms meckert er dann nachdem ich auf Start gedrückt habe hier als erstes...
auswahlcount = listBox1.SelectedItems.Count;
Da sagt er mir das mit dem Threadübergreifend.
Wie wende ich da Begininvoke mit an ?
Das BeginInvoke muss ich doch in der Methode resizePic nutzen wenn ich das richtig verstanden habe, oder ?
Ok, ich muss noch mit delegate arbeiten, aber wie setze ich delegate in Bezug auf die listBox an ?
Sorry für meine dummen Fragen, aber trotz Forensuche, MSDN und wühlen in einem Buch komm ich nicht weiter.