Autor |
Beitrag |
Daffke
Beiträge: 29
Win XP
MS Visual C# 2005 Express Edition
|
Verfasst: Fr 27.04.07 15:49
Och, Manno... Ich möchte den Inhalt all meiner Arrays auf dem Drucker ausgeben lassen. Irgendwie bekomme ich das aber nich' "gebacken". Im Internet hab' ich kaum Infos über das Drucken unter C# gefunden. Jetz' hab' ich das Programm zumindest so weit, das eine Seite ausgedruck wird. Aber was mach' ich, wenn's mehr zu drucken gibt? Mit HasMorePages hab ich's auch probiert. Das haut aber auch nich' hin. Als Ergbnis wird die Dokument Nr. bis ins unendliche hochgezählt :-( Ich bin ja nun schon ein alter Mensch Meine Programmierkenntnisse stammen aus C64'er-Zeiten. Danach hab' ich 'ne sehr laaaaaange Programmierpause eingelegt. Früher war es "in Sachen Drucker" doch viel besser. Der Drucker hat einfach auf der nächsten Seite weitergedruckt, wenn die eine Seite voll war ;-) Vielleicht kann hier jemand einem "alten Opa" weiterhelfen... Gibt's irgendeine Möglichkeit, wie ich über mehrere Seiten drucken kann? Vielen Dank für eure Hilfe! Gruß, Daffke Moderiert von Christian S.: b-Tags entferntModeriert von Christian S.: Topic aus C# - Die Sprache verschoben am Fr 27.04.2007 um 15:51
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 27.04.07 15:53
Mit HasMorePages ist das eigentlich schon richtig. Man muss halt nur drauf achten, es auch irgendwann mal auf false und nicht nur auf true zu setzen. Zeig mal, die wie Dein Code zum Drucken aussieht.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Daffke
Beiträge: 29
Win XP
MS Visual C# 2005 Express Edition
|
Verfasst: Fr 27.04.07 17:04
Hallo!
Ich hab' den ganzen Code gerade frustriert "in die Ecke geworfen". Ich fang einfach nochma' neu an.
Hier das Problem:
Ich habe ein 2-dimensionales Array: daten[200,3] und möchte auf meinem Drucker den Inhalt der Arrays ausgeben lassen. Das sollte so aussehen:
C#-Quelltext 1: 2:
| daten[0,1] daten[0,2] daten[0,3] daten[1,1] daten[1,2] daten[1,3] |
C#-Quelltext 43:
| /* ... */ daten[42,1] daten[42,2] daten[42,3] |
C#-Quelltext 200:
| /* ... */ daten[199,1] daten[199,2] daten[199,3] |
Leider ist eine DIN-A4-Seite nicht lang genug, um alle Zeilen auszudrucken (bei einer "menschlichen" Fontgröße ).
Wie kann ich also den Text über mehrere Seiten drucken lassen?
Für ein vollständiges Codebeispiel wäre ich sehr dankbar.
Viele Grüße,
Daffke
Moderiert von Christian S.: C#-Tags anders gesetzt
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 27.04.07 17:20
Okay, mal schauen. Ich schreib's aus dem Gedächtnis, kleine Fehler möge man mir verzeihen
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| private int printCount = 0; private Font printFont = ...; public void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { Single linesPerPage = 2.0/3.0*e.MarginBounds.Height / printFont.GetHeight(e.Graphics); int thisCount = 0; while (thisCount < linesPerPage && printCount < linesInArray) { Single yPos = e.MarginBounds.Top + 1.5*thisCount*printFont.getHeight(e.Graphics); Single xPos = e.MarginBounds.Left; e.Graphics.DrawString(...); thisCount++; printCount++; } e.HasMorePages = printCount < linesInArray; } |
Es sollte Dir zumindest einige Hinweise geben, wie's gemacht wird.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Daffke
Beiträge: 29
Win XP
MS Visual C# 2005 Express Edition
|
Verfasst: Fr 27.04.07 18:52
Hi Christian!
Vielen Dank für deinen Tipp. Leider hat das auch nicht funktioniert. Wahrscheinlich bin ich zu blöd dafür. Erst hat er alle möglichen Befehle nich' erkannt (Code blau unterstrichen). Anschließend hat der Compi aufgrund des "HasMorePages"-Befehls die zu druckenden Seiten bis ins Unendliche hochgezählt
Ich hab' mein Programm jetzt aber so weit, dass alle Datensätze auf eine Seite passen
Damit hab' ich mein Problem zwar gelöst, aber schlauer bin ich dadurch auch nicht geworden.
Trotzdem: Vielen Dank nochmal!
Gruß,
Daffke
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 27.04.07 18:55
Daffke hat folgendes geschrieben: | Erst hat er alle möglichen Befehle nich' erkannt (Code blau unterstrichen). |
Ich vermute mal einen fehlenden Namespace im using-Teil.
Daffke hat folgendes geschrieben: | Anschließend hat der Compi aufgrund des "HasMorePages"-Befehls die zu druckenden Seiten bis ins Unendliche hochgezählt |
Das kann eigentlich nicht sein. printCount wird in jedem Schleifendurchlauf erhöht und muss daher irgendwann größer als die Länge des Arrays werden.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Daffke
Beiträge: 29
Win XP
MS Visual C# 2005 Express Edition
|
Verfasst: Fr 27.04.07 19:33
Ich hab's nochmal so versucht:
C#-Quelltext 1: 2: 3: 4: 5:
| for (i=0;i<=200;i++) { e.Graphics.DrawString(daten[i, 1], printFont, Brushes.Black, x, y); e.HasMorePages = (i==100); } |
Da hat er den HasMorePages-Befehl einfach ignoriert, und bei ...
C#-Quelltext 1: 2: 3: 4: 5:
| for (i=0;i<=200;i++) { e.Graphics.DrawString(daten[i, 1], printFont, Brushes.Black, x, y); e.HasMorePages = (i>100); } |
... da hat er die Dokumente wieder hochgezählt bis oo
Es scheint mir aber, dass ich das Prinzip nicht verstanden habe ...
Gruß,
Daffke
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 27.04.07 19:48
Das PrintPage-Event wird für jede Seite aufgerufen. Also nicht einmal pro Druckauftag, sondern einmal pro Seite. Du druckst in einem Aufruf also immer nur soviel, wie auf eine Seite passt. Falls nun aber noch was übrig ist, was gedruckt werden soll, dann setzt Du "HasMorePages" auf true, damit das Event ein weiteres Mal (für die nächste Seite) aufgerufen wird.
So wird es in dem von mir geposteten Sourcecode gemacht:
- Im Feld printCount außerhalb des Events (damit es in jedem Aufruf genutzt werden kann), speichere ich, wieviele Zeilen insgesamt gespeichert wurden. Zu Anfang jeden Druckauftrags muss diese Variable natürlich auf 0 gesetzt werden.
- Im Event ermittle ich dann erst einmal, wieviel Zeilen auf eine Seite passen (linesPerPage).
- In thisCount wird gespeichert, wieviel Zeilen schon auf dieser Seite geschrieben wurden.
- Die Abbruchbedingung der Schleife prüft nun zum einen, ob wir noch nicht am Ende der Zeile sind (thisCount < linesPerPage) und ob es noch was zu drucken gibt (printCount < linesInArray).
- In der Schleife wird dann sowohl die Zahl der insgesamt gedruckten Zeilen als auch die Anzahl der auf der Seite gedruckten Zeilen erhöht.
- Wurde die Schleife verlassen, wird durch vergleich von printCount mit linesInArray entschieden, ob weitere Seiten gedruckt und damit das Event erneut aufgerufen werde soll.
Hoffe, es ist etwas klarer geworden.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Daffke
Beiträge: 29
Win XP
MS Visual C# 2005 Express Edition
|
Verfasst: Fr 27.04.07 20:17
Also, ich hab' den Code nochmal ausprobiert.
Mittlerweile gibt der Compi nur noch 2 Fehlermeldungen aus:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Single linesPerPage = 2.0/3.0*e.MarginBounds.Height / printFont.GetHeight(e.Graphics); int thisCount = 0; while (thisCount < linesPerPage && printCount < 200) { Single yPos = e.MarginBounds.Top + 1.5*thisCount*printFont.GetHeight(e.Graphics); Single xPos = e.MarginBounds.Left; text=daten[thisCount,1]+" "+daten[thisCount,2]+" "+daten[thisCount,3]; e.Graphics.DrawString(text, printFont, Brushes.Black, xPos, yPos); thisCount++; printCount++; } e.HasMorePages = printCount < 200; |
Zeile 1: Fehler 1 Der Typ "double" kann nicht implizit in "float" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)
Zeile 5: Fehler 2 Der Typ "double" kann nicht implizit in "float" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)
Erst hat er noch bei "GetHeight" gemeckert. Aber das lag nur an der Groß-/Kleinschreibung.
Gruß,
Daffke
Zuletzt bearbeitet von Daffke am Fr 27.04.07 20:26, insgesamt 1-mal bearbeitet
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 27.04.07 20:26
Dann musst Du entsprechend casten.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Daffke
Beiträge: 29
Win XP
MS Visual C# 2005 Express Edition
|
Verfasst: Fr 27.04.07 20:27
Alles klar. Vielen Dank!
Schönes Wochenende!
Gruß,
Daffke
|
|