OLD FoxBoard
foxboard Home FoxBoard



ยินดีต้อนรับ Guest ลงทะเบียน Login ค้นหากระทู้ แสดงรายชื่อสมาชิก
 หัวข้อสนทนาทั้งหมด
  New Foxboard
 
ชื่อเรื่อง #01858 หัวข้อ: ไม่สามารถเลือกขนาดกระดาษที่สร้างขึ้นได้ เชิญถาม-ตอบปัญหาได้ที่นี่ครับ ตั้งชื่อกระทู้ใหม่
ส่งข้อความโดย aeebee วันที่ 21 ม.ค. 2552 เวลา 11:09 น. - IP Logged
มุมมอง aeebee's ประวัติส่วนตัว ประวัติส่วนตัว   ค้นหากระทู้อื่นๆ aeebee ค้นหา   Quote aeebee Quote   Send Private Message ส่งข้อความ  
aeebee
Avatar
Gold Member
Gold Member
Thailand
07 พ.ย. 2551
41 Posts

คือเขียนโปรแกรมในการพิมพ์เช็คครับ ก็ใช้มาหลายปีแล้ว ใช้กับเครื่องพิมพ์แบบ Dot ซึ่งก็ไม่ได้กำหนดขนาดกระดาษอะไรมาก ก็ใช้ Default A4  ก็พิมพ์ได้ตรงฟอร์มดีครับ 

แต่ตอนนี้ทางบริษัทได้สั่งซื้อเครื่องพิมพ์มาใหม่เป็น Hp Laserjet P1006 เวลาจะพิมพ์เช็คจะลำบากมากครับ เพราะตอนใส่กระดาษเช็ค (เช็คมีขนาด 3"x7" เป็นของกสิกรไทย) ต้องยัดเช็คไปลึกสุดๆเลยครับ และบางครั้งพิมพ์ออกมาก็จะเบี้ยวหรือเฉขึ้น-ลง แล้วแต่ว่าตอนใส่กระดาษใส่ดีหรือไม่ ซึ่งไม่สะดวกเลย จึงได้ความคิดว่าจะพิมพ์ในแนวนอน Landscape (เดิมจะพิมพ์แบบ portrait) จะได้ตะแคงกระดาษเช็คซึ่งจะทำให้ไม่ต้องยัดกระดาษลำบากเกินไป 

แต่ปัญหามีอยู่ว่าพอจะพิมพ์แบบ landscape กระดาษเดิมที่ใช้อยู่ตอนสั่งพิมพ์ใน report นั้นเป็น A4 ก็เลยทำให้ข้อความที่พิมพ์ไม่ลงในกระดาษเช็ค(ใช้วิธีตัดกระดาษเปล่าให้เท่ากับขนาดเช็ค แล้วทดสอบพิมพ์ดู)  ก็เลยมาค้นหาใน foxboard แห่งนี้ ก็พบ 2-3 กระทู้เกี่ยวกับเรื่องกำหนดกระดาษเองแบบ custom หรือกำหนดขนาดกระดาษที่ Print server

โดยดูจากกระทู้ #01827 หัวข้อ: กำหนดขนาดกระดาษ sticker 4 รู บน xp ไม่ได้ ของคุณ sutthipongr ซึ่งในกระทู้นี้ก็มีผู้แนะนำต่างๆ จนถึงคุณ ENJOY ได้แนะนำให้ดูกระทู้ ADD Printer VS VFP และ SHARE PRINTER ซึ่งผมก็ได้เข้าไปดู ตามที่แนะนำ

โดยเริ่มจาก กระทู้ ADD Printer VS VFP ของคุณแนวใหม่  ก็พบคำตอบของคุณ VFP6 ได้ให้ตัวอย่างโปรแกรมไว้ ผมก็เลยคัดลอกตัวอย่างโปรแกรมแล้วนำไปประยุกต์ใช้ดู ก็ปรากฎว่ายังไม่สำเร็จครับ คือผมดูขนาดกระดาษจากตอน Preview ครับ เห็นว่ากระดาษยังคงเป็น A4 อยู่เลย (ผมได้สร้างขนาดกระดาษขึ้นมาแบบ Print server ตั้งชื่อว่า KTB3x7 ที่สงสัยยิ่งกว่าคือทำไมขนาดกระดาษที่ผมสร้างขึ้นนั้นทำไมผมเรียกใช้ไม่ได้คือไม่เห็นมี List ของขนาดกระดาษเลยครับ 

ก็เลยจะขอคำแนะนำหน่อยครับ

1.ขนาดกระดาษที่ผมสร้างขึ้นทำไมจึงไม่มีใน List ครับ

2.จาก code ของคุณ Vfp6 นั้น ผมยังไม่ค่อยเข้าใจเรื่อง Formid ครับ มันคืออะไรเหรอครับ

3.แนวคิดของผมที่จะพิมพ์แบบ Lanscape นั้นถูกต้องหรือไม่ครับ

ช่วยแนะนำด้วยครับ  ขอบคุณมากครับ

ปล.ขอขอบคุณคุณ KaoKae ด้วยครับครั้งที่แล้วผมเข้ามาถามเรื่องพิมพ์ report ออกเป็น PDF ซึ่งสามารถทำได้แล้ว ถึงแม้จะยังทำแบบ Normal ไม่สำเร็จ แต่ตอนนี้ผมก็ใช้แบบ Image Pdf อยู่ครับ ขอบคุณมาก


ส่งข้อความโดย ENJOY วันที่ 21 ม.ค. 2552 เวลา 13:51 น. - IP Logged
มุมมอง ENJOY's ประวัติส่วนตัว ประวัติส่วนตัว   ค้นหากระทู้อื่นๆ ENJOY ค้นหา   Quote ENJOY Quote   Send Private Message ส่งข้อความ  
ENJOY
Avatar
Gold Member
Gold Member
Thailand
20 พ.ย. 2549
101 Posts
ลองไปดูที่หัวข้อ
ฟอนต์ที่แสดงเป็นแนวนอน (หมุน 90 องศา)
เป็นอีกทางเลือกหนึ่งในกรณีที่เราไม่สามารถพิมพ์แบบ Lanscape ได้ครับ

อันนี้ผมก็ยังไม่เคยลองเหมือนกันครับ แต่ดูแล้วน่าจะใช้ได้
มาช่วยตอบเท่าที่รู้ครับ
ข้อ 1. และ ข้อ 2. เนื่องจากผมยังไม่เคยลอง ขอผ่านครับรอท่านอื่นแล้วกัน ^_^ (ดูจากโค๊ดของคุณ vfp6 แล้วโปรแกรมมันจะเอาข้อมูลขนาดกระดาษมาจาก report ที่เราสร้างไว้ตอนแรก ไม่ทราบว่า คุณ aeebee ได้กำหนดขนาด ใน report เป็น KTB3x7 หรือยังครับ ถ้าจะให้ดีช่วยแสดงโค๊ดที่คุณ สั่งพิมพ์ให้ดูด้วยก็ดีครับ อีกข้อหนึ่ง บางทีอาจแค่ service printer spooler อาจจะยังไม่ได้เปิดน่ะครับ )
ข้อ 3. ก็เป็นอีกวิธีหนึ่งที่ดีครับ เราอาจจะทำรายงานเป็น 2 แบบ โดยเขียนโค๊ดเช็คดูว่าตอนนี้ต่อกับ printer ตัวใหนอยู่ ก็เลือกเอารายงานที่เหมาะกับเครื่องพิมพ์ตัวนั้นมาพิมพ์ครับ

ส่งข้อความโดย kaokae วันที่ 21 ม.ค. 2552 เวลา 17:02 น. - IP Logged
มุมมอง kaokae's ประวัติส่วนตัว ประวัติส่วนตัว   ค้นหากระทู้อื่นๆ kaokae ค้นหา   Quote kaokae Quote   Send Private Message ส่งข้อความ  
kaokae
Avatar
Gold Member
Gold Member
Thailand
15 ม.ค. 2550
578 Posts
ขอตอบด้วยนะครับ
1. และ 3. รู้สึกว่า Hp Laserjet P1006 รับขนาด custom เล็กสุดน่าจะประมาณ 3x5 นิ้ว เมื่อเราตั้งกระดาษ 7x3 นิ้วจึงมีส่วนที่เกินไป ทำให้มองไม่เห็นครับ ถ้าตั้ง 3x5 แล้วใส่แนวตั้งน่าจะได้ครับ

2. เอาง่าย ๆ Formid คือ เลขที่ ของขนาดกระดาษ เหมือนเลข recno() นั่นเองครับ เอาไว้ใช้ระบุ ขนาดกระดาษให้ถูกต้องครับ หากยังไม่เข้าใจลองดู code นี้ดูนะครับ

******************************
     ooo = createobject("EnumForms")
     lcPrinter = ""
     IF NOT ooo.GetFormList(lcPrinter)
          ? ooo.cErrorMessage
          ? ooo.cApiErrorMessage
     ENDIF
     FOR i=1 TO ooo.oFormList.Count
          loOneForm = ooo.oFormList.Item(i)
     ? loOneForm.FormID, loOneForm.FormName, loOneForm.Width, loOneForm.Height, loOneForm.FormFlags
     ENDFOR
     RELEASE ooo


DEFINE CLASS EnumForms AS Custom
     HIDDEN hHeap, nInch2mm, nCm2mm, nCoefficient
     cPrinterName = ""
     cUnit = "Internal"
     nRound = 0
     nInch2mm = 25.4
     nCm2mm = 10
     nCoefficient = 0
     nApiErrorCode = 0
     cApiErrorMessage = ""
     cErrorMessage = ""
     hHeap = 0
     oFormList = Null

     PROCEDURE Init(tcUnit, tnRound)     
     IF PCOUNT() >= 1 AND INLIST(tcUnit, "English", "Metric")
          This.cUnit = PROPER(tcUnit)
     ENDIF     
     IF PCOUNT() = 2
          This.nRound = tnRound
     ENDIF     
     This.oFormList = CREATEOBJECT("Collection")
     This.LoadApiDlls()
     This.hHeap = HeapCreate(0, 4096*10, 0)

     DO CASE
     CASE PROPER(This.cUnit) = "English"
          This.nCoefficient = This.nInch2mm * 1000
     CASE PROPER(This.cUnit) = "Metric"
          This.nCoefficient = This.nCm2mm * 1000
     OTHERWISE     
          This.cUnit = "Internal"
          This.nCoefficient = 1
     ENDCASE                              
     ENDPROC

     PROCEDURE Destroy
     IF This.hHeap <> 0
          HeapDestroy(This.hHeap)
     ENDIF
     ENDPROC

     PROCEDURE GetFormList(tcPrinterName)
     LOCAL lhPrinter, llSuccess, lnNeeded, lnNumberOfForms, lnBuffer, i

     IF PCOUNT() > 0
          This.cPrinterName = tcPrinterName
     ENDIF

     This.ClearErrors()
     
     lhPrinter = 0
     lcPrinterName = This.cPrinterName
     IF EMPTY(lcPrinterName)
          lnResult = OpenPrinter(0, @lhPrinter, 0)
     ELSE
          lnResult = OpenPrinter(@lcPrinterName, @lhPrinter, 0)
     ENDIF     
     IF lnResult = 0
          This.cErrorMessage = "Unable to get printer handle for '" ;
               + This.cPrinterName + "'."
          This.nApiErrorCode = GetLastError()
          This.cApiErrorMessage = This.ApiErrorText(This.nApiErrorCode)
          RETURN .F.
     ENDIF

     lnNeeded = 0
     lnNumberOfForms = 0

     IF EnumForms(lhPrinter, 1, 0, 0, ;
               @lnNeeded,      @lnNumberOfForms ) = 0
          IF GetLastError() <> 122
               This.cErrorMessage = "Unable to Enumerate Forms."
               This.nApiErrorCode = GetLastError()
               This.cApiErrorMessage = This.ApiErrorText(This.nApiErrorCode)
               RETURN .F.
          ENDIF
     ENDIF

     lnBuffer = HeapAlloc(This.hHeap, 0, lnNeeded)
     llSuccess = .T.
     IF EnumForms(lhPrinter, 1, lnBuffer, @lnNeeded, ;
               @lnNeeded,      @lnNumberOfForms ) = 0
          This.cErrorMessage = "Unable to Enumerate Forms."
          This.nApiErrorCode = GetLastError()
          This.cApiErrorMessage = This.ApiErrorText(This.nApiErrorCode)
          llSuccess = .F.
     ENDIF

     IF llSuccess
          FOR i=1 TO lnNumberOfForms
               loOneForm = This.OneFormObj()
               WITH loOneForm
                   lnPointer = lnBuffer + (i-1) * 32
                   .FormID      = i
                   .FormFlags = This.Long2NumFromBuffer(lnPointer)
                   .FormName = This.StrZFromBuffer(lnPointer+4)
                   .Width      = ROUND(This.Long2NumFromBuffer(lnPointer+8) / ;
                         This.nCoefficient, This.nRound)
                   .Height     = ROUND(This.Long2NumFromBuffer(lnPointer+12) / ;
                         This.nCoefficient, This.nRound)
                   .Left = ROUND(This.Long2NumFromBuffer(lnPointer+16) / ;
                         This.nCoefficient, This.nRound)
                   .Top = ROUND(This.Long2NumFromBuffer(lnPointer+20) / ;
                         This.nCoefficient, This.nRound)
                   .Right = ROUND(This.Long2NumFromBuffer(lnPointer+24) / ;
                         This.nCoefficient, This.nRound)
                   .Bottom = ROUND(This.Long2NumFromBuffer(lnPointer+28) / ;
                         This.nCoefficient, This.nRound)
               ENDWITH
               This.oFormList.Add(loOneForm, TRANSFORM(i))
          ENDFOR
     ENDIF

     = HeapFree(This.hHeap, 0, lnBuffer )
     = ClosePrinter(lhPrinter)

     RETURN llSuccess

     PROCEDURE OneFormObj
     LOCAL loOneForm
     loOneForm = NEWOBJECT("Empty")
     ADDPROPERTY(loOneForm, "FormFlags", 0)
     ADDPROPERTY(loOneForm, "FormId", 0)
     ADDPROPERTY(loOneForm, "FormName", "")
     ADDPROPERTY(loOneForm, "Width", 0)
     ADDPROPERTY(loOneForm, "Height", 0)
     ADDPROPERTY(loOneForm, "Left", 0)
     ADDPROPERTY(loOneForm, "Top", 0)
     ADDPROPERTY(loOneForm, "Right", 0)
     ADDPROPERTY(loOneForm, "Bottom", 0)
     RETURN loOneForm
     ENDPROC

     PROCEDURE ClearErrors
     This.cErrorMessage = ""
     This.nApiErrorCode = 0
     This.cApiErrorMessage = ""
     ENDPROC

     PROCEDURE StrZFromBuffer(tnPointer)
     LOCAL lcStr, lnStrPointer
     lcStr = SPACE(256)
     lnStrPointer = 0
     = RtlCopy(@lnStrPointer, tnPointer, 4)
     lstrcpy(@lcStr, lnStrPointer)
     RETURN LEFT(lcStr, AT(CHR(0),lcStr)-1)
     ENDPROC

     PROCEDURE Long2NumFromBuffer(tnPointer)
     LOCAL lnNum
     lnNum = 0
     = RtlCopy(@lnNum, tnPointer, 4)
     RETURN lnNum
     ENDPROC

     FUNCTION Num2LOng(tnNum)
     DECLARE RtlMoveMemory IN WIN32API AS RtlCopyLong ;
          STRING @Dest, Long @Source, Long Length
     LOCAL lcString
     lcString = SPACE(4)
     =RtlCopyLong(@lcString, BITOR(tnNum,0), 4)
     RETURN lcString
     ENDFUNC

     FUNCTION Long2Num(tcLong)
     DECLARE RtlMoveMemory IN WIN32API AS RtlCopyNum ;
          Long @Dest, String @Source, Long Length
     LOCAL lnNum
     lnNum = 0
     = RtlCopyNum(@lnNum, tcLong, 4)
     RETURN lnNum
     ENDFUNC

     HIDDEN PROCEDURE ApiErrorText
          LPARAMETERS tnErrorCode
          Local lcErrBuffer
          lcErrBuffer = REPL(CHR(0),1024)
          = FormatMessage(0x1000 ,.NULL., tnErrorCode, 0, @lcErrBuffer, 1024,0)
          RETURN LEFT(lcErrBuffer, AT(CHR(0),lcErrBuffer)- 1 )
     ENDPROC

     HIDDEN PROCEDURE LoadApiDlls
          DECLARE INTEGER OpenPrinter IN winspool.drv;
               STRING @pPrinterName,;
               INTEGER @phPrinter,;
               INTEGER pDefault
          DECLARE INTEGER ClosePrinter IN winspool.drv;
               INTEGER hPrinter
          DECLARE LONG EnumForms IN winspool.drv AS EnumForms ;
               LONG hPrinter, LONG Level, LONG pForm, ;
               LONG cbBuf, LONG @pcbNeeded, ;
               LONG @ pcReturned
          DECLARE INTEGER HeapCreate IN Win32API;
               INTEGER dwOptions, INTEGER dwInitialSize,;
               INTEGER dwMaxSize
          DECLARE INTEGER HeapAlloc IN Win32API;
               INTEGER hHeap, INTEGER dwFlags, INTEGER dwBytes
          DECLARE lstrcpy IN Win32API;
               STRING @lpstring1, INTEGER lpstring2
          DECLARE INTEGER HeapFree IN Win32API;
               INTEGER hHeap, INTEGER dwFlags, INTEGER lpMem
          DECLARE HeapDestroy IN Win32API;
               INTEGER hHeap
          DECLARE RtlMoveMemory IN WIN32API AS RtlCopy ;
               Long @Dest, Long Source, Long Length
          DECLARE lstrcpy IN Win32API;
               STRING @lpstring1, INTEGER lpstring2
          DECLARE INTEGER GetLastError IN kernel32
          Declare Integer FormatMessage In kernel32.dll ;
               Integer dwFlags, String @lpSource, ;
               Integer dwMessageId, Integer dwLanguageId, ;
               String @lpBuffer, Integer nSize, Integer Arguments

          ENDPROC

ENDDEFINE

******************************

-------------
ไม่มีอะไรยาก เกินความตั้งใจ

ส่งข้อความโดย aeebee วันที่ 06 ก.พ. 2552 เวลา 14:01 น. - IP Logged
มุมมอง aeebee's ประวัติส่วนตัว ประวัติส่วนตัว   ค้นหากระทู้อื่นๆ aeebee ค้นหา   Quote aeebee Quote   Send Private Message ส่งข้อความ  
aeebee
Avatar
Gold Member
Gold Member
Thailand
07 พ.ย. 2551
41 Posts

ต้องขอโทษด้วยที่ไม่ได้เข้ามาตอบ เพราะติดธุระทำหลายอย่างครับ  วันนี้เพิ่งมีเวลาเข้าเน้ตครับ  และก็ต้องขอขอบคุณทั้ง 2 ท่านด้วยนะครับ ที่เข้ามาตอบให้ความรู้จะลองศึกษาดู code ที่ให้มานะครับ แล้วจะมาถามอีกทีครับ  ขอบคุณมาก


ถ้าท่านต้องการตอบคำถามที่นี่ ท่านควรจะ  Login
ถ้าท่านยังไม่ได้ลงทะเบียน ท่านควรจะ  ลงทะเบียน

กระโดดไป เชิญถาม-ตอบปัญหาได้ที่นี่ครับ ตั้งชื่อกระทู้ใหม่
พิมพ์รายงาน พิมพ์รายงาน

Powered by Vfoxware Forums ver. 1.0
Copyright ©2006-2010 Vfoxware Guide