Text links-/rechtsbündig, zentriert u. als Blocksatz drucken

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
BI2
Beiträge: 146
Registriert: 26.11.2006 19:07

Text links-/rechtsbündig, zentriert u. als Blocksatz drucken

Beitrag von BI2 »

Hallo alle zusammen,

habe mich die Woche mal wieder über fehlende Druckbefehle aufgeregt (Wie druckt man mit den PB Befehlen rechtsbündig, zentriert oder Blocksatz? - Überhaupt nicht!)
Also selbst ist der Mann :D

Unten findet ihr eine Prozedur, die all das oben erwähnte beherrscht - sogar Absatzweise mit automatischem Zeilenumbruch. Weiterhin wurden keine API Befehle verwendet, was die Sache Plattformunabhängig machen sollte (habe ich aber nicht getestet)

Vielleicht kann es der ein oder andere ja auch gebrauchen - evtl. hat ja vielleicht jemand noch eine Idee, wie man die Lücken zwischen den Wörtern bei der Verwendung von #PB_Font_Underline loswird.

Gruß, BI2

Edit: Das Beispiel erstellt folgende Seite

Bild

Code: Alles auswählen

;/ PrintTextAlign by Andreas Schweitzer
;/ PureBasic 4.20

Procedure.l Xmm(x.f)

  ProcedureReturn x * PrinterPageWidth() / 210 ;Breite DIN-A4 = 210 mm

EndProcedure
;==================================================================================================
Procedure.l Ymm(y.f)

  ProcedureReturn y * PrinterPageHeight() / 297 ;Höhe DIN-A4 = 297 mm

