Re: [Gambas-user] Update in fedora screwed up printing
Brought to you by:
gambas
|
From: Benoît M. <g4...@gm...> - 2020-01-13 20:03:35
|
Le 13/01/2020 à 20:23, Steve a écrit :
> This is my follow up as promised. After the update I am confirming that
> printing is seriously screwed. I have traced thru code and information
> is flowing however the print (as in on paper) using the paint.drawtext
> is giving unstable results. Printing a receipt from my software produces
> a blank page with only the graphics and no text at all unless I reprint
> it then it comes out sort of ok. The font sizes are not stable I am
> getting fonts smaller than called for. Or larger sometimes. The problem
> is consistent across multiple projects.
The thing that changed in Gambas 3.14 is Printer.Font.Size. The size of
the font has been scaled so that:
- It is consistent between screen and paper.
- It is consistent between Qt and GTK+.
The consistence is approximative, as it relies on screen DPI and printer
DPI, which is not very exact, especially with screens.
This is done through the Painter.FontScale property that stores the font
size adjustment. That property is initialized when Painter.Begin() is
called.
To restore the old behaviour, you can try to set Painter.FontScale to
1.0 just before painting anything.
But it may not work in all cases.
Why? Because there are anyway big problems in your code: it uses
absolute values for coordinates ('Y += 9' and so on). This is wrong, and
works only by luck or by guess.
Unless you use Paint.Scale() to scale the viewport so that coordinates
are now true absolutes values (cm or mm for example), these absolutes
values mean nothing stable if the screen or paper changes, or if the
library version changes, or if the meaning of font size changes, and so on.
The only thing you can be sure is that Paint.Width and Paint.Height is
the size of your paper when printing. But it can use any unit.
You have several things to consider and do:
1) You can use Paint.Scale() so that Paint.Width and Paint.Height are
now cm or mm, or any absolute unit you want.
2) Paint.Font.Size should be now really in *points*. One point = 1/72th
inch ~= 3.5 mm.
3) You have to use Paint.TextSize() or Paint.TextHeight (the line height
actually) to know the size of the text and where to print the next line.
4) You can use the new 'gb.form.print' component. It allows you to print
through a preview dialog (the same that is used in the IDE for printing).
I strongly suggest that you do 3) and try 4). Then your code will be
reliable and you will have a print preview for free.
As an example, I join to that mail the test module you can find in
'gb.form.print' source code.
Regards,
>
> system Info
>
> fedora 31 latest updates.
> Gambas 3.14.2
>
> It seems that the text is not printing at all, but the lines and or
> graphics do. I do not seem to be able to fix this here as I am pretty
> sure the problem is in a serious flaw in the interpreter, and it is now
> a critical issue as it is affecting business operations. Not to mention
> wasting paper and time to reprint everything.
>
> This is a code snipet of just one printing routine that is not producing
> correctly.
>
> =======================================================
>
> Function RcptHeader80(SlsID As String, Y As Integer) As Integer
> Dim TVar, I, Fd As String
>
> Fd =
> PHPOS.FieldList("StoreName,StoreAddress1,StoreAddress2,StoreCity,StoreState,StoreZip,StorePhone")
>
> I = MySqlLib.GetAllData(PHPOS.zStoreInfo, Fd)
>
> Paint.Font.Name = "Arial"
> Paint.Font.Size = 18
> Paint.Font.Bold = True
>
> TVar = FuncLib.GetField(ByRef I, FuncLib.cFieldDelimiter)
> Paint.DrawRichText(TVar, 1, Y, Paint.Width, Y, Align.Center) 'name
> Y += 14
>
> TVar = FuncLib.GetField(ByRef I, FuncLib.cFieldDelimiter)
> Paint.Font.Size = 10
> Paint.DrawText(TVar, 1, Y, Paint.Width, Y, Align.Center) 'addr1
>
> Y += 9
> TVar = FuncLib.GetField(ByRef I, FuncLib.cFieldDelimiter)
> If TVar <> "" Then
> Paint.DrawText(TVar, 1, Y, Paint.Width, Y, Align.Center) 'addr2
> Y += 9
> Endif
> TVar = FuncLib.GetField(ByRef I, FuncLib.cFieldDelimiter)
> Paint.DrawText(TVar & " , " & FuncLib.GetField(ByRef I,
> FuncLib.cFieldDelimiter) & " " & FuncLib.GetField(ByRef I,
> FuncLib.cFieldDelimiter), 1, Y, Paint.Width, Y, Align.Center) 'city
> state zip
> Y += 9
> TVar = FuncLib.GetField(ByRef I, FuncLib.cFieldDelimiter)
> Paint.DrawText(TVar, 1, Y, Paint.Width, Y, Align.Center) 'phone
> Y += 20
> RcptCustomer80(Y)
> Fd = PHPOS.FieldList("sDate,sTime")
> I = MySqlLib.GetData(PHPOS.zSalesHdr, Fd, "SalesID = " & Trim(SlsID))
> Paint.Font.Size = 8
> Paint.DrawText("Date " & Format(Date(FuncLib.GetField(ByRef I,
> FuncLib.cFieldDelimiter)), "mm/dd/yyyy") & " " & I, 30, Y, Paint.Width,
> Y, Align.Left)
> Y += 9
> Paint.DrawText("Sale " & SlsID, 30, Y, Paint.Width, Y, Align.Left)
> Y += 80
> Paint.DrawText("Item", Clmn1, Y, Clmn1W, 14, Align.Left)
> Paint.DrawText("Desc", Clmn2, Y, Clmn2W, 14, Align.Left)
> Paint.DrawText("Price", Clmn3, Y, Clmn3W, 14, Align.Right)
> Paint.DrawText("Qty", Clmn4, Y, Clmn4W, 14, Align.Right)
> Paint.DrawText("Amount", Clmn5, Y, Clmn5W, 14, Align.Right)
> Y += 14
> Paint.FillRect(30, Y, Paint.Width, 2, Color.Black)
> Return Y
> End
>
> ===================================================
>
>
>
>
--
Benoît Minisini
|