Seite 1 von 3

ListIcon ausdrucken

Verfasst: 13.06.2018 23:38
von HeX0R
Hier ein Nebenprodukt meines aktuellen Projekts.
Sicherlich nicht in den Top 10 meiner anderen Codes angesiedelt, aber zu schade, um es zu verstecken.

Ich hatte tatsächlich noch nie eine Druckfunktion bisher gebraucht, evtl. gibts ja auch andere, die einen Code-Schubser diesbezügl. brauchen.

kurzer Umriss:
Ein ListIconGadget wird in Tabellenform ausgedruckt, mit Seitenzahl und dynamischer Größenanpassung.
Nicht gedacht für ListIcons mit 20 Spalten und langen Texten, er würde das zwar dennoch auf die Breite eines Ausdrucks bekommen, aber die Schrift wäre wohl unleserlich klein.

Für meine Zwecke wars ausreichend, wer will, kann ja noch etwas dran rumbasteln, z.B. versch. Schriftarten für Header und Tabelleninhalt o.ä. einfügen.

Code: Alles auswählen

;==>https://www.purebasic.fr/german/viewtopic.php?p=347448#p347448
Procedure PrintListIcon(ListIcon, PageName.s = "Page {NUM}", LineThickness = 2)
	Protected i, j, k, Count, Columns, NewLine, CurrentPage, LastLineReached
	Protected OutputHeight.d, OutputWidth.d, SizeFactor.d, PixPos.d
	Protected XSpaceBetweenTextAndTable.d, YSpaceBetweenTextAndTable.d, XSpaceBetweenEdgeAndTable.d, YSpaceBetweenEdgeAndTable.d
	Protected H.d, size.d, OverallSize.d
	Static DefaultFontID.i, BoldFontID.i
	
	If Not DefaultFontID
		DefaultFontID = FontID(LoadFont(#PB_Any, "Arial", 16))
		BoldFontID = FontID(LoadFont(#PB_Any, "Arial", 16, #PB_Font_Bold))
	EndIf
	
	If IsGadget(ListIcon) = 0 Or GadgetType(ListIcon) <> #PB_GadgetType_ListIcon
		ProcedureReturn
	EndIf
	Columns = GetGadgetAttribute(ListIcon, #PB_ListIcon_ColumnCount)
	
	Dim Widths.d(Columns)
	
	If PrintRequester() And StartPrinting("ParameterList")
		OutputHeight = PrinterPageHeight()
		OutputWidth  = PrinterPageWidth()
		Count        = CountGadgetItems(ListIcon) - 1
		
		If StartVectorDrawing(PrinterVectorOutput(#PB_Unit_Pixel))
			VectorFont(DefaultFontID)
			H                         = VectorTextHeight("P°²gT_")
			YSpaceBetweenTextAndTable = H / 4                ;<-- spacing between table line and text on top and bottom, 25% of max text height
			XSpaceBetweenTextAndTable = VectorTextWidth(" ") ;<-- spacing between table line and text left and right, one space here, add more if needed
			YSpaceBetweenEdgeAndTable = OutputHeight / 20		 ;<-- spacing of 1/20 of complete width will be used left and right of the table
			XSpaceBetweenEdgeAndTable = OutputWidth / 20		 ;<-- spacing of 1/20 of complete height will be used on top and bottom of the table
																											 ;find max column widths
			For j = 0 To Columns - 1
				Widths(j) = VectorTextWidth(GetGadgetItemText(ListIcon, -1, j))
			Next j
			For i = 0 To Count
				For j = 0 To Columns - 1
					size = VectorTextWidth(GetGadgetItemText(ListIcon, i, j))
					If size > Widths(j)
						Widths(j) = size
					EndIf
				Next j
			Next i
			;Add some more space for each column, in front and behind the text
			size        = 0
			For j = 0 To Columns - 1
				Widths(j) + 2 * XSpaceBetweenTextAndTable
				size + Widths(j)
			Next j
			OverallSize               = size
			size + (Columns - 1) * XSpaceBetweenTextAndTable + XSpaceBetweenEdgeAndTable * 2
			SizeFactor                = OutputWidth / size
			OutputWidth               = OutputWidth / SizeFactor
			OutputHeight              = OutputHeight / SizeFactor
			NewLine                   = #True
			ScaleCoordinates(SizeFactor, SizeFactor)
			
			H + YSpaceBetweenTextAndTable * 2
			For i = 0 To Count
				If NewLine
					;print Header
					PixPos = YSpaceBetweenEdgeAndTable
					VectorFont(BoldFontID)
					For j = 0 To Columns - 1
						size = 0
						For k = 0 To j - 1
							size + Widths(k)
						Next k
						AddPathBox(XSpaceBetweenEdgeAndTable + size, PixPos, Widths(j), H)
						MovePathCursor(XSpaceBetweenEdgeAndTable + XSpaceBetweenTextAndTable + size, PixPos + YSpaceBetweenTextAndTable)
						DrawVectorText(GetGadgetItemText(ListIcon, -1, j))
					Next j
					StrokePath(LineThickness)
					NewLine = #False
					PixPos + H
				EndIf
				
				VectorFont(DefaultFontID)
				For j = 0 To Columns - 1
					size = 0
					For k = 0 To j - 1
						size + Widths(k)
					Next k
					AddPathBox(XSpaceBetweenEdgeAndTable + size, PixPos, Widths(j), H)
					MovePathCursor(XSpaceBetweenEdgeAndTable + XSpaceBetweenTextAndTable + size, PixPos + YSpaceBetweenTextAndTable)
					DrawVectorText(GetGadgetItemText(ListIcon, i, j))
				Next j
				StrokePath(LineThickness)
				PixPos + H
				If PixPos + 4 * H > OutputHeight
					CurrentPage + 1
					MovePathCursor(XSpaceBetweenEdgeAndTable + OverallSize - VectorTextWidth(ReplaceString(PageName, "{NUM}", Str(CurrentPage))), OutputHeight - 2 * H)
					DrawVectorText(ReplaceString(PageName, "{NUM}", Str(CurrentPage)))
					NewPrinterPage()
					CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
						ScaleCoordinates(SizeFactor, SizeFactor)
					CompilerEndIf
					NewLine = #True
					PixPos = 0
					If i = Count
						LastLineReached = #True
					EndIf
				EndIf
				
			Next i
			If LastLineReached = 0
				CurrentPage + 1
				MovePathCursor(XSpaceBetweenEdgeAndTable + OverallSize - VectorTextWidth(ReplaceString(PageName, "{NUM}", Str(CurrentPage))), OutputHeight - 2 * H)
				DrawVectorText(ReplaceString(PageName, "{NUM}", Str(CurrentPage)))
			EndIf
			
			StopVectorDrawing()
		EndIf
		StopPrinting()
	EndIf
	
EndProcedure


CompilerIf #PB_Compiler_IsMainFile
	Procedure main()
		Protected i, j, Columns, Items, TextSize, a$
		
		OpenWindow(0, 0, 0, 640, 480, "ListIcon Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
		ListIconGadget(0, 5, 5, 630, 430, "Column 1", 200)
		ButtonGadget(1, 270, 440, 100, 22, "Print")
		
		Columns = Random(6, 3)
		Items   = 100
		For i = 1 To Columns - 1
			AddGadgetColumn(0, i, "Column " + Str(i + 1), 200)
		Next i
		For i = 1 To Items
			a$ = ""
			For j = 0 To Columns - 1
				TextSize = Random(40, 5)
				If j > 0
					a$ + #LF$
				EndIf
				a$ + Left("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam", TextSize)
			Next j
			AddGadgetItem(0, -1, a$)
		Next i
		
		Repeat
			Select WaitWindowEvent()
				Case #PB_Event_CloseWindow
					Break
				Case #PB_Event_Gadget
					If EventGadget() = 1
						PrintListIcon(0)
					EndIf
			EndSelect
		ForEver
		
	EndProcedure
	
	main()
CompilerEndIf

Re: ListIcon ausdrucken

Verfasst: 14.06.2018 18:10
von hjbremer
:allright: schönes Beispiel mit Vectordrawing - Top :allright:

Re: ListIcon ausdrucken

Verfasst: 14.06.2018 18:32
von mk-soft
Sehr schön...

Leider bei macOS ein Bug mit NewPrinterPage...

Workaround

Code: Alles auswählen

               NewPrinterPage()
               ;- Problem with macOS. Workaround recall ScaleCoordinates
               ScaleCoordinates(SizeFactor, SizeFactor)
               

Re: ListIcon ausdrucken

Verfasst: 14.06.2018 21:12
von HeX0R
Ist dieser Bug schon gemeldet?

Ich habe das mal oben eingebaut.

Re: ListIcon ausdrucken

Verfasst: 14.06.2018 21:18
von mk-soft
Ne, noch nicht gemeldet.

Habe kein einfache Beispiel zum melden...

Re: ListIcon ausdrucken

Verfasst: 14.06.2018 23:03
von HeX0R
Ich bin gerade etwas verwirrt...
Ich habe da noch (ist wohl bei Win 10 mit bei) Microsoft XPS Document Writer und Microsoft Print to PDF installiert.
Merkwürdigerweise passiert bei beiden Geräten, wenn ich die auswähle ... nichts?!
Kann das jemand bestätigen?

Re: ListIcon ausdrucken

Verfasst: 14.06.2018 23:17
von Micha122
Also unter Win10 ist der PDF-Druck kein Problem.
Sieht gut aus.

Re: ListIcon ausdrucken

Verfasst: 14.06.2018 23:42
von HeX0R
Ich habe nicht behauptet PDF Ausdrucke gehen nicht, ich habe gefragt, ob die o.g. Drucker bei irgendjemanden funktionieren.
Bei dir geht also der Microsoft Print to PDF oder hast Du irgendeinen anderen getestet?

Re: ListIcon ausdrucken

Verfasst: 15.06.2018 08:56
von Lord
HeX0R hat geschrieben:Ich habe nicht behauptet PDF Ausdrucke gehen nicht, ich habe gefragt, ob die o.g. Drucker bei irgendjemanden funktionieren.
Bei dir geht also der Microsoft Print to PDF oder hast Du irgendeinen anderen getestet?
Kurztest bei mir:
- PDFCreator funktioniert nicht, leeres Blatt
- FinePrint funktioniert, aber nur 3 Spalten
- PDFCreator über FinePrint funktioniert, aber nur 3 Spalten
- Microsoft XPS Document Writer funtioniert, alle Spalten
Win7x64 PB5.70LTSbeta1(x64)

Re: ListIcon ausdrucken

Verfasst: 15.06.2018 10:32
von mk-soft
Bei PDFcreater kommen bei VectorTextHeight und VectorTextWidth falsche werte zurück. (0.0)