Seite 1 von 1

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

Verfasst: 06.08.2008 18:40
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

Verfasst: 24.10.2008 22:25
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!

Verfasst: 24.10.2008 22:50
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. :)

Verfasst: 25.10.2008 08:46
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.

Verfasst: 26.10.2008 15:24
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

Verfasst: 26.10.2008 15:54
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.

Verfasst: 26.10.2008 16:10
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

Verfasst: 14.12.2008 18:24
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