EndProcedure
;==================================================================================================
Procedure.l PrintTextAlign(x.l , y.l, Breite.l, Direction.l, Text$, Color.l = $000000, Absatz = #False)

  Enumeration
    #ALIGN_LEFT    ;Linksbündig
    #ALIGN_RIGHT   ;Rechtsbündig
    #ALIGN_CENTER  ;Zentriert
    #ALIGN_JUSTIFY ;Blocksatz
  EndEnumeration

  Protected Anzahl.l
  Protected Zeilen.l
  Protected Position.l
  Protected Rest.l
  Protected i.l, j.l, k.l
  Protected SpaceWidthTemp.l = TextWidth(" ")
  Protected SpaceWidth.l = SpaceWidthTemp

  Text$ = Trim(Text$)

  For i = 0 To 5 ;entfernt bis zu 64 aufeinanderfolgende Leerzeichen (bei Bedarf anpassen)
    Text$ = ReplaceString(Text$, "  ", " ")
  Next

  Anzahl = CountString(Text$, " ") + 1

  Protected Dim Woerter.s(Anzahl)

  For i = 0 To Anzahl - 1
    Woerter(i) = StringField(Text$, i + 1, " ")
  Next

  If Not Breite
    Breite = PrinterPageWidth() - 2 * x
  EndIf

  For i = 0 To Anzahl

    If (TextWidth(Woerter(i)) + Position) <= (Breite) And i < Anzahl
      Position + TextWidth(Woerter(i)) + SpaceWidthTemp
    Else

      Position - SpaceWidthTemp

      If i < Anzahl - 1
        i - 1
      Else
        Rest = #True
      EndIf

      Select Direction

        Case #ALIGN_LEFT
          Position = x

        Case #ALIGN_RIGHT
          Position = x + Breite - Position

        Case #ALIGN_CENTER
          Position =  x + (Breite - Position) / 2

        Case #ALIGN_JUSTIFY
          If Rest
            SpaceWidth = SpaceWidthTemp
          Else
            SpaceWidth = (Breite - (Position - (SpaceWidthTemp * (i - k)))) / (i - k)
          EndIf
          Position = x

      EndSelect

      For j = k To i
        Position = DrawText(Position, y, Woerter(j), Color) + SpaceWidth
      Next

      k = i + 1
      Position = 0
      y + TextHeight(Text$) ;+ evtl. Offset für Zeilenabstand, dann aber auch bei ProcedureReturn
      Zeilen + 1

    EndIf

  Next

  If Absatz
    Zeilen + 1
  EndIf

  ProcedureReturn TextHeight(Text$) * Zeilen ;+ evtl. Offset. Gibt Y-Wert für den nächsten Absatz zurück

EndProcedure
;==================================================================================================

Text$ = "Diesen Text kann man mit der Funktion PrintTextAlign ohne Probleme Linksbündig, "
Text$ + "Rechtsbündig, Zentriert oder als Blocksatz ausdrucken. Auf Wunsch läßt sich auch "
Text$ + "noch ein Absatz anhängen. Als Rückgabewert wird die Y-Startposition des nächsten "
Text$ + "Absatzes übergeben. Somit wird formatiertes ausdrucken von Text zum Kinderspiel ;-)"

If PrintRequester()

  If StartPrinting("PrintTextAlign Testseite")

    PrintFont0.l = LoadFont(0, "Arial", Ymm(10), #PB_Font_Bold)
    PrintFont1.l = LoadFont(1, "Arial", Ymm(3), #PB_Font_Bold)
    PrintFont2.l = LoadFont(2, "Arial", Ymm(3))

    Mitte = PrinterPageWidth() / 2

    If StartDrawing(PrinterOutput())

      DrawingFont(PrintFont0)

      Y_Start.l = Ymm(10)

      DrawingFont(PrintFont0)

      Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_CENTER, "PrintTextAlign Testseite", $000000, #True)

      DrawingFont(PrintFont1)

      Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_LEFT, Text$, $0000FF, #True)
      Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_RIGHT, Text$, $00FF00, #True)
      Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_CENTER, Text$, $FF0000, #True)
      Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_JUSTIFY, Text$, $000000, #True)

      Y_Temp = Y_Start

      DrawingFont(PrintFont2)

      Y_Start + PrintTextAlign(Xmm(10), Y_Start, Xmm(90), #ALIGN_LEFT, Text$, $0000FF)
      Y_Start + PrintTextAlign(Xmm(10), Y_Start, Xmm(90), #ALIGN_RIGHT, Text$, $00FF00)
      Y_Start + PrintTextAlign(Xmm(10), Y_Start, Xmm(90), #ALIGN_CENTER, Text$, $FF0000)
      Y_Start + PrintTextAlign(Xmm(10), Y_Start, Xmm(90), #ALIGN_JUSTIFY, Text$)

      LineXY(Mitte, Y_Temp, Mitte, Y_Start)

      Y_Start = Y_Temp

      DrawingFont(PrintFont2)

      Y_Start + PrintTextAlign(Xmm(110), Y_Start, Xmm(90), #ALIGN_JUSTIFY, Text$, $0000FF)
      Y_Start + PrintTextAlign(Xmm(110), Y_Start, Xmm(90), #ALIGN_CENTER, Text$, $00FF00)
      Y_Start + PrintTextAlign(Xmm(110), Y_Start, Xmm(90), #ALIGN_RIGHT, Text$, $FF0000)
      Y_Start + PrintTextAlign(Xmm(110), Y_Start, Xmm(90), #ALIGN_LEFT, Text$)

      StopDrawing()
    EndIf

    StopPrinting()
  EndIf
EndIf

End
Zuletzt geändert von BI2 am 28.06.2022 13:26, insgesamt 2-mal geändert.
Benutzeravatar
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Beitrag von Hyper »

Hallo BI2,

ich habe gerade ein paar Ideen gesucht, wie man drucken kann und das gefunden! Hilft mir außerordentlich. Und das schönste: Ich verstehe, wie Du es programmiert hast. Sehr klar und ohne Pointer, Apis etc. Toll! Und danke für das Teilen!
PB 5.72
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Nur kurz drübergeschaut...

...und das hier gefunden:

Code: Alles auswählen

  For i = 0 To 5 ;entfernt bis zu 64 aufeinanderfolgende Leerzeichen (bei Bedarf anpassen) 
    Text$ = ReplaceString(Text$, "  ", " ") 
  Next 
Willst du alle Merfach-Leerzeichen durch ein Leerzeichen ersetzen? Bitte sehr:

Code: Alles auswählen

While FindString(Text$, "  ", 1)
   Text$=ReplaceString(Text$, "  ", " ")
Wend
Ansonsten schaut das Ganze sehr nützlich aus. Gut gemacht. :)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
bommel
Beiträge: 32
Registriert: 31.07.2006 13:21

Beitrag von bommel »

Sehr nützlich. :allright:
Hatte sowas ansatzweise mal gebastelt und hatte beim Blocksatz keine Lust mehr. /:->
Nur die Reihenfolge der Parameter würde ich etwas ändern (Text$ vor das Direction). Dann kann man Direction defaultmäßig auf #ALIGN_LEFT setzen.
PB 4
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag von sibru »

@BI2
Vollständige Unterstreichung klappt mit folgendem Code...
Hintergrund: häufig wird ASCII 32 (=Blank, Leerzeichen)
unter Windows _nicht_ unterstrichen. Die meisten Font´s
haben jedoch unter ASCII 160 noch´n Blank, das immer
sauber unterstrichen wird. Also einfach ´ne Unterstrich-
Zeile mit 160ern aufbauen und im Transparent-Mode über
die bereits ausgedruckte Zeile legen... fetich

Code: Alles auswählen

;/ PrintTextAlign by Andreas Schweitzer
;/ PureBasic 4.20

Procedure.l Xmm(x.f)
   ProcedureReturn x * PrinterPageWidth() / 210 ;Breite DIN-A4 = 210 mm
  EndProcedure
;==================================================================================================
Procedure.l Ymm(y.f)
   ProcedureReturn y * PrinterPageHeight() / 297 ;Höhe DIN-A4 = 297 mm
  EndProcedure
;==================================================================================================
Procedure.l PrintTextAlign(x.l , y.l, Breite.l, Direction.l, Text$, Color.l = $000000, Absatz = #False)
  
  Enumeration
    #ALIGN_LEFT    ;Linksbündig
    #ALIGN_RIGHT   ;Rechtsbündig
    #ALIGN_CENTER  ;Zentriert
    #ALIGN_JUSTIFY ;Blocksatz
  EndEnumeration
  
  Protected Anzahl.l
  Protected Zeilen.l
  Protected Position.l
  Protected Rest.l
  Protected i.l, j.l, k.l
  Protected SpaceWidthTemp.l = TextWidth(" ")
  Protected SpaceWidth.l = SpaceWidthTemp
  
  Text$ = Trim(Text$)
  
  While FindString(Text$, "  ", 1) : Text$=ReplaceString(Text$, "  ", " ") : Wend ;trimAll
  
  Anzahl = CountString(Text$, " ") + 1
  
  Protected Dim Woerter.s(Anzahl)
  
  For i = 0 To Anzahl - 1
    Woerter(i) = StringField(Text$, i + 1, " ")
  Next
  
  If Not Breite
    Breite = PrinterPageWidth() - 2 * x
  EndIf
  
  For i = 0 To Anzahl
    
    If (TextWidth(Woerter(i)) + Position) <= (Breite) And i < Anzahl
      Position + TextWidth(Woerter(i)) + SpaceWidthTemp
    Else
      
      Position - SpaceWidthTemp
      
      If i < Anzahl - 1
        i - 1
      Else
        Rest = #True
      EndIf
      
      Select Direction
          
        Case #ALIGN_LEFT
          Position = x
          
        Case #ALIGN_RIGHT
          Position = x + Breite - Position
          
        Case #ALIGN_CENTER
          Position =  x + (Breite - Position) / 2
          
        Case #ALIGN_JUSTIFY
          If Rest
            SpaceWidth = SpaceWidthTemp
          Else
            SpaceWidth = (Breite - (Position - (SpaceWidthTemp * (i - k)))) / (i - k)
          EndIf
          Position = x
          
      EndSelect

;----- Begin wortweiser Textdruck mit Unterstich-Handling -----
      pos1=Breite : pos9=0                            ;reset min-/max-Collectoren
      For j = k To i
        pos1=Min(pos1,Position)                       ;1. benutzte DruckPos
        Position = DrawText(Position, y, Woerter(j), Color) ;Wort ausdrucken
        If j<i : Position+SpaceWidth : EndIf          ;nicht letztes Wort: FreiRaum einsetzen
        pos9=Max(pos9,Position)                       ;letzte benutzte DruckPos
      Next
      Spaces$="" : While TextWidth(Spaces$)<pos9-pos1 : Spaces$+Chr(160) : Wend ;Unterstrich-Zeile aufbauen
      DrawingMode(#PB_2DDrawing_Transparent)          ;bereits gedruckte Zeile erhalten !!!
      DrawText(pos1,y,Spaces$)                ;Unterstrich-Zeile ausgeben = gesammte Zeile unterstreichen
;----- Ende wortweiser Textdruck mit Unterstich-Handling -----
      
      k = i + 1
      Position = 0
      y + TextHeight(Text$) ;+ evtl. Offset für Zeilenabstand, dann aber auch bei ProcedureReturn
      Zeilen + 1
      
    EndIf
    
  Next
  
  If Absatz
    Zeilen + 1
  EndIf
  
  ProcedureReturn TextHeight(Text$) * Zeilen ;+ evtl. Offset. Gibt Y-Wert für den nächsten Absatz zurück
  
EndProcedure
;==================================================================================================

Text$ = "Diesen Text kann man mit der Funktion PrintTextAlign ohne Probleme Linksbündig, "
Text$ + "Rechtsbündig, Zentriert oder als Blocksatz ausdrucken. Auf Wunsch läßt sich auch "
Text$ + "noch ein Absatz anhängen. Als Rückgabewert wird die Y-Startposition des nächsten "
Text$ + "Absatzes übergeben. Somit wird formatiertes ausdrucken von Text zum Kinderspiel ;-)"

If PrintRequester()
  
  If StartPrinting("PrintTextAlign Testseite")
    
    PrintFont0.l = LoadFont(0, "Arial", Ymm(10), #PB_Font_Bold)
    PrintFont1.l = LoadFont(1, "Arial", Ymm(3), #PB_Font_Bold|#PB_Font_Underline)
    PrintFont2.l = LoadFont(2, "Arial", Ymm(3))
    
    Mitte = PrinterPageWidth() / 2
    
    If StartDrawing(PrinterOutput())
        
        DrawingFont(PrintFont0)
        
        Y_Start.l = Ymm(10)
        
        DrawingFont(PrintFont0)
        
        Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_CENTER, "PrintTextAlign Testseite", $000000, #True)
        
        DrawingFont(PrintFont1)
        
        Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_LEFT, Text$, $0000FF, #True)
        Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_RIGHT, Text$, $00FF00, #True)
        Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_CENTER, Text$, $FF0000, #True)
        Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_JUSTIFY, Text$, $000000, #True)
        
        Y_Temp = Y_Start
        
        DrawingFont(PrintFont2)
        
        Y_Start + PrintTextAlign(Xmm(10), Y_Start, Xmm(90), #ALIGN_LEFT, Text$, $0000FF)
        Y_Start + PrintTextAlign(Xmm(10), Y_Start, Xmm(90), #ALIGN_RIGHT, Text$, $00FF00)
        Y_Start + PrintTextAlign(Xmm(10), Y_Start, Xmm(90), #ALIGN_CENTER, Text$, $FF0000)
        Y_Start + PrintTextAlign(Xmm(10), Y_Start, Xmm(90), #ALIGN_JUSTIFY, Text$)
        
        LineXY(Mitte, Y_Temp, Mitte, Y_Start)
        
        Y_Start = Y_Temp
        
        DrawingFont(PrintFont2)
        
        Y_Start + PrintTextAlign(Xmm(110), Y_Start, Xmm(90), #ALIGN_JUSTIFY, Text$, $0000FF)
        Y_Start + PrintTextAlign(Xmm(110), Y_Start, Xmm(90), #ALIGN_CENTER, Text$, $00FF00)
        Y_Start + PrintTextAlign(Xmm(110), Y_Start, Xmm(90), #ALIGN_RIGHT, Text$, $FF0000)
        Y_Start + PrintTextAlign(Xmm(110), Y_Start, Xmm(90), #ALIGN_LEFT, Text$)
        
      StopDrawing()
    EndIf
    
    StopPrinting()
  EndIf
EndIf

End 
Ansonsten geht´s mir wie Bommel: schon ´ne eigene Druck-Funktion
erstellt, und beim Blocksatz wg. fehlender Dringlichkeit aufgehört...
Danke für´s Teilen...

----- Nachtrag -----
der Source enthält die Funktionen min() und max(): also entweder
"Math and Strings" includieren (jaPBe-Setup "Projekt-Einstellungen",
dort "Includes") oder folgende Include´s einbauen:

Code: Alles auswählen

 ;Modul      min Version 1.00 vom 27.04.2004
 ;
 ;Funktion:  liefert die kleinste von 2 Integer-Zahlenwerten
 ;
 ;Aufruf:    Minimum.l = min(Zahl1.l, Zahl2.l)
 ;
Procedure.l Min(w1.l,w2.l)
  If w1>w2
    ProcedureReturn w2
  Else
    ProcedureReturn w1
  EndIf
  EndProcedure


 ;Modul      max Version 1.00 vom 27.04.2004
 ;
 ;Funktion:  liefert die größte von 2 Zahlenwerten
 ;
 ;Aufruf:    Maximum.l = max(Zahl1.l, Zahl2.l)
 ;
Procedure.l Max(w1.l,w2.l)
  If w1>w2
    ProcedureReturn w1
  Else
    ProcedureReturn w2
  EndIf
  EndProcedure
Gruss SiBru
Bild Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

@ sibru:
ASCII 32 und 160 sind zwei verschiedene Leerzeichen!

32 ist ein ganzt normales, herkömmliches Leerzeichen. 160 ist ein sogenanntes "geschütztes Leerzeichen", in HTML auch bekannt als "&nbsp;" (
no break space).
Das bedeutet, dass Z. B. auf einer Webseite der Text nicht bei geschützten Leerzeichen umgebrochen werden darf.
Beispiel:

Code: Alles auswählen

Hallo Welt
Bei diesem normalen Leerzeichen würde der Text umgebrochen, wenn man den Browser verkleinert oder in einem Programm das Gadget nicht groß genug ist.
Hier sieht es anders aus:

Code: Alles auswählen

Hallo&nbsp;Welt
Dies wird wie ein einziges Wort behandelt und daher auch nicht umgebrochen, fall es nötig wäre. Das ist meines Erachtens auch der Grund, warum 160 mit unterstrichen wird und 32 nicht.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag von sibru »

@AND51
Danke für den Tip... hab´ ich schon oft bei der HTML-Erstellung vermisst :roll:
Hab´ bisher 160er nur für´s Unterstrich-sichere Drucken benutzt...
Müßte eigentlich auch sauber sein, wenn die generierte Grafik in ´nem HTML
benutzt wird, werd´s sicherheitshalber mal austesten...
Die Benutzung von 160er beim Drucken ist jedoch bedeutent einfacher und
schneller, als den aktuellen Font zu erforschen (Unterstrich-Dicke, -Position
und -Breite)...

Gruss Siggi
Bild Bild
Benutzeravatar
BI2
Beiträge: 146
Registriert: 26.11.2006 19:07

Beitrag von BI2 »

Hallo @All,

hatte in letzter Zeit so viel um die Ohren, das ich die Antworten erst heute gesehen habe.

Vielen Dank für die Anregungen - habe sie aufgenommen und ein klein wenig verändert.

Hier nun die aktuelle Version mit gelöstem Unterstreich Problem.

Gruß, BI2

Code: Alles auswählen

;/ PrintTextAlign by Andreas Schweitzer
;/ PureBasic 4.20

Procedure.l Xmm(x.f)

  ProcedureReturn x * PrinterPageWidth() / 210 ;Breite DIN-A4 = 210 mm

EndProcedure
;==================================================================================================
Procedure.l Ymm(y.f)

  ProcedureReturn y * PrinterPageHeight() / 297 ;Höhe DIN-A4 = 297 mm

EndProcedure
;==================================================================================================
Procedure.l PrintTextAlign(x.l , y.l, Text$, Breite.l = #False, Richtung.l = 0, Absatz = #False, Color.l = $000000)

  Enumeration
    #ALIGN_LEFT    ;Linksbündig
    #ALIGN_RIGHT   ;Rechtsbündig
    #ALIGN_CENTER  ;Zentriert
    #ALIGN_JUSTIFY ;Blocksatz
  EndEnumeration

  Protected Anzahl.l
  Protected Zeilen.l
  Protected Position.l
  Protected KeinRest.l
  Protected i.l, j.l, k.l
  Protected SpaceWidthTemp.l = TextWidth(" ")
  Protected SpaceWidth.l = SpaceWidthTemp
  Protected Spaces$

  Text$ = Trim(Text$)

  While FindString(Text$, "  ", 1) ;entfernt alle aufeinanderfolgenden Leerzeichen
    Text$ = ReplaceString(Text$, "  ", " ")
  Wend

  Anzahl = CountString(Text$, " ") + 1

  Protected Dim Woerter.s(Anzahl)

  For i = 0 To Anzahl - 1
    Woerter(i) = StringField(Text$, i + 1, " ")
  Next

  If Not Breite
    Breite = PrinterPageWidth() - 2 * x
  EndIf

  For i = 0 To Anzahl

    If (TextWidth(Woerter(i)) + Position) <= (Breite) And i < Anzahl
      Position + TextWidth(Woerter(i)) + SpaceWidthTemp
    Else

      Position - SpaceWidthTemp

      If i < Anzahl - 1
        i - 1
      Else
        KeinRest = #True
      EndIf

      Select Richtung

        Case #ALIGN_LEFT
          Position = x

        Case #ALIGN_RIGHT
          Position = x + Breite - Position

        Case #ALIGN_CENTER
          Position =  x + (Breite - Position) / 2

        Case #ALIGN_JUSTIFY
          If KeinRest
            SpaceWidth = SpaceWidthTemp
          Else
            SpaceWidth = (Breite - (Position - (SpaceWidthTemp * (i - k)))) / (i - k)
          EndIf
          Position = x

      EndSelect

      Spaces$ = ""
      
      While TextWidth(Spaces$) < SpaceWidth
        Spaces$ + Chr(160)
      Wend

      For j = k To i

        Position = DrawText(Position, y, Woerter(j), Color) + SpaceWidth

        If KeinRest
          If j < i - 1
            DrawText(Position - SpaceWidth, y, Spaces$, Color)
          EndIf
        Else
          If j < i
            DrawText(Position - SpaceWidth, y, Spaces$, Color)
          EndIf
        EndIf

      Next

      k = i + 1
      Position = 0
      y + TextHeight(Text$) ;+ evtl. Offset für Zeilenabstand, dann aber auch bei ProcedureReturn
      Zeilen + 1

    EndIf

  Next

  If Absatz
    Zeilen + 1
  EndIf

  ProcedureReturn TextHeight(Text$) * Zeilen ;+ evtl. Offset. Gibt Y-Wert für den nächsten Absatz zurück

EndProcedure
;==================================================================================================

Text$ = "Diesen Text kann man mit der Funktion PrintTextAlign ohne Probleme Linksbündig, "
Text$ + "Rechtsbündig, Zentriert oder als Blocksatz ausdrucken. Auf Wunsch läßt sich auch "
Text$ + "noch ein Absatz anhängen. Als Rückgabewert wird die Y-Startposition des nächsten "
Text$ + "Absatzes übergeben. Somit wird formatiertes ausdrucken von Text zum Kinderspiel ;-)"

If PrintRequester()

  If StartPrinting("PrintTextAlign Testseite")

    PrintFont0.l = LoadFont(0, "Arial", Ymm(10), #PB_Font_Bold)
    PrintFont1.l = LoadFont(1, "Arial", Ymm(3), #PB_Font_Bold | #PB_Font_Underline)
    PrintFont2.l = LoadFont(2, "Arial", Ymm(3))

    Mitte = PrinterPageWidth() / 2

    If StartDrawing(PrinterOutput())

      DrawingFont(PrintFont0)

      Y_Start.l = Ymm(10)

      DrawingFont(PrintFont0)

      Y_Start + PrintTextAlign(Xmm(10), Y_Start, "PrintTextAlign Testseite", #False, #ALIGN_CENTER, #True, $000000)

      DrawingFont(PrintFont1)

      Y_Start + PrintTextAlign(Xmm(10), Y_Start, Text$, #False, #ALIGN_LEFT, #True, $0000FF)
      Y_Start + PrintTextAlign(Xmm(10), Y_Start, Text$, #False, #ALIGN_RIGHT, #True, $00FF00)
      Y_Start + PrintTextAlign(Xmm(10), Y_Start, Text$, #False, #ALIGN_CENTER, #True, $FF0000)
      Y_Start + PrintTextAlign(Xmm(10), Y_Start, Text$, #False, #ALIGN_JUSTIFY, #True, $000000)

      Y_Temp = Y_Start

      DrawingFont(PrintFont2)

      Y_Start + PrintTextAlign(Xmm(10), Y_Start, Text$, Xmm(90), #ALIGN_LEFT, #False, $0000FF)
      Y_Start + PrintTextAlign(Xmm(10), Y_Start, Text$, Xmm(90), #ALIGN_RIGHT, #False, $00FF00)
      Y_Start + PrintTextAlign(Xmm(10), Y_Start, Text$, Xmm(90), #ALIGN_CENTER, #False, $FF0000)
      Y_Start + PrintTextAlign(Xmm(10), Y_Start, Text$, Xmm(90), #ALIGN_JUSTIFY)

      LineXY(Mitte, Y_Temp, Mitte, Y_Start)

      Y_Start = Y_Temp

      DrawingFont(PrintFont2)

      Y_Start + PrintTextAlign(Xmm(110), Y_Start, Text$, Xmm(90), #ALIGN_JUSTIFY, #False, $0000FF)
      Y_Start + PrintTextAlign(Xmm(110), Y_Start, Text$, Xmm(90), #ALIGN_CENTER, #False, $00FF00)
      Y_Start + PrintTextAlign(Xmm(110), Y_Start, Text$, Xmm(90), #ALIGN_RIGHT, #False, $FF0000)
      Y_Start + PrintTextAlign(Xmm(110), Y_Start, Text$, Xmm(90))

      StopDrawing()
    EndIf

    StopPrinting()
  EndIf
EndIf

End
Antworten