ListIcon ausdrucken

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
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

ListIcon ausdrucken

Beitrag 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
Zuletzt geändert von HeX0R am 15.06.2018 16:03, insgesamt 2-mal geändert.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: ListIcon ausdrucken

Beitrag von hjbremer »

:allright: schönes Beispiel mit Vectordrawing - Top :allright:
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ListIcon ausdrucken

Beitrag 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)
               
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: ListIcon ausdrucken

Beitrag von HeX0R »

Ist dieser Bug schon gemeldet?

Ich habe das mal oben eingebaut.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ListIcon ausdrucken

Beitrag von mk-soft »

Ne, noch nicht gemeldet.

Habe kein einfache Beispiel zum melden...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: ListIcon ausdrucken

Beitrag 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?
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: ListIcon ausdrucken

Beitrag von Micha122 »

Also unter Win10 ist der PDF-Druck kein Problem.
Sieht gut aus.
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: ListIcon ausdrucken

Beitrag 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?
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: ListIcon ausdrucken

Beitrag 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)
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ListIcon ausdrucken

Beitrag von mk-soft »

Bei PDFcreater kommen bei VectorTextHeight und VectorTextWidth falsche werte zurück. (0.0)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten