Mehrere Farben in einer Druckzeile

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
jogo
Beiträge: 64
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

Mehrere Farben in einer Druckzeile

Beitrag von jogo »

Hi,
möchte eine normale Liste mit mehren Angaben pro Zeile drucken.
Für die Übersichtlichkeit wollte ich die lfd. Nr. und das Feldtrennzeichen farblich abheben.
Deshalb kann ich den Zeilenstring nicht vorher komplett zusammen bauen, um ihn an den Drucker zu senden, weil ich ja innerhalb einer Zeile mehrmals die Farbe wechseln muß.
Ich verwende zum Zeichen DrawVectorText() - in der Hilfe u.a. dazu:

Code: Alles auswählen

    Zeichnet den angegebenen Text an der aktuellen Position des Pfad-Cursors. Der Cursor wird an das Ende des gezeichneten Textes verschoben. Der zu verwendende Zeichensatz kann mittels VectorFont() festgelegt werden. 
Demnach müsste doch der folgende DrawVectorText() Befehl genau hinter den vorherigen fortsetzen.
Aber das Zeichnen beginnt bei jeden Aufruf am Startpunkt der Zeile. Irgendwo ist mein Denkfehler.
Hab hier einen lauffähigen Demo-Code. Im Druckerdialog einfach "In Datei drucken" auswählen und die PDF-Option lassen. Dann kann man das Ergebnis schön Papier sparend in der PDF-Datei "Ausgabe.pdf" betrachten. Zumindest ist bei mir mit Mint Mate so.
Falls es Linux-Spezifisch - dann bitte nach Linux verschieben - Vielen Dank

Code: Alles auswählen

;farbdruck mit  DrawVectorText() 
Define dy.i, l.i,n.s

