Autor |
Beitrag |
Christian K.
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 02.05.11 08:46
Hallo,
ich bin absoluter C# Anfänger (Umsteiger von Delphi) und habe Probleme mit PrintDocument und PrintPreviewDialog.
Ich bekomme eine "Hallo Welt" Ausgabe gedruckt und auch per Vorschau angezeigt. Was ich aber nicht verstehe ist, wie man mehrere Seiten druckt. e.HasMorePages auf true und das Event PrintDocument.PrintPage wird erneut durchgeführt.
(In Delphi habe ich einfach den Druck mit Printer.BeginDoc gestartet, habe dann meine neuen Seiten mit Printer.NewPage erzeugt und einfach der Reihe nach gedruckt bis der Druck mit Printer.EndDoc beendet wurde.)
Wenn aber das Event von vorne beginnt, wird ja jedesmal das gleiche gedruckt...
Wenn das mit den mehreren Seiten klappt, stellt sich die Frage, wie macht man die Seiteninfo auf das Papier.
Seite 1 / 3 usw.
Ein weiteres Problem habe ich mit dem PrintPreviewDialog. Durch die Spielerei mit e.HasMorePages habe ich einfach irgendwie 3 Seiten erstellt aber mit dem Druckenbutton im PrintPreviewDialog wird nur die letzte Seite gedruckt. Wenn ich PrintDocument.Print() ausführe, werden alle 3 Seiten gedruckt. Was mache ich da falsch?
Ich bin für jede Hilfe dankbar
Christian
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 02.05.11 10:05
Hi!
Christian K. hat folgendes geschrieben : | Wenn aber das Event von vorne beginnt, wird ja jedesmal das gleiche gedruckt... |
Du musst Dir merken, wie weit Du schon warst. Wenn Du z.B. eine Liste drucken willst, merkst Du Dir den Index des zuletzt ausgegebenen Eintrags und beim nächsten Aufruf des Events machst Du dort weiter.
Christian K. hat folgendes geschrieben : | Wenn das mit den mehreren Seiten klappt, stellt sich die Frage, wie macht man die Seiteninfo auf das Papier.
Seite 1 / 3 usw. |
Du musst Dir angucken, wieviel Platz alles, was Du drucken willst, braucht. Daraus und aus der Größe einer Seite kannst Du ausrechnen, wieviele Seiten Du insgesamt brauchen wirst.
Christian K. hat folgendes geschrieben : | Ein weiteres Problem habe ich mit dem PrintPreviewDialog. Durch die Spielerei mit e.HasMorePages habe ich einfach irgendwie 3 Seiten erstellt aber mit dem Druckenbutton im PrintPreviewDialog wird nur die letzte Seite gedruckt. Wenn ich PrintDocument.Print() ausführe, werden alle 3 Seiten gedruckt. Was mache ich da falsch? |
Da kann ich gerade nichts zu sagen, ich habe mit dem Preview-Dialog noch nicht gearbeitet und ohne Deinen Quellcode zu kennen, ist das eh schwer.
Grüße
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Christian K. 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 02.05.11 10:29
Index der Tabelle merken und dann da weiter drucken habe ich mir auch schon gedacht. Ich muss mehrere unterschiedliche Tabellen untereinander, teilweise nebeneinander und auf einer zusätzlichen Seite noch ein Chart drucken. Aber das sollte sich berechnen lassen
Testausdruck:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65:
| namespace WindowsFormsApplication1 { public partial class Form1 : Form {
public Form1() {
InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (printDialog1.ShowDialog() == DialogResult.OK) { printDialog1.PrinterSettings.PrintRange = PrintRange.AllPages; printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage); printPreviewDialog1.ShowDialog(); } }
int Seite = 1; int MaxZeilen = 100; private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { Font printFont = new Font("Courier New", 12); e.Graphics.DrawString("Überschrift (Seite " + Seite + ")", printFont, Brushes.Black, 50, 25); e.Graphics.DrawLine(new Pen(Color.Black, 2.2f), new Point(50, 50), new Point(810, 50)); int i = 1; int ZeilenProSeite = 40; int ypos = 100; if (Seite > 1) { i = (ZeilenProSeite * (Seite - 1)) + 1; ZeilenProSeite = (ZeilenProSeite * (Seite - 1)) + ZeilenProSeite; if (ZeilenProSeite > MaxZeilen) ZeilenProSeite = MaxZeilen; } else i = 1;
while (i <= ZeilenProSeite) { e.Graphics.DrawString("Zeile " + i, printFont, Brushes.Black, 50, ypos); e.Graphics.DrawLine(new Pen(Color.Black, 0.2f), new Point(50, ypos+25), new Point(810, ypos+25)); ypos = ypos + 25; i++; }
if (i < MaxZeilen) { e.HasMorePages = true; Seite++; } else e.HasMorePages = false; }
} } |
Ich setze printDialog1.PrinterSettings.PrintRange = PrintRange.AllPages, in der Vorschau werden auch alle 3 Seiten angezeigt aber es wird nur die 3te Seite gedruckt.
Moderiert von Christian S.: Quote- durch C#-Tags ersetzt
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 02.05.11 10:41
Ich würde behaupten, dass die Variable Seite durch das Erzeugen der Vorschau den Wert 3 hat, und deswegen beim eigentlichen Drucken nur diese Seite rauskommt. Ich würde die Variable daher da, wo Du e.HasMorPages auf false setzt, auch wieder auf 1 setzen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Christian K. 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 02.05.11 10:54
Stimmt! Jetzt gehts  nur habe ich absolut keine Idee warum? Ist das nicht total egal welchen Wert meine Variable hat?
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 02.05.11 11:06
Wenn es egal wäre, bräuchtest Du sie nicht
Du bestimmst doch anhand der Variable, auf welcher Seite Du bist. Nach der Vorschau bist Du auf Seite 3. Wenn dann gedruckt wird, bist Du immer noch auf Seite 3 -> es wird nur die letzte Seite gedruckt.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Christian K. 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 02.05.11 11:18
Ich verstehe aber nicht, was meine Variable mit der Druckvorschau zu tun hat. Die Vorschau zeigt nach wie vor Seite 1 an und ich kann mir dort auch alle Seiten anschauen. Ich werde mal die Variable Seite entfernen und mir auf andere Weise merken wo ich bin
Bin gespannt was dabei raus kommt...
|
|
Christian K. 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 02.05.11 11:47
Sehr merkwürdig...
Egal wie ich das auch mache, wenn ich die Merkervariable nicht zurücksetze, wird nur die letzte Seite gedruckt.
Ich habe das noch nicht verstanden.
EDIT: Das Event wird beim Klicken des PrintButtons in der Vorschau noch einmal ausgeführt. Das beantwortet die Frage 
|
|
CityHunter
Hält's aus hier
Beiträge: 12
Win8
C# (VS 2010)
|
Verfasst: Sa 19.05.12 20:55
Druckvorschau,
hallo habe da mal eine Frage. Habe daten gespeichert in meiner datei.dat
Jetzt würde ich sie ausgeben lassen in der Druckvorschau unter einander.
Das sind die Daten in meiner Datei.
È Gewinner4 Gewinne0 Nobody Test Nobody Nobody Nobody Nobody Nobody Nobody
die habe ich mit FileStream und BinaryStream erstellt.
Kann ich dir irgend wie ausgeben lassen ohne sie vorher in einer anderen Datei zuschreiben? Lasse sie schon aufen Bildschirm als Graphic ausgeben.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| ublic void ListeAusgeben(System.Drawing.Graphics zeichenflaeche, System.Drawing.RectangleF flaeche) { System.Drawing.SolidBrush temPinsel = new System.Drawing.SolidBrush(System.Drawing.Color.White); System.Drawing.Font tempSchrift = new System.Drawing.Font("Arial", 12, System.Drawing.FontStyle.Bold); System.Drawing.StringFormat ausrichtung = new System.Drawing.StringFormat(); float punkteX, nameX, y; punkteX = flaeche.Left + 50; nameX = flaeche.Left + 250; y = flaeche.Top + 50; ausrichtung.Alignment = System.Drawing.StringAlignment.Center; zeichenflaeche.Clear(System.Drawing.Color.Black); zeichenflaeche.DrawString("Bestenliste", tempSchrift, temPinsel, flaeche.Width / 2, y, ausrichtung); for (int i = 0; i < anzahl; i++) { y = y + 20;
zeichenflaeche.DrawString(Convert.ToString(bestenliste[i].GetPunkte()), tempSchrift, temPinsel, punkteX, y); zeichenflaeche.DrawString(bestenliste[i].GetName(), tempSchrift, temPinsel, nameX, y); } } |
Kriege ich das irgend wie hin das es auf der Vorschau so hinbekomme wie auf meiner Froms?
|
|
Th69
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 20.05.12 09:40
Hallo CityHunter,
du brauchst deine Methode doch nur aus dem PrintDocument.PrintPage-Ereignis aufzurufen. Evtl. mußt du jedoch wegen verschiedener Größe und Skalierung von Bildschirm und Drucker die Methode entsprechend anpassen (schau dir dazu mal die Member der PrintPageEventArs an).
|
|
CityHunter
Hält's aus hier
Beiträge: 12
Win8
C# (VS 2010)
|
Verfasst: So 20.05.12 10:25
Also diesen Fehler bekomme ich immer
Fehler 1 Die beste Übereinstimmung für die überladene System.Drawing.Graphics.DrawString(string, System.Drawing.Font, System.Drawing.Brush, float, float)-Methode hat einige ungültige Argumente. E:\Patrick\Eigene Dokumente\Visual Studio 2010\Projects\ILS\C#\Pong Stream16\Pong\Form1.cs 775
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { SolidBrush pinsel = new SolidBrush(Color.Black); Font schrift = new System.Drawing.Font("Arial", 12, FontStyle.Bold); e.Graphics.DrawString(spielepunkte.ListeAusgeben(zeichenflaeche, spielfeldGroesse),schrift, pinsel,20,20); } |
Habe eigendlich so gedacht ne schleife ein zu bauen in printDocument1 und sie denn aufbauen lassen.
Das ist hier mal meine kompletter Code.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221:
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace Pong { class Score { int punkte; int anzahl = 10; string dateiname; Liste[] bestenliste; public Score() { punkte = 0; bestenliste = new Liste[anzahl]; for (int i = 0; i < anzahl; i++) { bestenliste[i] = new Liste(); } dateiname = System.Windows.Forms.Application.StartupPath + "\\score.dat"; if (System.IO.File.Exists(dateiname)) { lesePunkte(); } }
void lesePunkte() { int tempPunkte; string tempName; FileStream fStream = new FileStream(dateiname,FileMode.Open); BinaryReader binaerDatei = new BinaryReader(fStream); for (int i = 0; i < anzahl; i++) { tempPunkte = binaerDatei.ReadInt32(); tempName = binaerDatei.ReadString(); bestenliste[i].SetzeEintrag(tempPunkte, tempName); } binaerDatei.Close(); fStream.Close(); }
public void schreibePunkte() { FileStream fStream = new FileStream(dateiname, FileMode.Create); BinaryWriter binaerDatei = new BinaryWriter(fStream); for (int i = 0; i < anzahl; i++) { binaerDatei.Write(bestenliste[i].GetPunkte()); binaerDatei.Write(bestenliste[i].GetName()); } binaerDatei.Close(); fStream.Close(); } public int VeraenderePunkte(int anzahl) { punkte = punkte + anzahl; return punkte; }
public void LoeschePunkte() { punkte = 0; }
public bool neuerEintrag() { string tempName = string.Empty; if (punkte > bestenliste[anzahl - 1].GetPunkte()) { NameDialog neuerName = new NameDialog(); if (neuerName.ShowDialog() == System.Windows.Forms.DialogResult.OK) { tempName = neuerName.LiefereName(); } neuerName.Close();
bestenliste[anzahl - 1].SetzeEintrag(punkte, tempName); Array.Sort(bestenliste); schreibePunkte(); return true; } else { return false; } }
public void ListeAusgeben(System.Drawing.Graphics zeichenflaeche, System.Drawing.RectangleF flaeche) { System.Drawing.SolidBrush temPinsel = new System.Drawing.SolidBrush(System.Drawing.Color.White); System.Drawing.Font tempSchrift = new System.Drawing.Font("Arial", 12, System.Drawing.FontStyle.Bold); System.Drawing.StringFormat ausrichtung = new System.Drawing.StringFormat(); float punkteX, nameX, y; punkteX = flaeche.Left + 50; nameX = flaeche.Left + 250; y = flaeche.Top + 50; ausrichtung.Alignment = System.Drawing.StringAlignment.Center; zeichenflaeche.Clear(System.Drawing.Color.Black); zeichenflaeche.DrawString("Bestenliste", tempSchrift, temPinsel, flaeche.Width / 2, y, ausrichtung); for (int i = 0; i < anzahl; i++) { y = y + 20;
zeichenflaeche.DrawString(Convert.ToString(bestenliste[i].GetPunkte()), tempSchrift, temPinsel, punkteX, y); zeichenflaeche.DrawString(bestenliste[i].GetName(), tempSchrift, temPinsel, nameX, y); } }
public Liste Schummelausgabe(int eintrag) { return bestenliste[eintrag]; } } class Liste : IComparable { int listePunkte; string listeName;
public Liste() { listePunkte = 0; listeName = "Nobody"; }
public int CompareTo(object objekt) { Liste tempListe = (Liste) (objekt); if (this.listePunkte < tempListe.listePunkte) { return 1; } if (this.listePunkte > tempListe.listePunkte) { return -1; } else { return 0; } }
public void SetzeEintrag(int punkte, string name) { listePunkte = punkte; listeName = name; }
public int GetPunkte() { return listePunkte; }
public string GetName() { return listeName; } } } |
|
|
Th69
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 20.05.12 10:34
Hallo CityHunter,
was soll das denn werden?
Du sollst einfach das e.Graphics-Objekt an deine ListeAusgeben-Methode als Parameter übergeben (die DrawString-Methode benötigst du dort ja nicht, da dies ja schon deine andere Methode erledigt).
|
|
CityHunter
Hält's aus hier
Beiträge: 12
Win8
C# (VS 2010)
|
Verfasst: So 20.05.12 11:56
Th69 hat folgendes geschrieben : | Hallo CityHunter,
was soll das denn werden?
Du sollst einfach das e.Graphics-Objekt an deine ListeAusgeben-Methode als Parameter übergeben (die DrawString-Methode benötigst du dort ja nicht, da dies ja schon deine andere Methode erledigt). |
Ok danke für den Anstubser, bin bissel durchen Wind. Habe ordenlich gefeiert weil Bayern verloren hat  .
|
|
|