Seite 1 von 1

Ausdrucken von Ergebnissen an bestimmten Stellen

Verfasst: 27.09.2013 22:03
von HemSA
Hallole,
ich habe ein Problem was das Ausdrucken angeht.

Früher gab es die Befehle

100 LOCATE 18, 1: PRINT "Benennung : "; : PRINT USING "####.#"; wertderbenennung(i)

um die Bildschirmausgaben zu machen.

was den Ausdruck am Drucker angeht konnte das man mit dem:

LPRINT und dem LOCATE Befehl machen wo was in welcher Spalte und Zeile gedruckt wird.

Wie bekomme ich das nun mit Purebasic hin?

Ich will im Prinzip wissen wie ich verschiedene Variablen an verschiedenen Stellen ausdrucken kann (A4 Fornat)

Die Hilfe ist da sehr bescheiden was das Thema abgeht.

Danke für jede Hilfe.
Michael

Re: Ausdrucken von Ergebnissen an bestimmten Stellen

Verfasst: 27.09.2013 22:12
von ts-soft
Die 2DDrawing-Befehle werden hier genutzt. Lediglich statt StartDrawing() kommt StartPrinting() usw.

Naja, ganz so einfach ist es nicht, aber das kann man nicht in 3-4 Sätzen erklären.

Re: Ausdrucken von Ergebnissen an bestimmten Stellen

Verfasst: 28.09.2013 06:27
von edel
Es kommt StartPrinting und danach StartDrawing zum Einsatz. StartPrinting um den Druckvorgang ueberhaupt zu beginnen, und StartDrawing um etwas auf das Papier zu bringen. Man fragt vor dem Drucken den Drucker mit DefaultPrinter ab, oder waehlt einen ueber PrintRequester.

Code: Alles auswählen

If DefaultPrinter()
  Font = LoadFont(#PB_Any, "Arial", 35)
  StartPrinting("Jobnameoderso")  
  StartDrawing(PrinterOutput())
    DrawingFont(FontID(Font))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(10, 10, "Hallo Papier!", 0)    
  StopDrawing()                  
  StopPrinting()
  FreeFont(Font)
EndIf
Zum testen habe ich mir einen virtuellen Drucker installiert (PDF24), hilft Papier zu sparen ;)

Re: Ausdrucken von Ergebnissen an bestimmten Stellen

Verfasst: 28.09.2013 13:51
von HemSA
Danke edel,
genauso habe ich es mir vorgestellt.
Auch der Tip mit PDF24 war gut.

Tschüssle
Michael

Re: Ausdrucken von Ergebnissen an bestimmten Stellen

Verfasst: 28.09.2013 16:58
von Lothar Schirm
Zum Thema "drucken" habe ich mir mal eine Prozedur geschrieben, mit der man Text oder auch Tabellen ausdrucken kann, mit automatischem Zeilenvorschub und Seitenumbruch:

Code: Alles auswählen

;==============================================================================
; Prozedur zum Drucken von Text
; Drucker.pbi
; Erstellt am 29.04.2013
; Letzte Bearbeitung am 28.09.13
;==============================================================================


EnableExplicit

Global Randoben = 200, Printer_y


Procedure PrintText(Text.s, FontName.s = "Courier New", Hoehe = 10, Stil = 0, Farbe = #Black)
  ; Eine Textzeile mit Zeilenvorschub drucken. Parameter:
  ; - Text = zu druckender String
  ; - FontName = Zeichensatz
  ; - Hoehe = Schrifthoehe in Punkten
  ; - Stil = Flags in LoadFont()
  ; - Farbe = Textfarbe
  ; Courier New hat eine feste Zeichenbreite, so dass mit RSet oder LSet für die Teilstrings
  ; auch Tabellen gedruckt werden können.
  ; Die Prozedur muss muss nach StartPrinting() und vor StopPrinting() aufgerufen werden.
  ; Vor dem ersten Aufruf muss Printer_y = Randoben gesetzt werden.
  
  Protected x = 200, Randunten = 200, FontNr, TextHeight
  
  ; Font laden, Höhe an Druckerauflösung anpassen:
  FontNr = LoadFont(#PB_Any, FontName, PrinterPageHeight() * Hoehe / 1024, Stil)
  
  ; Drucken:
  If StartDrawing(PrinterOutput())
    DrawingFont(FontID(FontNr))
    DrawingMode(#PB_2DDrawing_Transparent)
    TextHeight = TextHeight(Space(1))
    DrawText(x, Printer_y, Text, Farbe)
    DrawingMode(#PB_2DDrawing_Default)
    If Printer_y > PrinterPageHeight() - TextHeight - Randunten
      NewPrinterPage()
      Printer_y = Randoben
    Else
      Printer_y = Printer_y + TextHeight
    EndIf
    StopDrawing()
  EndIf

  ; Font wieder freigeben:
  FreeFont(FontNr)
  
EndProcedure
Und hier ein Testprogramm:

Code: Alles auswählen

;==============================================================================
; DruckerTest.pb
; Erstellt am 29.04.2013
; Letzte Bearbeitung am 22.09.2013
;==============================================================================


EnableExplicit

IncludeFile "Drucker.pbi"
 
Define.s s
Define i
Define.d x, y, z

PrintRequester()
If StartPrinting("PBTestDruck")
  Printer_y = Randoben
  For i = 1 To 100
    PrintText(Str(i) + " abcdefghijklmnopqrstuvwxyz ABCDEFGHUJKLMNOPQRSTUVWXYZ 01234567890")
  Next
  PrintText("")
  PrintText("Jetzt kommt eine Tabelle:", "Arial", 12, #PB_Font_Bold, #Red)
  PrintText("")
  PrintText(RSet("x", 5) + RSet("Sqr(x)", 10) + RSet("Pow(x, 2)", 10))
  PrintText("-------------------------")
  For i = 0 To 10
    x = i
    y = Sqr(x)
    z = Pow(x, 2)
    PrintText(RSet(StrD(x), 5) + RSet(StrD(y, 5), 10) + RSet(StrD(z), 10))
  Next
  StopPrinting()
EndIf

End
Vielleicht hilft's.

Nachtrag:
Ich wurde hierzu inspiriert von http://forums.purebasic.com/german/view ... 83052349f4. Ehre wem Ehre gebührt!

Re: Ausdrucken von Ergebnissen an bestimmten Stellen

Verfasst: 28.09.2013 17:32
von ts-soft
@Lothar Schirm

Du solltest in der Procedure, den mit #PB_Any geladenen Font auch wieder freigeben, sonsten wird für jede
Zeile ein neues Fontobjekt geladen, was den Speicher dann doch irgendwann mal belasten sollte :wink:
Oder FontNr static deklarieren und nur bei 0 (also beim ersten Aufruf) Font laden.

Re: Ausdrucken von Ergebnissen an bestimmten Stellen

Verfasst: 28.09.2013 17:55
von Lothar Schirm
ts-soft, vielen Dank für den Hinweis! Ich habe es oben in den Code eingefügt.