<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Warum funktioniert Drucken nur ein mal?]]></title><description><![CDATA[<p>Habe da einen Fehler den ich nicht finde. Wenn ich meinen Drucken Button betätige, Wird mein Frame ausgedruckt. Wenn ich den Button nochmals betätige, hängt er sich in der if Anweisung auf und bringt eine Speicherverletztung. Aber warum?</p>
<pre><code>if(pPrintDialog-&gt;Execute())
</code></pre>
<pre><code class="language-cpp">void __fastcall TFormGrundbild::SBDruckenClick(TObject *Sender)
{
 // Druckdialog dynamisch erzeugen
 TPrintDialog *pPrintDialog1 = new TPrintDialog(this);

 // Druckdialog Optionen löschen
 pPrintDialog1-&gt;Options.Clear();

 // Auf Seite 1 stellen
 pPrintDialog1-&gt;FromPage = 1;

 // Mindestseiten auf eine stellen
 pPrintDialog1-&gt;MinPage = 1;

 // Angabe der Bis Seitenzahl aktivieren
 pPrintDialog1-&gt;ToPage = 1;

 // Drucken bis Maximal Ende Seiten
 pPrintDialog1-&gt;MaxPage = 1;

 // Printdialog ausgeführt
 if(pPrintDialog1-&gt;Execute())   //&lt;&lt;------------------hier hängt er sich beim zweiten mal Drucken auf
    {
     // Drucker dynamisch erzeugen
     TPrinter *pPrinter = Printer();

     // Seite festlegen
     TRect r = Rect(0, 0, pPrinter-&gt;PageWidth,
                              pPrinter-&gt;PageHeight);

     // Druckbereich festlegen
     TRect rSeite = Rect(200, 200, pPrinter-&gt;PageWidth - 200,
                                   pPrinter-&gt;PageHeight- 200);

     // Bitmap erzeugen
     Graphics::TBitmap *Printbmp=new Graphics::TBitmap;

     // Breite Frame an Bitmap übergeben
     Printbmp-&gt;Width = FormGrundbild-&gt;AktuellFrame-&gt;Width;

     // Höhe Frame an Bitmap übergeben
     Printbmp-&gt;Height = FormGrundbild-&gt;AktuellFrame-&gt;Height;

     // Drucktitel
     pPrinter-&gt;Title = &quot;Frame&quot;;

     // Drucker auf Querformat einstellen
     pPrinter-&gt;Orientation = poLandscape;

     // Druckauftrag beginnen
     pPrinter-&gt;BeginDoc();

     // Frame in Bitmap zeichnen
     FormGrundbild-&gt;AktuellFrame-&gt;PaintTo(Printbmp-&gt;Canvas,10,10);

     // Drucker Rechteck vorgeben
     pPrinter-&gt;Canvas-&gt;Rectangle(r);

     // gestrecktes Bild in Printer übergeben
     pPrinter-&gt;Canvas-&gt;StretchDraw(rSeite,Printbmp);

     // Handle setzen
     pPrinter-&gt;Canvas-&gt;Handle;

     // Dokument beenden
     pPrinter-&gt;EndDoc();

     // Bitmap löschen
     delete Printbmp;

     // Drucker löschen
     delete pPrinter;
    }

 // Wenn PrintDialog besteht
 if(pPrintDialog1)
        {
         // Printdialog löschen
         delete pPrintDialog1;

         // PrintDialog auf Null setzen
         pPrintDialog1 = NULL;
        }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/209732/warum-funktioniert-drucken-nur-ein-mal</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 14:40:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/209732.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Apr 2008 17:43:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum funktioniert Drucken nur ein mal? on Wed, 02 Apr 2008 17:43:11 GMT]]></title><description><![CDATA[<p>Habe da einen Fehler den ich nicht finde. Wenn ich meinen Drucken Button betätige, Wird mein Frame ausgedruckt. Wenn ich den Button nochmals betätige, hängt er sich in der if Anweisung auf und bringt eine Speicherverletztung. Aber warum?</p>
<pre><code>if(pPrintDialog-&gt;Execute())
</code></pre>
<pre><code class="language-cpp">void __fastcall TFormGrundbild::SBDruckenClick(TObject *Sender)
{
 // Druckdialog dynamisch erzeugen
 TPrintDialog *pPrintDialog1 = new TPrintDialog(this);

 // Druckdialog Optionen löschen
 pPrintDialog1-&gt;Options.Clear();

 // Auf Seite 1 stellen
 pPrintDialog1-&gt;FromPage = 1;

 // Mindestseiten auf eine stellen
 pPrintDialog1-&gt;MinPage = 1;

 // Angabe der Bis Seitenzahl aktivieren
 pPrintDialog1-&gt;ToPage = 1;

 // Drucken bis Maximal Ende Seiten
 pPrintDialog1-&gt;MaxPage = 1;

 // Printdialog ausgeführt
 if(pPrintDialog1-&gt;Execute())   //&lt;&lt;------------------hier hängt er sich beim zweiten mal Drucken auf
    {
     // Drucker dynamisch erzeugen
     TPrinter *pPrinter = Printer();

     // Seite festlegen
     TRect r = Rect(0, 0, pPrinter-&gt;PageWidth,
                              pPrinter-&gt;PageHeight);

     // Druckbereich festlegen
     TRect rSeite = Rect(200, 200, pPrinter-&gt;PageWidth - 200,
                                   pPrinter-&gt;PageHeight- 200);

     // Bitmap erzeugen
     Graphics::TBitmap *Printbmp=new Graphics::TBitmap;

     // Breite Frame an Bitmap übergeben
     Printbmp-&gt;Width = FormGrundbild-&gt;AktuellFrame-&gt;Width;

     // Höhe Frame an Bitmap übergeben
     Printbmp-&gt;Height = FormGrundbild-&gt;AktuellFrame-&gt;Height;

     // Drucktitel
     pPrinter-&gt;Title = &quot;Frame&quot;;

     // Drucker auf Querformat einstellen
     pPrinter-&gt;Orientation = poLandscape;

     // Druckauftrag beginnen
     pPrinter-&gt;BeginDoc();

     // Frame in Bitmap zeichnen
     FormGrundbild-&gt;AktuellFrame-&gt;PaintTo(Printbmp-&gt;Canvas,10,10);

     // Drucker Rechteck vorgeben
     pPrinter-&gt;Canvas-&gt;Rectangle(r);

     // gestrecktes Bild in Printer übergeben
     pPrinter-&gt;Canvas-&gt;StretchDraw(rSeite,Printbmp);

     // Handle setzen
     pPrinter-&gt;Canvas-&gt;Handle;

     // Dokument beenden
     pPrinter-&gt;EndDoc();

     // Bitmap löschen
     delete Printbmp;

     // Drucker löschen
     delete pPrinter;
    }

 // Wenn PrintDialog besteht
 if(pPrintDialog1)
        {
         // Printdialog löschen
         delete pPrintDialog1;

         // PrintDialog auf Null setzen
         pPrintDialog1 = NULL;
        }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1485408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485408</guid><dc:creator><![CDATA[egcactus]]></dc:creator><pubDate>Wed, 02 Apr 2008 17:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert Drucken nur ein mal? on Wed, 02 Apr 2008 17:54:58 GMT]]></title><description><![CDATA[<p>Du solltest auch nur das löschen, was dir gehört.</p>
<p>Und den Drucker zu löschen, ist ganz böse...</p>
<p>P.S. die letzten Zeilen sind überflüssig, es reicht ein einfaches</p>
<pre><code class="language-cpp">delete pPrintDialog1;
</code></pre>
<p>Ich nehme mal an, du fragst demnächst auch mal die Werte aus dem Dialog ab, denn so wäre er ja überflüssig...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485417</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Wed, 02 Apr 2008 17:54:58 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert Drucken nur ein mal? on Wed, 02 Apr 2008 19:20:49 GMT]]></title><description><![CDATA[<p>Jetzt wo du mir das sagst ist das auch einleuchtend, erzeuge ja keinen neuen Drucker, sondern benutze die im System vorhandenen.</p>
<p>Zur Abfrage des PrintDialogs.<br />
Ich stelle den PrintDialog auf eine Seite ein. Der Benutzer soll da keine weitere Auswahl haben, außer vielleicht einen anderen Drucker und das Papierfach zu wählen. Alles andere sperre ich.</p>
<p>Das passt dann schon.</p>
<p>Danke<br />
egcactus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485493</guid><dc:creator><![CDATA[egcactus]]></dc:creator><pubDate>Wed, 02 Apr 2008 19:20:49 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert Drucken nur ein mal? on Wed, 02 Apr 2008 19:29:59 GMT]]></title><description><![CDATA[<p>Wobei du das hier</p>
<pre><code class="language-cpp">// Wenn PrintDialog besteht
 if(pPrintDialog1)
 {
  // Printdialog löschen
  delete pPrintDialog1;

  // PrintDialog auf Null setzen
  pPrintDialog1 = NULL;
}
</code></pre>
<p>auch ohne einen Fehler zu machen durch das hier ersetzen kannst</p>
<pre><code class="language-cpp">delete pPrintDialog1;
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Noch besser wäre es, wenn du dafür einen Smartpointer (hier geht auto_ptr) nimmst. Dann brauchst du gr kein delete.<br />
Also das hier</p>
<pre><code class="language-cpp">TPrintDialog *pPrintDialog1 = new TPrintDialog(this);
</code></pre>
<p>durch das hier ersetzen</p>
<pre><code class="language-cpp">std::auto_ptr&lt;TPrintDialog&gt; pPrintDialog1(new TPrintDialog(0));
</code></pre>
<p>und schon ist kein delete mehr nötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485499</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 02 Apr 2008 19:29:59 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert Drucken nur ein mal? on Wed, 02 Apr 2008 19:40:00 GMT]]></title><description><![CDATA[<p>Ok, das funktioniert und nun habe ich eine neue Aufgabe. Erst mal nachlesen, was Autopointer sind und wie und für was man die benutzen kann.</p>
<p>Danke für die Hilfe.<br />
Grüße<br />
egcactus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485506</guid><dc:creator><![CDATA[egcactus]]></dc:creator><pubDate>Wed, 02 Apr 2008 19:40:00 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert Drucken nur ein mal? on Thu, 03 Apr 2008 09:24:46 GMT]]></title><description><![CDATA[<p>Dann mal was zum Lesen.<br />
Hier ein Artikel aus dem Magazin über die boost-Smartpointer. auto_ptr wird da kurz erwähnt.<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-134971.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-134971.html</a><br />
über auto_ptr<br />
<a href="http://www.hlrs.de/people/mueller/tutorials/script/scriptse36.html" rel="nofollow">http://www.hlrs.de/people/mueller/tutorials/script/scriptse36.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485673</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 03 Apr 2008 09:24:46 GMT</pubDate></item></channel></rss>