errox Geschrieben 9. April 2009 Geschrieben 9. April 2009 Hallo. In meinem Programm soll es möglich sein, einzelne Bons zu drucken, mit einem Bondrucker. Der Bondrucker ist als ganz Normaler drucker eingetragen, sprich ich kann auch mit Word drucken ( Auch wenn es Grafisch nicht sehr toll ist ) Er ist als Standartdrucker eingestellt. Ich hab mich Bereits erkundigt und das gefunden: MSDN PrintDocument Class Ich werde den Beispielcode noch nicht Anwenden, weil ich erstmal empfehlungen brauch. Erst dann fang ich an mich durchzukämpfen Die übertragung läuft über USB oder Serial ( Ich nehm USB, da USB meines Wissens schneller ist als Serial ). Serial oder Parallel, ich kenn den Port nicht so genau. Da es sich als teilstück eines Kassiersystems handelt und alles Rasend schnell sein soll, muss auch die Übertragung stimmen. Meine erste frage ( vorerst ): Gibt es eine Schnellere möglichkeit Dateien zu drucken? ( P.S. ich finde es doof, dass ich Dateien anlegen muss, und nicht direkt eine String Variable ausdrucken kann ) Liebe Grüße errox Zitieren
Klotzkopp Geschrieben 9. April 2009 Geschrieben 9. April 2009 Meine erste frage ( vorerst ): Gibt es eine Schnellere möglichkeit Dateien zu drucken? ( P.S. ich finde es doof, dass ich Dateien anlegen muss, und nicht direkt eine String Variable ausdrucken kann )Wie kommst du darauf, dass du Dateien anlegen musst? Für dein Programm ist es übrigens völlig egal, ob dein Drucker an einem COM-Port, an einem USB-Anschluss oder irgendwo im Netzwerk hängt. Es ist Aufgabe des Betriebssystems und des Druckertreibers, das für dich zu abstrahieren. Zitieren
errox Geschrieben 9. April 2009 Autor Geschrieben 9. April 2009 streamToPrint = gcnew StreamReader( "C:\\My Documents\\MyFile.txt" ); Darum meint ich das mit der Datei anzulegen. Für dein Programm ist es übrigens völlig egal, ob dein Drucker an einem COM-Port, an einem USB-Anschluss oder irgendwo im Netzwerk hängt. Es ist Aufgabe des Betriebssystems und des Druckertreibers, das für dich zu abstrahieren. Gut zu Wissen, danke. Zitieren
Klotzkopp Geschrieben 9. April 2009 Geschrieben 9. April 2009 streamToPrint = gcnew StreamReader( "C:\\My Documents\\MyFile.txt" ); [/CODE] Darum meint ich das mit der Datei anzulegen. Du hast aber schon gesehen, dass dieser StreamReader nur dazu dient, [i]Strings[/i] aus der Datei auszulesen und diese dann zu drucken? Also genau das, was du wolltest? Zitieren
errox Geschrieben 9. April 2009 Autor Geschrieben 9. April 2009 Jetzt schon, danke. Ich werde mich mal damit befassen und mich melden, wenn was nicht stimmt ( was so sein wird, ich aber nicht hoffe :S ) Liebe Grüße errox Zitieren
errox Geschrieben 9. April 2009 Autor Geschrieben 9. April 2009 Also ich bin schonmal ziemlich weit: String^ text = "Dies ist ein Test\nNeue Zeile!"; PrintDocument^ pd = gcnew PrintDocument; System::Drawing::Font^ printFront = gcnew System::Drawing::Font("Arial",5); // "text" ( Variable Drucken ) pd->Print(); Arial, größe 5 ist klar. Aber ich möchte es schlicht haben: Wie kann ich die Variable "text" drucken? Mit den Ganzen Klassen, zusätzlichen Funktionen ist es wirklich schwer :S Zitieren
Klotzkopp Geschrieben 10. April 2009 Geschrieben 10. April 2009 Es steht doch alles im Beispiel: Du musst einen PrintPageEventHandler anlegen, und dort kannst du dann mit dem Graphics-Objekt im PrintPageEventArgs-Parameter tun was du willst, beispielsweise mit DrawString einen String "malen". Zitieren
errox Geschrieben 10. April 2009 Autor Geschrieben 10. April 2009 Ich hab mir mal Graphics.DrawString Method angeguckt. Bin ich so auf dem Richtigen weg? public: void DrawStringPointF( PaintEventArgs^ e ) { // Create string to draw. String^ drawString = "Dies ist ein Test\nNeue Zeile!"; // Create font and brush. System::Drawing::Font^ drawFont = gcnew System::Drawing::Font( "Arial",5 ); SolidBrush^ drawBrush = gcnew SolidBrush( Color::Black ); // Create point for upper-left corner of drawing. PointF drawPoint = PointF(150.0F,150.0F); // Draw string to screen. e->Graphics->DrawString( drawString, drawFont, drawBrush, drawPoint ); } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { PrintDocument^ pd = gcnew PrintDocument; pd->PrintPage += gcnew PrintPageEventHandler(this, DrawStringPointF()); pd->Print(); } }; } Zitieren
Klotzkopp Geschrieben 10. April 2009 Geschrieben 10. April 2009 Bin ich so auf dem Richtigen weg?Das sollte dir doch der Compiler beantworten. Ich glaube nicht, dass sich das übersetzen lässt. Erstens passt die Signatur des Eventhandlers nicht. Warum PaintEventArgs? Mit einem PaintEventArgs-Objekt kannst du weder die Seitenmaße ermitteln noch festlegen, ob noch eine Seite folgt. Zweitens muss der zweite Parameter beim Erzeugen des PrintPageEventHandler-Objekts ein Methodenzeiger sein. DrawStringPointF() ist kein Methodenzeiger, sondern ein Aufruf. Zitieren
errox Geschrieben 10. April 2009 Autor Geschrieben 10. April 2009 Ich hätte nie im leben gedacht dass es so Kompliziert ist, einen kleinen Text auszudrucken. Gibt es vielleicht einen Methodenzeiger, der einfacher zu Bedienen ist? Zitieren
Klotzkopp Geschrieben 10. April 2009 Geschrieben 10. April 2009 Ich hätte nie im leben gedacht dass es so Kompliziert ist, einen kleinen Text auszudrucken.Es ist überhaupt nicht kompliziert. Du machst es selbst kompliziert, indem du den Beispielcode willkürlich änderst. Ich glaube, du solltest dir diesen und die darauf folgendenden Artikel einmal aufmerksam durchlesen. Gibt es vielleicht einen Methodenzeiger, der einfacher zu Bedienen ist?Was gibt's denn da zu bedienen? Im Beispiel steht pd->PrintPage += gcnew PrintPageEventHandler( this, &PrintingExample::pd_PrintPage ); [/code] [b]&PrintingExample::pd_PrintPage[/b] ist der Methodenzeiger. Klassische C++-Syntax. Zitieren
errox Geschrieben 10. April 2009 Autor Geschrieben 10. April 2009 Also so? private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { PrintDocument^ pd = gcnew PrintDocument; pd->PrintPage += gcnew PrintPageEventHandler( this, &PrintingExample::pd_PrintPage ); pd->Print(); } Und wie kann ich nun den Methodenzeiger deklarieren? Zitieren
Klotzkopp Geschrieben 10. April 2009 Geschrieben 10. April 2009 Also so?Heißt deine Klasse PrintingExample? Und wie kann ich nun den Methodenzeiger deklarieren?Was meinst du mit "Methodenzeiger deklarieren"? Hast du dir die Grundlagen zu Events und Delegates durchgelesen? Beim Erzeugen eines Eventhandler-Objekts übergibst du einen Zeiger auf die Methode, die aufgerufen werden soll, wenn das Event eintritt. Oder meinst du, wie du diese Eventhandlermethode deklarierst? Es ist nicht hilfreich, wenn du hier die Begriffe durcheinanderwirfst. Wie das geht, steht auch im Beispielcode: // The PrintPage event is raised for each page to be printed. private void pd_PrintPage(object sender, PrintPageEventArgs ev) { ... [/code]Das ist die Methode, die das PrintPage-Event bearbeiten soll. Und das ist die Methode, deren Adresse weiter oben an das EventHandler-Objekt übergeben wurde, welches wiederum mit += an das PrintPage-Event des PrintDocument-Objekts gekoppelt wurde. Den Namen der Methode kannst du dir aussuchen, die muss nicht pd_PrintPage heißen. Zitieren
errox Geschrieben 10. April 2009 Autor Geschrieben 10. April 2009 Also solangsam komm ich in fahrt... ich weiss dass ich jetzt void pd_PrintPage aufrufen muss. Das ist der Druckvorgang. Aber bei dem pd_PrintPage wird Streamreader benutzt. Wie kann ich meinen "normalen" String benutzen? Ich habs mir so vorgestellt: private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { PrintDocument^ pd = gcnew PrintDocument; pd->PrintPage += gcnew PrintPageEventHandler( this, &Form1::DrawStringPointF ); pd->Print(); } Zitieren
Klotzkopp Geschrieben 10. April 2009 Geschrieben 10. April 2009 ich weiss dass ich jetzt void pd_PrintPage aufrufen muss. Das ist der Druckvorgang.Nein, aufrufen musst du es eben genau nicht. Den Druckvorgang startest du mit dem Aufruf von Print. Damit wird ein PrintPageEvent erzeugt. Und dadurch wird dein Eventhandler aufgerufen. Eventuell mehrfach, je nachdem, was du im Eventhandler tust. Aber bei dem pd_PrintPage wird Streamreader benutzt. Wie kann ich meinen "normalen" String benutzen? Der StreamReader hat absolut nichts mit dem Drucken zu tun. Im Beispielcode wird ein Objekt namens line gedruckt, und das ist ein String. Der String wird nur aus dem StreamReader befüllt. Das hatten wir doch schon! Zitieren
errox Geschrieben 10. April 2009 Autor Geschrieben 10. April 2009 Vielen vielen vielen vielen lieben Dank!!! Ich habs!!!! void pd_PrintPage( Object^ /*sender*/, PrintPageEventArgs^ ev ) { System::Drawing::Font^ printFont = gcnew System::Drawing::Font( "Arial",10 ); ev->Graphics->DrawString("hallo\nDies ist ein test!!!",printFont,Brushes::Black,0,0); } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { PrintDocument^ pd = gcnew PrintDocument; pd->PrintPage += gcnew PrintPageEventHandler( this, &Form1::pd_PrintPage ); pd->Print(); } Ein "wunsch" hab ich noch. Ganz oben sollte eine Grafik zu sehen sein ( 64 * 64 pix ) Dateiformat von jpg, über psd bis zu bmp. Wie es am besten zu verarbeiten ist. Wie kann ich das hinzufügen? Zitieren
Klotzkopp Geschrieben 10. April 2009 Geschrieben 10. April 2009 Graphics.DrawImage Method (System.Drawing) Zitieren
errox Geschrieben 10. April 2009 Autor Geschrieben 10. April 2009 Super, danke. Es ist wirklich einfacher, als ich mir gedacht hab Du hast echt starke nerven. Vielen lieben dank!! Liebe Grüße errox Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.