[บทเรียน,B4X] การสร้าง Xui CustomView คล้ายการสร้างActiveXในVB6.0

Theera

Well-Known Member
Licensed User
Longtime User
ขอขอบคุณ Aeric ชาวมาเลเซีย ที่สาธิตการสร้างตัวอย่าง และเหล่า experts ท่านอื่นด้วย ณ ที่นี่ (รวม Klaus' tutorials และAlexander's advices)


คำอธิบายภาษาไทยเพิ่มเติม

ส่วนที่1. การนิยามคุณสมบัติของ Xui CustomView ว่ามีคุณสมบัติอะไรเพิ่มเติมบ้าง และการกำหนด #Event

Key ชื่อตัวแปร ที่จัดเก็บ ค่า Key
DisplayName เป็นชื่อที่แสดงในแผงของ Properties
FieldType ประเภทของตัวแปร เป็นได้แค่ String หรือ Boolean เท่านั้น (ไม่สามารถกำหนดเป็น Int ,Bitmap)
DefaultValue ค่ากำหนดตายตัว ซึ่งสามารถสร้างเป็น List ก็ได้ เช่น DefaltValue: Sunday ,List:Sunday|Monday|Tueday|.....|Saturday
หมายเหตุ
ยังมี ส่วนเพิ่มเติม ที่อาจจะมีก็ได้
Description สำหรับบรรยายคุณสมบัติที่สร้างเพื่ออะไร
MinRange/MaxRange สำหรับกำหนดค่าต่ำสุด /ค่าสูงสุด

เราจะกำหนด #Event: หลังจากเขียนนิยามคุณสมบัติเพิ่มเติม ทั้งหมดแล้ว ในบรรทัดถัดไป

ตัวอย่าง
B4X:
#DesignerProperty: Key: HasLogo,DisplayName: My Logo,FieldType: Boolean,DefaultValue:False,Despcription: There is Logo Icon ,or not
#DesignerProperty: Key: Weekday,DisplayName: Day of Week,FieldType: String,DefaultValue:Sunday, List:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday

#Event: Click

ส่วนที่2 การประกาศตัวแปร เพื่อจัดเก็บค่าที่อ่าน ค่า Key ได้จากคำสั่ง Props

ตัวอย่าง

B4X:
Sub Class_Globals
    Private mEventName As String 'ignore          'IDE  เป็นผู้สร้าง
    Private mCallBack As Object 'ignore              'IDE  เป็นผู้สร้าง
    Public mBase As B4XView                              'IDE  เป็นผู้สร้าง
    Private xui As XUI 'ignore                              'IDE  เป็นผู้สร้าง
    Public Tag As Object                                      'IDE  เป็นผู้สร้าง
 
 
    Private m_HasLogo As Boolean    'เขียนขึ้นมา เพื่อประกาศตัวแปร  สำหรับ ผมใช้  m_ตามด้วย<ชื่อKey> เพื่อความสะดวกและช่วยแยกแยะว่าตัวเองเป็นผู้สร้าง

ส่วนที่3 การอ่านค่า Key โดยใช้คำสั่ง Props เขียนใน DesignerCreateView Module

ตัวอย่าง

B4X:
Public Sub DesignerCreateView (Base As Object, Lbl As Label, Props As Map)
    mBase = Base                        'IDE  เป็นผู้สร้าง
    Tag = mBase.Tag                    'IDE  เป็นผู้สร้าง
    mBase.Tag = Me                    'IDE  เป็นผู้สร้าง

    m_HasLogo = Props.GetDefault("HasLogo", False)    'เขียนขึ้นมา  กรณีรู้ค่ากำหนดตายตัว
    m_CashMoney = Props.Get("CashMoney")    'เขียนขึ้นมา กรณีไม่รู้ค่ากำหนดตายตัว

ส่วนที่4 การตั้งค่า Key ต่างๆ (Thank you Aeric's Example)

ตัวอย่าง


B4X:
Public Sub setHasLogo(HasLogo As Boolean)
   m_HasLogo=HasLogo
   'mBase.??    <----ไม่ต้องมีบรรทัดนี้  (ลบทิ้ง) เนื่องจากเป็นคุณสมบัติที่สร้างขึ้นเองโดยเฉพาะ ไม่เป็นสมาชิกของ mBase
End Sub

Public Sub setEnabled(Enabled As Boolean)
   m_Enabled=Enabled
   mBase.Enabled=Enabled
End Sub

Public Sub setVisible(Visible As Boolean)
   m_Visible=Visible
   mBase.Visible=Visible
End Sub

ส่วนที่5 การเขียนโค้ด เพื่อรองรับการทำงาน โดยสร้างโมดูล ประเภท Public Sub

ตัวอย่าง

B4X:
'ประกาศตัวแปรก่อนใช้งาน
Sub Class_Globals
    Private QR As QRGenerator
    Private ImvQR As ImageView
    Private BmpQR As B4XBitmap
    Private BmpLogo As B4XBitmap

B4X:
'เขียนโค้ด (Thank you Aeric's Example)
Public Sub Create (Text As String)
    BmpQR = QR.Create(Text)  'ตัวแปร BmpQR ถูกประกาศ ที่โมดูล Sub Class_Globals
    If mHasLogo Then
        ImvQR.Bitmap = QR.AddBitmap(BmpQR, BmpLogo, 180).Resize(ImvQR.Width, ImvQR.Height, True)
    Else
        ImvQR.Bitmap = BmpQR
    End If
End Sub

ข้อสังเกต
QR เป็นตัวแปรไลบารี่ จาก QRGenerator.ฺBas ไม่ต้องเขียน QR.initialize

คำแนะนำเพิ่มเติมของKlaus ชาวสวิตเซอร์แลนด์

Post in thread '[Solved]Unknown member in CustomView' https://www.b4x.com/android/forum/threads/solved-unknown-member-in-customview.165175/post-1012802

เราสามารถสร้างไตเติ้ลให้กับ Xui CustomView ได้ดังนี้
B4X:
Sub Class_Globals
    Public mLblTitle As B4XView     '<----สร้างตัวแปร มารับค่า Lbl
    Public mPnlUpper As B4XView  '<---สร้าง Panel มารองรับอีกทีหนึ่ง

B4X:
Public Sub DesignerCreateView (Base As Object, Lbl As Label, Props As Map)
    mBase = Base
    Tag = mBase.Tag
  mBase.Tag = Me
  
    'Private Lbl As Label  '<---ไม่จำเป็นต้องมีบรรทัดนี้
    'Lbl.Initialize("")          '<---ไม่จำเป็นต้องมีบรรทัดนี้
    mLblTitle = Lbl
    mLblTitle.Text = "Title"
    mLblTitle.Color = xui.Color_Blue
    mLblTitle.TextColor = xui.Color_Yellow    'i changed the colors to show what happens
    mLblTitle.SetTextAlignment("CENTER", "CENTER")
  
    mPnlUpper = xui.CreatePanel("mPnlUpper")
'    mPnlUpper.Color=0x00FFFFFF
    mPnlUpper.Color = xui.Color_Gray
    m_HasLogo = Props.GetDefault("HasLogo",False)

    mBase.AddView(mLblTitle, 0, 0, mBase.Width, 30dip)
    mBase.AddView(mPnlUpper,0, 30dip, mBase.Width, mBase.Height - 30dip)
 
Last edited:
Cookies are required to use this site. You must accept them to continue using the site. Learn more…