Autor Beitrag
Daffke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

Win XP
MS Visual C# 2005 Express Edition
BeitragVerfasst: 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 user profile iconChristian S.: b-Tags entfernt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Fr 27.04.2007 um 15:51
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

Win XP
MS Visual C# 2005 Express Edition
BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
2:
daten[0,1] daten[0,2] daten[0,3]
daten[1,1] daten[1,2] daten[1,3]

ausblenden C#-Quelltext
 
43:
/* ... */
daten[42,1] daten[42,2] daten[42,3]

ausblenden 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 user profile iconChristian S.: C#-Tags anders gesetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 27.04.07 17:20 
Okay, mal schauen. Ich schreib's aus dem Gedächtnis, kleine Fehler möge man mir verzeihen ;-)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
private int printCount = 0//Speichert, wieviel Zeilen insgesamt gedruckt wurden. Vor jedem neuen Druckvorgang auf 0 setzen
private Font printFont = ...; //Schriftart, in der gedruckt werden soll

public void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
  Single linesPerPage = 2.0/3.0*e.MarginBounds.Height / printFont.GetHeight(e.Graphics);
  int thisCount = 0//Zeile auf dieser Seite
  while (thisCount < linesPerPage && printCount < linesInArray)
  {
    Single yPos = e.MarginBounds.Top + 1.5*thisCount*printFont.getHeight(e.Graphics); //1.5 für Zeilenabstand
    Single xPos = e.MarginBounds.Left; //für nächste Spalte diesen Wert erhöhen
    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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

Win XP
MS Visual C# 2005 Express Edition
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 27.04.07 18:55 
user profile iconDaffke hat folgendes geschrieben:
Erst hat er alle möglichen Befehle nich' erkannt (Code blau unterstrichen).
Ich vermute mal einen fehlenden Namespace im using-Teil.

user profile iconDaffke 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

Win XP
MS Visual C# 2005 Express Edition
BeitragVerfasst: Fr 27.04.07 19:33 
Ich hab's nochmal so versucht:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
for (i=0;i<=200;i++)
{
   e.Graphics.DrawString(daten[i, 1], printFont, Brushes.Black, x, y);   // nur 1 Feld als Beispiel
   e.HasMorePages = (i==100);     // muss er hier nicht beim 100.Array eine neue Seite anfangen?
}


Da hat er den HasMorePages-Befehl einfach ignoriert, und bei ...

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
for (i=0;i<=200;i++)
{
   e.Graphics.DrawString(daten[i, 1], printFont, Brushes.Black, x, y);   // nur 1 Feld als Beispiel
   e.HasMorePages = (i>100);     // muss er hier ab dem 100.Array nicht eine neue Seite beginnen?
}


... da hat er die Dokumente wieder hochgezählt bis oo :-(

Es scheint mir aber, dass ich das Prinzip nicht verstanden habe ... :roll:

Gruß,
Daffke
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:

  1. 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.
  2. Im Event ermittle ich dann erst einmal, wieviel Zeilen auf eine Seite passen (linesPerPage).
  3. In thisCount wird gespeichert, wieviel Zeilen schon auf dieser Seite geschrieben wurden.
  4. 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).
  5. In der Schleife wird dann sowohl die Zahl der insgesamt gedruckten Zeilen als auch die Anzahl der auf der Seite gedruckten Zeilen erhöht.
  6. 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

Win XP
MS Visual C# 2005 Express Edition
BeitragVerfasst: Fr 27.04.07 20:17 
Also, ich hab' den Code nochmal ausprobiert.
Mittlerweile gibt der Compi nur noch 2 Fehlermeldungen aus:

ausblenden 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//Zeile auf dieser Seite  
            while (thisCount < linesPerPage && printCount < 200)  
            {  
              Single yPos = e.MarginBounds.Top + 1.5*thisCount*printFont.GetHeight(e.Graphics); 
              Single xPos = e.MarginBounds.Left; //für nächste Spalte diesen Wert erhöhen  
              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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

Win XP
MS Visual C# 2005 Express Edition
BeitragVerfasst: Fr 27.04.07 20:27 
Alles klar. Vielen Dank! :-)
Schönes Wochenende!

Gruß,
Daffke