Autor Beitrag
Christian K.
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 02.05.11 10:05 
Hi!

user profile iconChristian K. hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconChristian K. hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconChristian K. hat folgendes geschrieben Zum zitierten Posting springen:
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. Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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 :D


Testausdruck:
ausblenden volle Höhe 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:
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// Zeilen in meiner Tabelle

        private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
        {
            Font printFont = new Font("Courier New"12);
          
            // Überschrift
            e.Graphics.DrawString("Überschrift  (Seite " + Seite + ")", printFont, Brushes.Black, 5025);
            e.Graphics.DrawLine(new Pen(Color.Black, 2.2f), new Point(5050), new Point(81050));
            
            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 user profile iconChristian S.: Quote- durch C#-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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. Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 02.05.11 10:54 
Stimmt! Jetzt gehts :D nur habe ich absolut keine Idee warum? Ist das nicht total egal welchen Wert meine Variable hat?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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. Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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. Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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 :D
CityHunter
Hält's aus hier
Beiträge: 12

Win8
C# (VS 2010)
BeitragVerfasst: 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.

ausblenden 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)
        {
            // ein temporärer Pinsel
            System.Drawing.SolidBrush temPinsel = new System.Drawing.SolidBrush(System.Drawing.Color.White);
            // die Schriftart setzen
            System.Drawing.Font tempSchrift = new System.Drawing.Font("Arial"12, System.Drawing.FontStyle.Bold);
            // für die zentrierte Ausgabe
            System.Drawing.StringFormat ausrichtung = new System.Drawing.StringFormat();
            // Koordinaten für die Ausgabe
            float punkteX, nameX, y;
            punkteX = flaeche.Left + 50;
            nameX = flaeche.Left + 250;
            y = flaeche.Top + 50;
            // die Ausrichtung ist zentriert

            ausrichtung.Alignment = System.Drawing.StringAlignment.Center;
            // die Zeichenfläche löschen
            zeichenflaeche.Clear(System.Drawing.Color.Black);
            // den Titel ausgeben
            zeichenflaeche.DrawString("Bestenliste", tempSchrift, temPinsel, flaeche.Width / 2, y, ausrichtung);
            // und nun die Liste selbst
            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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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)
BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            
            //ein Pinsel für die Farbe
            SolidBrush pinsel = new SolidBrush(Color.Black);
            //für die Schriftart
            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.
