AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi [Drucken] Textlänge in Millimeter ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

[Drucken] Textlänge in Millimeter ermitteln

Ein Thema von s.h.a.r.k · begonnen am 26. Feb 2008 · letzter Beitrag vom 27. Feb 2008
 
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

Re: [Drucken] Textlänge in Millimeter ermitteln

  Alt 27. Feb 2008, 13:38
Habe irgendwie den Wald vor lauter Bäumen nicht gesehen... Danke!

Hier die (von mehreren Fehlern bereinigte) Lösung für jeden den sie interessieren sollte.

Delphi-Quellcode:
(*******************************************************************************
Class/Method : printString
Information  : Druckt einen Text mit beliebiger Länge aus und wandelt "//" in
                Zeilenumbrüche um.
*)

procedure TPrintLaufzettel.printString(ACanvas : TCanvas;
                                       x, y : Integer;
                                       MaxWidth : Integer;
                                       AStr : String;
                                       AFontHeight : Integer);
var
  d : Integer;
  t : String;
  c : String;
  lpx : Integer;
  len : Extended;
begin
  // MapMode setzen
  setMapMode(Printer.Canvas.Handle, MM_LOMETRIC);

  // Textausrichtung
  setTextAlign(Printer.Canvas.Handle, TA_LEFT + TA_TOP);

  // Auflösung des Druckers ermitteln
  lpx := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX);

  // evtl. y berichtigen, da auf dem Drucker gedruckt wird muss
  // y negativ sein
  if (y > 0) then
    y := y * (-1);

  with ACanvas do
  begin
    Font.Height := AFontHeight;

    d := 0;
    while (length(AStr) > 0) do
    begin
      t := '';
      c := '';
      len := 0;
      while (length(AStr) > 0) and (len < MaxWidth) do
      begin
        // nächstes Wort kopieren und in AStr ausschneiden
        t := t + c;
        delete(AStr, 1, length(c));
        if (pos(' ', AStr) = 0) and (length(AStr) > 0) then
          c := AStr
        else
          c := copy(AStr, 1, pos(' ', AStr));

        // Auf Zeilenumbruch prüfen
        if (pos('//', c) > 0) then
        begin
          // Prüfen, ob bisherige Zeile mit neuem Text nicht zu lang ist
          len := textWidth(trim(t + copy(c, 1, pos('//', c) - 1)));
          if (len > MaxWidth) then
            break;

          delete(c, length(c) - 2, length(c)); // alles hinter dem Backslash entfernen
          t := t + c; // t vervollständigen
          delete(AStr, 1, length(c) + 2); // AStr kürzen
          break; // Schleife verlassen, da Zeilenumbruch erfolgen soll
        end;

        // Länge des Textes in Millimeter ausgeben neu berechnen
        len := textWidth(trim(t + c));
      end;

      TextOut(x, y + d, trim(t)); // Text ausdrucken
      dec(d, AFontHeight + 6); // Abstand für nächste Zeile berechnen
    end;
  end;
end;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz