พัฒนาและปรับปรุงต่อ
- ก็ต่อจากตอนที่ 1 ตอนนี้ผมปรับมาเป็นรุ่น 2.0.1 built 5727 พยายามโค๊ดเท่าที่เวลาเอื้ออำนวยครับ ปรับเรื่องตัวหนังสือภาษาไทยและเรื่อง print preview
ปัญหาของตัวหนังสือ Unicode
- หลังจาก update โปรแกรมมาได้พักหนึ่ง ผมก็พบกับปัญหา 2 เรื่องคือเรื่อง Unicode กับ Meta file (สำหรับการแสดง Print Preview) เรื่องแรกเนื่องจากเดิมโปรแกรมอยู่บน Delphi ตัวหนังสือที่เห็นบนโปรแกรมทั้งหมดเป็น Ascii เมื่อโปรแกรมมาอยู่บน Lazarus ที่สนับสนุน Unicode ในรูปแบบ UTF8 (Unicode Transformation Format — 8-bit) เต็มตัว ผมค่อนข้างมะงุมมะหราอยู่พักใหญ่ ภาษาไทยที่เคยแสดงได้บนกริด (เช่นตารางป้อนข้อมูล ตารางผลคำนวณ) กลับเป็นภาษามนุษย์ต่างดาว แต่ก็แก้ไขได้ไม่ยาก แต่ที่เหงื่อตกมากๆคือ สัญลักษณ์ (° degree) ที่แสดงผลมุมหลังตัวเลขกลับยากบนวินโดส์ แต่บน Ubuntu ง่ายกว่า บนวินโดส์ใช้ฟอนต์ Tahoma เป็นหลัก ส่วนบน Ubuntu ผมใช้ฟอนต์ Sans
- สัญลักษณ์ degree ใน ubuntu ทำได้โดยการ typecast ง่ายๆ ด้วยโค๊ด WideChar(#$00B0) ถ้าเปิดโปรแกรม character map จะเห็นว่าหมายเลข Unicode ตรงกันเป็นฐาน 16 คือ 00B0 แต่บนวินโดส์ที่ผมเสียเวลามากหาอยู่นานต้องใข้แบบนี้ UnicodeToUTF8(chr(176)) ผมค่อนข้างงงมาก เพราะสัญลักษณ์บนระบบ Ascii เก่าตัว degree ใช้ตัวเลข 176 แต่มันกลับ work
ปัญหาของ Metafile สำหรับ Print Preview
- โค๊ดดั้งเดิมใช้ Meta File ซึ่งเป็นฟอร์แม็ตถ้าจำไม่ผิดน่าจะออกแบบโดยไมโครซอฟท์ ซึ่งอะไรๆถ้าขึ้นกับไมโครซอฟท์ ก็ไม่ใช่ cross-platform ชื่อเต็มๆของ Meta file ก็คือ Windows Meta file คือ Meta file เป็นฟอร์แม็ตที่สามารถขยายหรือย่อได้โดยไม่เสีย resolution ในทางโปรแกรมมิ่งจะเขียนงานที่จะพิมพ์ลงบน Meta file ก่อนเวลาพิมพ์จริงๆ ก็แค่ลอกภาพจาก Meta file ลงไปที่เครื่องพิมพ์ ผมพยายามหาโค๊ดใหม่ของ Meta file ที่สนับสนุน cross-platform ก็โชคดีมีคนเขียนไว้ค่อนข้างดี ถ้าสนโปรแกรมมิ่ง free pascal เข้าไปดูและดาวน์โหลดได้ Lazarus Meta File
- ผมโค๊ด Print Preview ใหม่ ลองดูหน้าตาดังรูปด้านล่าง
- ลอง print บนวินโดส์ไม่มีปัญหาพิมพ์ออกเครื่องพิมพ์ได้ปกติ แต่ถ้าใช้ driver เป็นเครื่องพิมพ์จำพวก pdf ในวินโดส์ OK แต่ใน ubuntu ผมใช้ driver เรียกว่า cups-pdf ยังไม่ work ส่วน printer ใน Ubuntu ยังไม่ได้ลอง ตอนนี้ผมลองขยายหน้าดูเป็น 200 % จะเห็นดังรูปด้านล่าง
ปรับการจัดหน้ากระดาษ Page Setup
- ปรับปรุงโค๊ดเดิมจัดหน้ากระดาษเช่นตั้งกั้นหน้าซ้ายและขวา บนและล่าง เขียน header และ footer ได้ ลองดูภาพด้านล่างครับ
- ผมลองตั้งกั้นหน้าซ้ายขวาบนล่างแล้วใส่ header, fotter ดังรูปด้านบน ลองดูได้ผลดังรูปด้านล่าง
ปรับปรุง Plot Viewer
- งานวงรอบเมื่อคำนวณเรียบร้อยแล้ว งานอยู่ในเกณฑ์ขั้นต่อไปคือตรวจดูรูปร่างของวงรอบ โค๊ดในส่วนนี้ผมได้เข้าไปแก้ไขได้นิดเดียว ตัวหนังสือแสดงชื่อหมุดเมื่อเปิดครั้งแรกตัวหนังสือยังโอเค แต่พอซูมหรือแพนตัวหนังสือพลิกไป 90 องศา ที่จัดไปแล้วคือเรื่อง icon, status bar ที่เหลือยังต้องแก้ไขต่อไป ผมพยายามหา component ที่เป็น vector พบแล้วแต่ยังไม่รู้นำมาใช้จะเป็นอย่างไร สามารถ export เป็น SVG, DXF ได้
แก้ไขปัญหาเรื่องฟอนต์ไทยบนลินุกซ์
- เล่นเอาเหงื่อตก ตอน print preview ตัวหนังสือภาษาไทยก็แสดงผลอยู่ดีๆ แต่พอเวลา print หรือ print เป็น pdf ด้วยไดรเวอร์ cups/cups-pdf ตัวหนังสือไทยก็หายวับไปกับตา สาเหตุที่น่าจะเป็นไปได้ ผมว่าน่าจะมาจาก component ที่ติดมากับ Lazarus คือ Printer4Lazarus แนวทางแก้ไขของผมใน linux ใช้การเขียนภาพเข้าไปโดยตรง แบบนี้ข้อเสียข้อแรกก็คือ ไม่สามารถเลือก Text ได้จากโปรแกรม pdf editor เช่น pdfedit แต่ถ้าไปรันโปรแกรมนี้บนวินโดส์ก็ไม่มีปัญหา ข้อเสียข้อที่สองคือทำงานช้ากว่าเดิม
- มาลองดูโค๊ด โมดูลตัวนี้จะรับ object ก่อนพิมพ์ในรูปแบบ Meta File ผ่านตัวแปร AMetafile และต้องใช้ directive มาช่วยแยกโค๊ด linux ออกจากวินโดส์
[sourcecode language=”delphi”]
procedure TPrintPreviewForm.PrintMetafile(const ARect : types.TRect;
AmetaFile : TGraphic);
var
bm : TBitmap;
begin
{$IFDEF LINUX}
bm := TBitmap.Create;
try
(* Use TBitmap to draw canvas from TlmfImage (Meta File *)
(* To solve the problem of Thai font on Linux *)
(* The following codes implemented for Linux *)
(* The disadvantage of this way *)
(* 1. Very slow *)
(* 2. In pdf file, all the result are images not text object *)
bm.Width := ARect.Right – ARect.Left;
bm.Height := ARect.Bottom – ARect.Top ;
bm.Canvas.Brush.Style := bsSolid;
bm.Canvas.Brush.Color := clWhite;
bm.Canvas.Rectangle(ARect);
TlmfImage(AMetafile).Draw(bm.Canvas, ARect);
Printer.Canvas.StretchDraw(Arect, bm);
{$ELSE}
(* The following codes that doesn’t work with Thai font on Linux *)
(* but work fine on Windows *)
TlmfImage(AMetafile).Draw(Printer.Canvas, ARect);
{$ENDIF}
{$IFDEF LINUX}
finally
bm.Free;
end;
{$ENDIF}
end;
[/sourcecode]
- ลองเปิดด้วย Document Viewer ได้ผลดังรูปด้านล่าง
หนทางข้างหน้า
- ปรับปรุง Plot Viewer ให้สามารถแสดงผลได้ถูกต้อง ปรับปรุงเรื่องสามารถ export ไปอยู่ในรูปแบบ DXF, SVG
- ปรับปรุงให้สามารถ Save as ผลการคำนวณวงรอบให้อยู่ในรูปแบบ xml หรือไม่ก็ xls สามารถเปิดได้ด้วย Excel หรือ Openoffice calc ได้ ในตอนนี้หา component มาช่วยยังไม่ได้ เขียนเิองเป็นไปไม่ได้เพราะหนักหนาเกินไป
- ปรับให้สามารถอ่านไฟล์ข้อมูลเดิมได้ (จากโปรแกรม Traverse Pro รุ่นเดิมที่เขียนด้วย Delphi) ที่ผมบอกไว้ก่อนหน้านี้คือ ไม่สามารถอ่านข้อมูลไฟล์ไบนารีในรูป type ที่เป็น extended ได้ (สำหรับโปรแกรมรุ่นก่อนพัฒนาด้วย Delphi ไม่มีปัญหากับการอ่าน type ข้อมูลแบบนี้)
พี่ครับ ผมพึ่งหัดเขียน lazarus บน ubuntu 9.12 และ ThaiOS 10.04 แล้วลองใช้รายงาน LazReport รายงานมัน Preview ภาษาไทย และพอสั่งพิมพ์ อักษรที่เป็นไทย กลับว่าง อะครับ ไม่ทราบแก้ไขยังไงได้บ้างครับ ผมลอง สั่งพิมพ์ไปยัง PDF file ครับ เจ้าตัว Lazarus มันใช้ฟอนต์ Helvetica อาจเป็นปัญหาตรงส่วนก็ก็ได้ แต่ผมก็ไม่รุ้จะแก้ยังไง (ความรู้น้อย อังกฤษแปลไม่ค่อยออก)และอยาก ทราบว่า รายงานแบบพี่มีวิธีการสร้างอย่างไรได้บ้างครับ ลองโหลดไปแล้ว มั่วไม่ถูกครับ กราบขอบพระคุณมากครับพี่…
สวัสดีครับ ผมไม่ได้ใช้ Lazreport มาช่วยเลยครับ ที่เห็นเป็น print preview ผมนั่งโค๊ดด้วยมือจึงคุมตัวหนังสือได้หมด ทั้ง encoding charset, font ตอนนี้ผมลองเข้าไปดูตัวอย่างใน Lazreport อยู่พบว่ามีปัญหากับภาษาไทย ไม่ทราบใช้่ Lazreport ต่อกับฐานข้อมูลไหมครับ ถ้าต่อเป็นฐานข้อมูลอะไร ผมลองดูตัวอย่างใน Lazreport ในโฟลเดอร์ ..lazreportsamplesbarcode ใช้ฐานข้อมูลพื้นๆคือ dbf ผมทดสอบใน windows ก่อน (เนื่องจากตัวอย่างในนี้เขียนไว้ค่อนข้างนานผมแก้ไขโค๊ดไปหลายบรรทัดถึงจะรันได้)
-ตอนแรกลองไปแก้ไข dbf ในตัวอย่างแปลงฐานข้อมูลเป็น Thai charset (Windows 874 หรือ CP874) พบว่าแสดงผลไม่ถูกต้องใน dbgrid ซึ่ง dbgrid น่าจะรับ Unicode อย่างเดียว
-กลับไปแก้ไขฐานข้อมูลให้เป็น Unicode ใน dbf ที่ dbgrid จะแสดงได้ถูกต้อง
-ขั้นต่อไปคือสร้าง report ถ้า encoding ฐานข้อมูลเป็น Unicode สามารถสร้าง report ได้พิมพ์เป็น pdf ได้ ภาษาไทยออก ผมเข้าไปดูใน webboard ปัญหาแบบคล้ายๆกันนี้มาก ส่วนใหญ่จะแก้ไขด้วยการไป encode ฐานข้อมูลใหม่เป็น Unicode หรือถ้าสร้างใหม่ก็ให้เป็น Unicode ไปเลย
-ผมจะลองเข้าไปทดสอบใน linux ดูว่าจะเป็นอย่างไรครับ แต่ที่ผ่านมาผมติดตั้ง cups-pdf ใน ubuntu ยังไม่ทำงานเลยครับ สั่งพิมพ์แล้วก็เงียบหาย ไม่ใช่โปรแกรมของผมตัวเดียว ลองในโปรแกรมอื่่นๆแล้วเหมือนกัน ผลเป็นการทดสอบเป็นอย่างไรจะมาเล่าบอก
ขอบพระคุณมากครับพี่ ตัวอย่างที่ผมทดสอบ ผมทดสอบแค่วาง memo บน lazreport ขณะ design รายงานครับ แล้วเปลียนข้อความเป็น ภาษาไทย ผสมกับอักษรอังกฤษยังไม่ได้ทดสอบติดต่อฐานข้อมูลครับ ผลปรากฎอย่างที่แจ้ง อักษรอังกฤษพิมพ์ออกได้ แต่ส่วนที่เป็นอักษรไทยกลับว่างครับ (พิมพ์ลง cups-pdf ไฟล์จะถูกสร้างไว้ที่ Home userpdf ผมลองไปดูมันฝั่ง font Helvetic Type1C)ยังไงก็กราบขอบพระคุณ ไว้ ณ โอกาสนี้ครับ
สงสัย cups-pdf เจ้ากรรมจะทำเสียแล้ว ผมไปดูไฟล์ที่ ~/PDF ก็เหมือนกันคือภาษาไทยหาย ไปดู config ที่ /etc/cups/cups-pdf.conf ก็ไม่มีอะไรน่าสนใจที่จะเกี่ยวข้องกับ font ว่างๆจะลองหาวิธีการอื่นๆครับ
ไปๆมาๆดูแล้วไม่ใช่ปัญหาของ cups และ cups-pdf ซะแล้ว ลอง openoffice ดูไม่มีปัญหา โปรแกรม Traverse Pro ผมพิมพ์ออกมา ตรงตัวหนังสือภาษาไทยก็หายวับกับตา ประมาณว่ามัน blank ไปเลย ลองเปลี่ยนจากฟอนต์ Sans ไปเป็นฟอนต์อื่นก็ยังไม่เวิร์ค
สาเหตุน่าจะเป็นคอมโพเน็นต์ Printer4Lazarus ผมแก้ไขโค๊ดใน Traverse Pro ตรงคัดลอกจาก canvas ของ Meta File ลงบน bitmap ธรรมดา (งานที่เขียนลง bitmap จะกลายเป็นรูปภาพ) แล้ว Draw ลงเครื่องพิมพ์ผ่าน Printer.Canvas พอจะแก้ไขปัญหาเฉพาะหน้าได้ก่อน ผมคิดว่า user คงไม่แคร์ถ้าสามารถ print ออก printer ได้ถูกต้อง แต่สำหรับ Lazreport ว่างๆผมจะลองเข้าไปดูในโค๊ด
กราบขอบพระคุณมากครับพี่
เจอปัญหาแบบนี้เลยครับ ยังไงก็กราบขอบพระคุณอย่างสูง ไม่รู้ว่าจะกี่คนที่พัฒนาบน lazarus แล้วใช้ Lazreport เป็นตัวทำรายงาน จะมีปัญหาเหมือนกันรึป่าว เมืองไทยมีคอร์สเปิดสอน lazarus หรือป่าวครับ อิๆๆ