Einzelnen Beitrag anzeigen

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