筆者曾經說過一個RealBasic 在Windows平檯下非常嚴重問題, 就是關於列印時選擇印表機, 在Realbasic 開發的軟件下, 每次列印必須開啟PageSetupDialog 設定相關列印設定, 才能生成Graphics 物件, 如需省略選擇印表機的部份, 必須預先儲存之前已設定好的SetupString, 然後留給以後直接列印時使用, 在Mac 的環境下, 儲存這個SetupString 並沒有什麼大問題, 但在Windows 環境下可能因為內部編碼的分別, 當直接載入已儲存的SetupString 便會立即當掉Realbasic 的軟件, 問了很多網友及Realbasic 的支援人員也沒有答覆, 花了兩年時間找答案, 到了最後還是自己解決問題 !
http://forums.realsoftware.com/viewtopic.php?f=1&t=35483儲存已設定好的頁面設定,印表機選項等相關選項, 留待下次列印時, 不用重新設定
Dim f as FolderItem
Dim stream as BinaryStream
Dim ps As New PrinterSetup
dim enc as TextEncoding
dim base, varnt, form,strLength as int64
dim g as graphics
dim tmpSetupString as string
If ps.PageSetupDialog then
tmpSetupString=ps.SetupString
enc=tmpSetupString.Encoding
if enc = nil then
enc = GetTextEncoding(0, 0, 0)
end if
base = enc.base
varnt = enc.variant
form = enc.format
tmpSetupString=EncodeBase64(tmpSetupString,0)
strLength = lenB(tmpSetupString)
f=GetFolderItem("d:\printersetup.dat")
If f<> Nil Then
stream=BinaryStream.Create(f,True)
stream.WriteInt64(base)
stream.WriteInt64(varnt)
stream.WriteInt64(form)
stream.WriteInt64(strLength)
stream.Write tmpSetupString
stream.Close
End if
End If
載入已儲存的 PrinterSetup.setupstring 資料
Dim f as FolderItem
Dim stream as BinaryStream
Dim ps As New PrinterSetup
dim enc as TextEncoding
dim base, varnt, form,strLength as int64
dim g as graphics
dim tmpSetupString as string
f=GetFolderItem("d:\printersetup.dat")
If f<> Nil Then
stream=BinaryStream.Open(f, False)
base = stream.ReadInt64
varnt = stream.ReadInt64
form = stream.ReadInt64
strLength = stream.ReadInt64
tmpSetupString = stream.read(strLength, encodings.UTF8)
stream.close
if tmpSetupString <> "" then
enc = GetTextEncoding(base, varnt, form)
tmpSetupString = DecodeBase64(tmpSetupString, enc)
end if
ps.SetupString=tmpSetupString
g = OpenPrinter(ps)
if g <> nil then
// if the report runs successfully
g.textSize = 72
g.drawLine 0,0,g.width-1,0
g.drawLine 0,0,0,g.height-1
g.drawLine g.width-1,g.height-1,0,g.height-1
g.drawLine g.width-1,g.height-1,g.width-1,0
g.foreColor = rgb(150,150,150) //watermark-ish
g.drawString "1",(g.width-g.stringWidth("1"))/2,(g.height/2)+(g.textHeight/2)
//send this last page to the printer, move to the next
g.nextPage
//start our drawing routines again
g.foreColor=rgb(0,0,0)//black again
g.drawLine 0,0,g.width-1,0
g.drawLine 0,0,0,g.height-1
g.drawLine g.width-1,g.height-1,0,g.height-1
g.drawLine g.width-1,g.height-1,g.width-1,0
g.foreColor = rgb(150,150,150) //watermark-ish
g.drawString "2",(g.width-g.stringWidth("2"))/2,(g.height/2)+(g.textHeight/2)
End If
End If