<?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[Blocksatz mit Printer()-&amp;gt;Canvas]]></title><description><![CDATA[<p>Ich möchte Textausgaben auf einem Drucker mit Printer()-&gt;Canvas-&gt;TextOut() im Blocksatz ausgeben. Kennt jemand eine Möglichkeit, um eine solche Ausgabe zu erzeugen? Vielleicht gibt es eine Komponente auf dem Markt?</p>
<p>Vielen Dank für eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/77621/blocksatz-mit-printer-gt-canvas</link><generator>RSS for Node</generator><lastBuildDate>Mon, 29 Jun 2026 09:25:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/77621.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Jun 2004 19:56:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Blocksatz mit Printer()-&amp;gt;Canvas on Tue, 22 Jun 2004 19:56:05 GMT]]></title><description><![CDATA[<p>Ich möchte Textausgaben auf einem Drucker mit Printer()-&gt;Canvas-&gt;TextOut() im Blocksatz ausgeben. Kennt jemand eine Möglichkeit, um eine solche Ausgabe zu erzeugen? Vielleicht gibt es eine Komponente auf dem Markt?</p>
<p>Vielen Dank für eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/546040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/546040</guid><dc:creator><![CDATA[NoMi]]></dc:creator><pubDate>Tue, 22 Jun 2004 19:56:05 GMT</pubDate></item><item><title><![CDATA[Reply to Blocksatz mit Printer()-&amp;gt;Canvas on Wed, 23 Jun 2004 06:12:26 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich würde das so angehen:<br />
Ersteinmal die Breite für den Blocksatz festlegen.<br />
Ne Schriftart auswählen.</p>
<p>Dann mittels Printer()-&gt;Canvas-&gt;TextWidth(&quot;blahblah&quot;) sehen, wie breit der String ist - und ggf. mit Leerzeichen auffüllen (bevorzugt dort, wo schon Leerzeichen sind) - und wenn die Breite annähernd passt, druckst dus aufs Papier.</p>
<p>Und das machst du dann für alle Strings, die du hast.</p>
<p>...oder du nimmst ne Report-Komponente, die das alles schon kann...</p>
<p>tschüss<br />
Robert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/546188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/546188</guid><dc:creator><![CDATA[rowisoft]]></dc:creator><pubDate>Wed, 23 Jun 2004 06:12:26 GMT</pubDate></item><item><title><![CDATA[Reply to Blocksatz mit Printer()-&amp;gt;Canvas on Thu, 24 Jun 2004 12:53:33 GMT]]></title><description><![CDATA[<p>Hier ein Ansatz einmal unter Verwendung der WinAPI-Funktion <em>SetTextJustification()</em> und einmal ganz ohne API, also ggf. auch unter Linux/Kylix verwendbar.<br />
'Blocksatz' wird im Englischen übrigens einfach als <em>justified</em> oder <em>fully justified</em> bezeichnet.</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
void __fastcall TForm1::JustifiedTextOut(TCanvas *canv, TRect rect, String text)
{
  String line = &quot;&quot;;
  int line_nr = 0; // Zeilennummer (der Ausgabe)
  int line_spacing = 2; // Zeilenabstand in Pixeln
  int space_count = 0; // Leerzeichen mitzählen für SetTextJustification

  // Liste der einzelnen Wörter erstellen, ein einfaches Array würde es
  // auch tun, aber TStringList ist ja so bequem :-)
  TStringList *list = new TStringList();
  list-&gt;Delimiter = ' ';
  list-&gt;DelimitedText = text;

  int X = rect.Left;
  int Y = rect.Top;

  int indx = 0; // Index in der Wortliste
  while (indx &lt; list-&gt;Count)
  {
    // Zeile mit Worten füllen, bis Breite der Zeichenfläche erreicht
    while (canv-&gt;TextWidth(line) &lt;= rect.Width())
    {
      if (indx &lt; list-&gt;Count)
      {
        line += list-&gt;Strings[indx++] + &quot; &quot;;
        space_count++;
      }
      else
      {
        space_count = 0;
        break;
      }
    }

    // wenn Breite überschritten, letztes Leerzeichen und ggf. letztes Wort löschen
    while (canv-&gt;TextWidth(line) &gt; rect.Width())
    {
      // Leerzeichen am Ende löschen
      int pos = line.LastDelimiter(&quot; &quot;);
      line.Delete(pos, 1);
      space_count--; // ist durch das Löschen natürlich eins weniger

      // mit etwas Glück passt es jetzt ...
      if (canv-&gt;TextWidth(line) &lt;= rect.Width())
        break;
      else // ... ansonsten muss halt auch das letzte Wort der Zeile dran
      {    // glauben, einschliesslich des davor stehenden Leerzeichens
        pos = line.LastDelimiter(&quot; &quot;);
        line.Delete(pos, line.Length() - pos + 1);
        indx--; // das gelöschte Wort soll ja in die nächste Zeile
        space_count--; // ist noch eins weniger
      }
    }

    // ermitteln des normalerweise frei bleibenden Raumes am Ende der Zeile
    int extraspace = rect.Width() - canv-&gt;TextWidth(line);

#ifdef __linux__
//Linux- bzw. non-API-Variante

    // Zeile in einzelne Worte zerlegen
    TStringList *tmplist = new TStringList();
    tmplist-&gt;Delimiter = ' ';
    tmplist-&gt;DelimitedText = line;

    // freien Platz gleichmässig auf die Zwischenräume (Leerzeichen) aufteilen
    int space_width = canv-&gt;TextWidth(&quot; &quot;);

    if (space_count &gt; 1)
      space_width += (extraspace / space_count);

    // erstes Wort am Zeilenanfang ausgeben ...
    canv-&gt;TextOut(X, Y, tmplist-&gt;Strings[0]);

    // dann die restlichen Worte ...
    for (int i = 1; i &lt; tmplist-&gt;Count; i++)
    {
      // ... jeweils versetzt um die Breite des  vorigen Wortes plus
      // der Breite des (ggf. erweiterten) Leerzeichens
      X = X + canv-&gt;TextWidth(tmplist-&gt;Strings[i-1]) + space_width;

      // bei unrunden oder kurzen freien Zeilenenden zumindest die ersten Zwischen-
      // räume um jeweils 1 verbreitern, soweit die Pixelzahl des Endes reicht
      if (space_count &gt; 1 &amp;&amp; i &lt; extraspace % space_count)
        X++;

      // an neu ermittelter Position ausgeben
      canv-&gt;TextOut(X, Y, tmplist-&gt;Strings[i]);
    }
    delete tmplist;
    X = rect.Left;

#else
// WinAPI-Version

    SetTextJustification(canv-&gt;Handle, extraspace, space_count);
    canv-&gt;TextOut(X, Y, line);
    SetTextJustification(canv-&gt;Handle, 0, 0);
#endif

    // für nächste Zeile vorbereiten
    line_nr++;
    Y = rect.Top + (line_nr * canv-&gt;TextHeight(line)) + line_spacing;
    space_count = 0;
    line = &quot;&quot;;
  }

  delete list;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  // freizulassende Ränder definieren
  TRect rect(10, 10, Image1-&gt;Canvas-&gt;ClipRect.Right - 20, Image1-&gt;Canvas-&gt;ClipRect.Bottom - 20);

  JustifiedTextOut(Image1-&gt;Canvas, rect, text_to_draw);
}
//---------------------------------------------------------------------------
</code></pre>
<p>Wie gesagt, das ist nur ein Ansatz, da fehlt z.B. das Prüfen auf echte Zeilenumbrüche, Leerzeilen usw.<br />
Na und etwas eleganter kann man das Ganze sicher auch noch gestalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/546445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/546445</guid><dc:creator><![CDATA[Jansen]]></dc:creator><pubDate>Thu, 24 Jun 2004 12:53:33 GMT</pubDate></item><item><title><![CDATA[Reply to Blocksatz mit Printer()-&amp;gt;Canvas on Thu, 24 Jun 2004 12:54:38 GMT]]></title><description><![CDATA[<p>Code aktualisiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/547161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/547161</guid><dc:creator><![CDATA[Jansen]]></dc:creator><pubDate>Thu, 24 Jun 2004 12:54:38 GMT</pubDate></item></channel></rss>