If PrintRequester()  ;wenn drucker gewählt // hier natürlich als pdf "in Datei drucken" // Editiert - Parameter war falsch
  
  If StartPrinting("Test-Druck") ;wenn drucker erfolgreich angesteuert werden kann
    LoadFont(1, "Courier New", 6);zeichensatz feslegen
    StartVectorDrawing(PrinterVectorOutput(#PB_Unit_Point))  ;grafikausgabe zum drucker/datei starten 
                                                             ;hier folgen die Zeichenoperationen... (in hilfe unter vector drawing schauen)
    VectorFont(FontID(1))                                    ;geladenen schriftfont aktivieren
    dy = 10                                                  ;startwert für druck zeilenposition der neuen seite//wird in der schleife dann zeile für zeile erhöht
    For l = 1 To 10                                          ;10 zeilen
      dy + 13                                                ;zeilenvorschub
      n = RSet(Str(l+1),3," ") + " "                         ;nummern-string zusamenbauen 
      MovePathCursor(5, dy)                                  ;druckposition zum schreiben der folgenden zeile
      
      VectorSourceColor(RGBA(2, 0, 219, 255))     ;blau
      DrawVectorText(n)                           ;laufende nummer
      
      VectorSourceColor(RGBA(0, 0, 0, 255))       ;schwarz               
      DrawVectorText("Irgend ein Text")           ;text1 // laut hilfe sollte der cursor ja am ende des vorherigen DrawVectorText() sein..  
      
      VectorSourceColor(RGBA(237, 0, 0, 255))     ;rot            
      DrawVectorText("|")                         ;feldtrenner 
      
      VectorSourceColor(RGBA(0, 0, 0, 255))       ;schwarz               
      DrawVectorText("Noch ein weiterer Text")    ;text2 // 
    Next l
    
    StopVectorDrawing()       ;grafikausgabe beenden
    StopPrinting()            ;druckoperation stoppen und zum drucker/datei senden
  EndIf                       ;ansteuerung erfolgreich
  
EndIf  ;druckerauswahl

End
EDIT: Zeile 4 korrigiert
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
jogo
Beiträge: 64
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

Re: Mehrere Farben in einer Druckzeile

Beitrag von jogo »

Hab ja schon gehofft, das ich mit Hilfe von PathCursorX() die letzte Position ermitteln kann und so mit MovePathCursor (PathCursorX(), gleiche Zeile) die Startposition neu setzen könnte.
Aber PathCursorX() liefert immer nur den Anfangswert...
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Mehrere Farben in einer Druckzeile

Beitrag von ccode_new »

Hi,

da hast du einen Bug gefunden.

Unter Windows funktioniert es.
Unter Linux nur mit Subsystem "qt".

Das hier funktioniert:

Code: Alles auswählen

;farbdruck mit  DrawVectorText() 
Define dy.i, l.i,n.s

If PrintRequester()  ;wenn drucker gewählt // hier natürlich als pdf "in Datei drucken"
  
  If StartPrinting("Test-Druck") ;wenn drucker erfolgreich angesteuert werden kann
    LoadFont(1, "Courier New", 6);zeichensatz feslegen
    StartVectorDrawing(PrinterVectorOutput(#PB_Unit_Point))  ;grafikausgabe zum drucker/datei starten 
                                                             ;hier folgen die Zeichenoperationen... (in hilfe unter vector drawing schauen)
    VectorFont(FontID(1))                                    ;geladenen schriftfont aktivieren
    dy = 10                                                  ;startwert für druck zeilenposition der neuen seite//wird in der schleife dann zeile für zeile erhöht
    For l = 1 To 10                                          ;10 zeilen
      dy + 13                                                ;zeilenvorschub
      n = RSet(Str(l+1),3," ") + " "                         ;nummern-string zusamenbauen 
      MovePathCursor(5, dy)                                  ;druckposition zum schreiben der folgenden zeile
      
      VectorSourceColor(RGBA(2, 0, 219, 255))     ;blau
      DrawVectorText(n)                           ;laufende nummer
      MovePathCursor(5 + VectorTextWidth(n), dy)
      
      VectorSourceColor(RGBA(0, 0, 0, 255))       ;schwarz               
      DrawVectorText("Irgend ein Text")           ;text1 // laut hilfe sollte der cursor ja am ende des vorherigen DrawVectorText() sein..  
      MovePathCursor(5 + VectorTextWidth(n) + VectorTextWidth("Irgend ein Text"), dy)
      
      VectorSourceColor(RGBA(237, 0, 0, 255))     ;rot            
      DrawVectorText("|") ;feldtrenner 
      
      MovePathCursor(5 + VectorTextWidth(n) + VectorTextWidth("Irgend ein Text|"), dy)
      
      VectorSourceColor(RGBA(0, 0, 0, 255))       ;schwarz               
      DrawVectorText("Noch ein weiterer Text")    ;text2 //
    Next l
    
    StopVectorDrawing()       ;grafikausgabe beenden
    StopPrinting()            ;druckoperation stoppen und zum drucker/datei senden
  EndIf                       ;ansteuerung erfolgreich
  
EndIf  ;druckerauswahl

End
..ist aber ziemlich albern.
Die Angabe #PB_Path_Relative scheint ja leider auch nicht zu funktionieren.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
jogo
Beiträge: 64
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

Re: Mehrere Farben in einer Druckzeile

Beitrag von jogo »

ahhh - VectorTextWidth() - ist das Zauberwort :-)
Damit läßt sich der Bug erstmal gut umschiffen...
Hab das mal mit dieser Methode umgebaut & auf 3 Spalten erweitert - so werde ich das auch in meinen Hauptcode umsetzen:

Code: Alles auswählen

;farbdruck mit  DrawVectorText() 
EnableExplicit      ;deklarierungs-zwang
Define.i dx,dy,l
Define.s n,tx1,tx2,tx3,ft
If PrintRequester()  ;wenn drucker gewählt // hier natürlich als pdf "in Datei drucken"
  
  If StartPrinting("Test-Druck") ;wenn drucker erfolgreich angesteuert werden kann
    LoadFont(1, "Courier New", 6);zeichensatz feslegen
    StartVectorDrawing(PrinterVectorOutput(#PB_Unit_Point))  ;grafikausgabe zum drucker/datei starten 
    ;hier folgen die Zeichenoperationen... (in hilfe unter vector drawing schauen)
    
    VectorFont(FontID(1))                                    ;geladenen schriftfont aktivieren
    ft  = "|"                                                ;feldtrenner
    tx1 = "Irgend ein beliebiger Text"
    tx2 = "Noch ein weiterer Text" 
    tx3 = "Es wird immer besser"
    dy = 10                                                  ;startwert für druck zeilenposition der neuen seite//wird in der schleife dann zeile für zeile erhöht
        
    For l = 1 To 10                                          ;10 zeilen
      dx = 5                                                 ;startposition in der neuen Zeile 
      dy + 13                                                ;zeilenvorschub
      n = RSet(Str(l),3," ") + " "                           ;nummern-string zusamenbauen 
      
      MovePathCursor(dx, dy)                                  ;druckposition zum schreiben der folgenden zeile      
      VectorSourceColor(RGBA(2, 0, 219, 255))     ;blau
      DrawVectorText(n)                           ;laufende nummer
      
      dx + VectorTextWidth(n)                               ;neue Startposition 
      MovePathCursor(dx, dy) 
      VectorSourceColor(RGBA(0, 0, 0, 255))       ;schwarz               
      DrawVectorText(tx1)           ;text1 // laut hilfe sollte der cursor ja am ende des vorherigen DrawVectorText() sein..  
      
      dx + VectorTextWidth(tx1)                               ;neue Startposition
      MovePathCursor(dx, dy) 
      VectorSourceColor(RGBA(237, 0, 0, 255))     ;rot            
      DrawVectorText(ft)                         ;feldtrenner 
      
      dx + VectorTextWidth(ft)                               ;neue Startposition
      MovePathCursor(dx, dy)       
      VectorSourceColor(RGBA(0, 0, 0, 255))       ;schwarz               
      DrawVectorText(tx2)    ;text2 // 
      
      dx + VectorTextWidth(tx2)                               ;neue Startposition
      MovePathCursor(dx, dy) 
      VectorSourceColor(RGBA(237, 0, 0, 255))     ;rot            
      DrawVectorText(ft)                         ;feldtrenner 
      
      dx + VectorTextWidth(ft)                               ;neue Startposition
      MovePathCursor(dx, dy)       
      VectorSourceColor(RGBA(0, 0, 0, 255))       ;schwarz               
      DrawVectorText(tx3)    ;text3 // 
      
    Next l
    
    StopVectorDrawing()       ;grafikausgabe beenden
    StopPrinting()            ;druckoperation stoppen und zum drucker/datei senden
  EndIf                       ;ansteuerung erfolgreich
  
EndIf  ;druckerauswahl

End
VectorTextWidth() habe ich zwar gesehen, aber irgendwie nicht für voll genommen, weil ich wohl zu sehr auf Funktionen mit x-Position fixiert war.
Vielen Dank für die Lösung.
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Antworten