ausblenden volle Höhe 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:
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
    {
        // die Felder
        int punkte;
        // die ANzahl der Einträge in der Liste
        int anzahl = 10;
        // Dateiname
        string dateiname;
        // für die Liste
        Liste[] bestenliste;
        // die Methoden
        // der Konstruktor
        public Score()
        {
            punkte = 0;
            // eine neue Instanz der Liste erstellen
            bestenliste = new Liste[anzahl];
            // die Elemente initialisieren
            for (int i = 0; i < anzahl; i++)
            {
                bestenliste[i] = new Liste();         
            }
            // den Dateinamen aus dem Pfad zusammenbauen
            dateiname = System.Windows.Forms.Application.StartupPath + "\\score.dat";
            // wenn es die Datei schon gibt, die Daten lesen
            if (System.IO.File.Exists(dateiname))
            {
                lesePunkte();
            }
        }

        // zum Lesen der Datei
        void lesePunkte()
        {
            // zum Zwischenspeichern der gelesenen Daten
            int tempPunkte;
            string tempName;
            // eine neue Instanz von FileStream erzeugen
            // die Datei soll geöffnet werden
            FileStream fStream = new FileStream(dateiname,FileMode.Open);
            // eine neue Instanz von BinaryReader auf der Basis
            // von fStream erzeugen
            BinaryReader binaerDatei = new BinaryReader(fStream);
            // die Einträge lesen und zuweisen
            for (int i = 0; i < anzahl; i++)
            {
                
                // die Punkte
                tempPunkte = binaerDatei.ReadInt32();
                // den Namen
                tempName = binaerDatei.ReadString();
                // und jetzt zuweisen
                bestenliste[i].SetzeEintrag(tempPunkte, tempName);
            }
            // BinaryReader schließen
            binaerDatei.Close();
            // und ach den Stream wieder
            fStream.Close();
        }

        // zum Schreiben in die Datei
        public void schreibePunkte()
        {
            // eine neue Instanz von FileStream erzeugen
            // die Datei soll entweder geöffnet oder neu erzeugt werden
            FileStream fStream = new FileStream(dateiname, FileMode.Create);
            // eine neue Instanz von BinaryWriter auf der Basis von fStream erzeugen
            BinaryWriter binaerDatei = new BinaryWriter(fStream);
            // die Daten in einer Schleife wegschreiben
            for (int i = 0; i < anzahl; i++)
            {
                // die Punkte
                binaerDatei.Write(bestenliste[i].GetPunkte());
                // und dann den Namen
                binaerDatei.Write(bestenliste[i].GetName());
            }
           // BinaryWriter schließen
            binaerDatei.Close();
            // und auch den Stream wieder
            fStream.Close();
        }
        // zum Verändern der Punkte
        public int VeraenderePunkte(int anzahl)
        {
            punkte = punkte + anzahl;
            return punkte;
        }

        // zum Zurücksetzen der Punkte
        public void LoeschePunkte()
        {
            punkte = 0;
        }

        public bool neuerEintrag()
        {
            string tempName = string.Empty;
            // wenn die aktuelle Punktezahl größer ist als der
            // letzte Eintrag der Liste, wird der letzte Eintrag
            // der Liste überschrieben und die Liste neu
            // sortiert

            if (punkte > bestenliste[anzahl - 1].GetPunkte())
            {
                // den Namen beschaffen
                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)
        {
            // ein temporärer Pinsel
            System.Drawing.SolidBrush temPinsel = new System.Drawing.SolidBrush(System.Drawing.Color.White);
            // die Schriftart setzen
            System.Drawing.Font tempSchrift = new System.Drawing.Font("Arial"12, System.Drawing.FontStyle.Bold);
            // für die zentrierte Ausgabe
            System.Drawing.StringFormat ausrichtung = new System.Drawing.StringFormat();
            // Koordinaten für die Ausgabe
            float punkteX, nameX, y;
            punkteX = flaeche.Left + 50;
            nameX = flaeche.Left + 250;
            y = flaeche.Top + 50;
            // die Ausrichtung ist zentriert

            ausrichtung.Alignment = System.Drawing.StringAlignment.Center;
            // die Zeichenfläche löschen
            zeichenflaeche.Clear(System.Drawing.Color.Black);
            // den Titel ausgeben
            zeichenflaeche.DrawString("Bestenliste", tempSchrift, temPinsel, flaeche.Width / 2, y, ausrichtung);
            // und nun die Liste selbst
            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];
        }
    }
    // die Klasse für die Liste
    // Sie muss von der Klasse IComparable erben
    class Liste : IComparable
    {
        // die Felder
        int listePunkte;
        string listeName;

        // die Methoden
        // der Konstruktor
        public Liste()
        {
            // er setzt die Punkte und den Namen auf
            // Standard-Werte
            listePunkte = 0;
            listeName = "Nobody";
        }

        // die Vergleichsmethode
        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;
            }
        }

        // die Methode zum Setzen von Einträgen
        public void SetzeEintrag(int punkte, string name)
        {
            listePunkte = punkte;
            listeName = name;
        }

        // die Methode zm Liefern der Punkte
        public int GetPunkte()
        {
            return listePunkte;
        }

        // die Methode zum Liefern des Namens
        public string GetName()
        {
            return listeName;
        }
    }
}
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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)
BeitragVerfasst: So 20.05.12 11:56 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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 ;).