ใน Flex เวลาจะใช้ชิ้นส่วนอะไรก็ตามชิ้นส่วนเหล่านั้นส่วนใหญ่จะมาจาก UIComponent ทั้งนั้น คราวนี้ก่อนที่มันจะวาดชิ้นส่วนขึ้นมาเป็นภาพมันดันมีขั้นตอนต่างๆ ที่คล้ายๆ Applet ซะนี่ลองดูลำดับตามด้านล่างละกัน Constructor CreateChildren CommitProperty UpdateDisplayList อาจจะมีมากกว่านี้แต่หลักๆ ที่จะเจอกันบ่อยๆ คือสี่ขั้นนี้แหละ เริ่มจาก Constructor ก่อนที่จะใช้กำหนดค่าเริ่มต้นต่างๆ ให้กับ Component อันนี้ก็ไม่ค่อยมีอะไร เพราะภาษาที่มีคลาสเกือบทุกภาษาก็คงมีเหมือนกัน ตัวถัดมาคือ CreateChildren จะถูกเรียกครั้งเดียวตอนที่เริ่มสร้าง Component โดยมีหน้าที่หลักๆ ก็คือเอาชิ้นส่วนย่อยๆ มาประกอบล่างเป็นชิ้นใหญ่ๆ เช่นฟอร์มที่ใช้ส่งข้อมูลต่างๆ ก็จะมีพวก Label, TextField, … ซึ่งจะไม่มีการเปลี่ยนแปลงรูปร่างหรือขนาดอะไรอีก เอามาใส่ในขั้นนี้ให้หมด รวมถึงตอนกำหนด Event ต่างๆ ให้กับมันด้วย CommitProperty เป็นขั้นที่เตรียมวาดขึ้นหน้าจอแล้ว จริงๆ มีขั้นก่อนหน้านี้เล็กๆ น้อยๆ พอสมควรพวก Measure… ทั้งหลายแหละ ที่เอาไว้บอกว่า Component นี้จะมีขนาดเท่าไหร่แน่เวลาเอาไปประกอบกับชิ้นส่วนอื่น ซึ่งถ้าหากอยากเพิ่มความเร็วขึ้นอีกอาจจะต้องไปเขียนเพิ่ม(แต่ผมขี้เกียจอะนะ ขอใช้พวก VBox, [...]
Flex RegExpValidator
ตอนแรกว่าจะทำ custom validator เองซะแล้วแต่พี่บอกว่าใช้ตัวนี้ได้ก็เลยนั่งงม regular expression ใหม่ จากของเดิมสมัยจาวาเวลาจะ validate string อะไรก็ตามจะใช้ [\p{L}\p{M}]+ เพื่อตรวจสอบว่าข้อมูลที่ใส่เข้ามานั้นเป็นตัวอักษรหรือป่าว แต่ Flex ดันไม่มีกลุ่ม unicode validator ให้ซะงั้น เลยต้องเลี่ยงด้วยวิธีอื่น แต่แล้วก็ต้องปวดหัวอีกเพราะว่าใส่แค่ [^\W]+ มันดันไม่พอ เพราะมันไม่ได้ validate ทั้งข้อความให้แต่จะแบ่งเป็นช่วงๆ ถ้ามีช่วงไหนถูกตาม pattern ก็ถือว่าถูกทั้งประโยค พี่ก็บอกว่าใน regular expression มีสัญลักษณ์อีกสองตัวที่เข้ามาช่วยคือ ^ กับ $ ใส่ไว้หน้ากับหลังรูปแบบจะเป็นการบอกว่าให้ตรวจทั้งประโยคว่าตรงตาม pattern หรือไม่ผลสุดท้ายก็เลยได้เป็น ^[^\W]+$ ดูแปลกๆ ไม่ค่อยคุ้นตาเพราะคงไม่ค่อยมีใครใช้ ^$ กันซักเท่าไหร่หรอก จากด้านบนผลที่ได้ก็เกือบเทียบเท่า [\p{L}\p{M}]+ หละคือตัดเอาเครื่องหมายประหลาดๆ ออกทั้งหมดเหลือแต่ตัวอักษร ตัวเลขและก็ ‘_’ เหมาะสำหรับเอาไว้ตั้งชื่อต่างๆ ยิ่งนัก แล้วก็ ไม่ต้องสร้าง custom [...]
List กับ ArrayCollection
ช่วงนี้กำลังแก้ Checkbox อย่างจริงๆจังๆ แล้วก็เจอปัญหาตามมามากมาย เริ่มจาก Checkbox ไม่เปลี่ยนหลังจากเลือกไปแล้วเพราะว่า method updateDisplayList ของ renderer ยังไม่ถูกเรียกเมื่อเราคลิกที่ List วิธีที่จะทำให้มันเรียกก็ต้องเซท array กลับไปอีกที แต่ปัญหาใหญ่ที่สุดที่เจอแล้วก็นั่งแก้กับ @iporsut อยู่ซะนานเลยคือเรื่อง List กับ ArrayCollection เรื่องเกิดขึ้นเมื่อตัวข้อมูลที่ใช้อยู่มันดันใช้ข้ามประเภทของ ListBase คือ List กับ DataGrid แล้วทีนี้ DataGrid มันสามารถสั่งเรียงข้อมูลได้โดยกดที่หัวแถว สิ่งที่มันทำคือสร้างวัตถุ Sort แล้วยัดเข้าไปที่ ArrayCollection แล้วสั่ง refresh ซะซึ่งข้อมูลที่ออกมาทั้ง List และ DataGrid ก็ดูเรียงสวยงามดี แต่ว่า List ผมกับ method click ที่ใช้สำหรับแสดง Checkbox ด้วยจะใช้ไม่ได้อีกเลย ตอนแรกก็งงว่าทำไม ลองไล่ดูแล้วก็พบว่า array ที่ผมใช้รับ item [...]
Flex reference กับ Garbage collector
เคยเขียนไปบ้างแล้วเกี่ยวกับ Reference ต่างๆ ใ น Flex ว่าควรจะใช้ Weak reference ให้หมดเมื่อมีการเพิ่ม EventListener ต่างๆ เข้าไปแต่เมื่อสองวันก่อนก็เจอเหตุไม่คาดฝันเข้าเพราะกำลังสร้าง Mock แล้วทดสอบปรากฏว่าฟังก์ชั่น ที่มันควรจะทำมันดันถูกลบไปก่อน เหตุผลก็เนื่องจากว่า ก่อนที่ Flex จะวาดอะไรก็ตามมันจะไปเรียก Garbage collector มาเก็บกวาดทีนึง ดังนั้น หากมีการใช้ Weak reference ก่อนขั้นตอนนี้ซึ่งก็คือ ก่อน Commit properties วัตถุต่างๆ จะถูกกวาดไปจนหมดก่อนที่จะได้วาดออกมาเป็นภาพ วันนั้นก็นั่งแก้ นั่งงง แล้วก็ลองส่งข้อความไปใน twetter ดูแล้วก็เหมือนเกิดเป็นหัวข้อใหม่ คุยกับ @iporsut เกี่ยวกับเรื่องนี้ยาวพอสมควร(ยาวสำหรับผมนะ ;p คนอื่นอาจเห็นว่าไม่ยาว) แล้ว @iporsut ก็ได้ข้อสรุปมาว่า Weak reference นั้นไว้แก้ปัญหาเรื่อง Circular reference (การอ้างอิงวัตถุวนไปวนมา) จริงๆ @iporsut ยังไม่ได้เขียนสรุปอะไรมากหรอก [...]
concat กับ push
หลังจากหาวิธีแก้มานานว่าทำยังไงดีที่จะเพิ่มข้อมูลใส่ Array ให้เร็วขึ้นเพราะว่า ถ้าใช้ฟังก์ชั่นมาตรฐานทั่วไปในการต่อ Array สองอันเข้าด้วยกันชื่อฟังก์ชั่นที่นึกถึงอย่างแรกเลยก็คือ concat แต่ว่าปัญหาเกิดขึ้นเมื่อ Array ที่ใช้มันใหญ่ขึ้น เวลาที่ใช้ในการ concat ก็จะช้าลงๆ แบบรับไม่ได้เลยหละ ซึ่งก็ยังไม่ได้แงะลงไปว่า concat มันทำอะไร แต่ตอนนี้เจอฟังก์ชั่นใหม่ที่ใช้แทนกันได้แล้วนั่นคือ push นั่นเอง ข้อแตกต่างระหว่างสองอันนี้คือ concat จะเชื่อม Array เข้าด้วยกัน แต่ push เป็นแค่การเพิ่มข้อมูลไปท้าย Array ดังนั้นหากใช้ push ต้องไล่ข้อมูลใน Array ที่จะเอามาเชื่อมทีละตัวเอาออกมาแล้วค่อยยัดเข้ามาใหม่ ดูแล้วมันก็น่าจะทำเหมือนกันแต่ปรากฏว่าไล่วนเอง เร็วกว่ากันเยอะเลย – -” public function generatePush(event:MouseEvent):void { var average:Number = 0 var total:int = 10000 var na:Array = new Array() [...]