Delphi อ่าน QR Code ด้วย Zxing
รอคอยมานานแสนนาน แต่ไม่มีใครเขียน ตัวอย่างก็ไม่ค่อยมี (หรือหาไม่เจอ) เขียนเองซะ

ได้โจทย์มาว่าอยากจะอ่าน QR Code เลยหาตัวอย่างแต่ปรากฏว่าเจอแต่ใน .net ซึ่งออกแบบมาง่ายดี เลยคิดว่า Delphi ก็น่าจะทำได้นะ เอาละมาเริ่มกันเลย
ผมก็เริ่มเหมือนกะคนอื่นนั่นแหละ Search Google แต่สิ่งที่พบคือ Dx FireMonkey (https://github.com/Spelt/ZXing.Delphi) อ๋อ มันสำหรับมือถือ ภาษาอังกฤษไม่อ่าน ข้ามเลยละกัน เดี๋ยวๆๆๆๆๆๆๆๆ เขาแค่จะบอกว่าใช้ได้หมดตั้งแต่ Winform ไปจนมือถือเท่านั้นเอง เนี่ยๆ ไม่ยอมอ่านคู่มือ
starting from v3.1, it fully supports also Windows VCL applications (no dependencies on FMX.Graphics unit).

มันเจ๋ง ตรงที่ว่ามันฟรี แล้วยัง Support การอ่าน Barcode ทั้ง 1D และ 2D โดย Supoort ประเภทต่างๆดังนี้

หลักการใช้งานก็บอกไว้ชัดเจนครับนั่นคือ เอารายการที่จำเป็นใส่ไว้ใน User ก็จบ (กับผีนะซิ)
Usage
The simplest example of using ZXing.Delphi looks something like this:Include all the files in your project or use search path like included test application
- Add uses: ScanManager, ZXing.BarcodeFormat, ZXing.ReadResult.
- Add var FScanManager, FReadResult.
ตัวอย่างก็มีให้ Download ไปลองใช้งานด้วยนะ โดยสามารถ Download ได้ที่ https://github.com/Spelt/ZXing.Delphi

เมื่อเปิดตัวอย่างมาหากเป็น WinForm ก็ใช้ VclTestApp.exe ตัวนี้นะครับ

เมื่อทดลองอ่านก็จะพบว่าอ่านได้ด้วยนะตัวเธอ เจ๋งใช่ไหมละ
เอาละครับทีนี้เราก็จะ Copy Pate โปรเจคไปใช้จริงกันแล้ว พอเราเปิด Code มาดูก็จะพบว่ามันไม่มีอะไรในกอไผ่เลย มี control อยู่ไม่กี่ตัว เอาละรออะไร copy แล้วไป Pate ใน form ของ Project ใหม่เรากันเลย

Copy Use แล้วเอามา Pate เลย

Copy Event ของ ปุ่ม Upload แล้วก็เอาไป Pate

เราก็จะเจอ เส้นใต้สีแดงแห่งโชคชะตา

ปกติเราจะต้อง Install Component ก่อน add Libray แล้วจะไม่แดง เหมือนตัวเลขในบัญชี พอ Run ก็จะไม่ได้ แต่เอ๊ ตัวอย่างก็ไม่ได้ Install มัน Run ผ่านได้ไงฟะ กลับไปอ่าน ภาษาอังกฤษอีกครั้ง ก็สงสัยตรงคำว่า “search path” เลยลองไปดูใน Option ของ Project Option

อ้าวมี วิธี Add Component แบบไม่ Install ด้วยแฮะ กดปุ่มไข่ปลาเล็กๆสามจุดก็จะพบปริศนาชิ้นแรกที่ซ่อนอยู่ อ่อเขาให้ add Library path ลงไปในการ compile ก็จัดซิครับ

ขั้นแรกไปตาม หา Search Path กัน ซึ่งมันก็อยู่ใน Folder Lib จาก Project ตัวอย่างนั่นแหละ ผมจะ copy ไปใส่ ใน Project ใหม่ แล้วให้เรา Add Path ไป ทั้งหมด รวมถึง folder ย่อยๆ ด้วย


เมื่อวางแล้ว ให้เราเข้าไปเปลี่ยนใน Target ของ Delphi Compiler แล้วเปลี่ยนเป็น All Configurations

จากนั้นเพิ่ม Path ใน Search Path โดยการคลิกที่ … แล้วกด ที่ Folder เหลืองๆเพื่อเพิ่ม

เพิ่มให้ยับ เอาให้เหมือนตัวอย่าง เอาให้ครบนะครับ ไม่งั้น Compile ไม่ผ่าน

จากนั้นก็ลอง Run ดู ก็จะ Run ไม่ผ่านอยู่ดี จะติด ปัญหา FMX.Graphics.TBitmap ใช้กับ Vcl.Graphics.TBitmap เข้ากันไม่ได้ FMX นี่มันใช่ FireMonkey หรือเปล่านะ เอาละซิ หรือว่ามันจะใช้ได้แค่ Firemonkey กันนะ เข้าสู่ปริศนาชิ้นที่สอง ?

ไม่ใช่ๆ เหมือนมีบางอย่างไม่ถูกเพราะ Demo มัน Run ได้ไงละ กลับไปอ่าน คู่มือออออออ

มันก็เขียนไว้ชัดนะว่า ให้ USE_VCL_BITMAP อืมๆ แล้วมันอะไรกันฟะ ไปแอบดู Code ตัวอย่างก็จะสังเกตุเห็นคำตอบ ใน

ใน Conditional defines นั้นใส่คำว่า USE_VCL_BITMAP เอาไว้ด้วย Copy Pate ซะเลย เรียบร้อย เสร็จเรา

อ้าวยัง Error ทำไมกันนะทั้งๆที่เราก็ USE_VCL_BITMAP โปรแกรมยังถามหา FMX อยู่ นั้นก็เพราะมันถูกบิวด์เอาไว้แล้วไงละ

วิธีแก้ก็ไปลบ Folder Win32 ทื้ง (อย่าคิดมากบอกให้ลบก็ลบเถอะเดี๋ยวมันก็สร้างใหม่เอง)

เท่านี้ก็ Run ผ่านแล้ว