หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 1 2 8 4 6 6

7 ธันวาคม พ.ศ.2549
247 Users On-Line.
Visitors - Page views
 8 4 2 4 5 0 5
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

การสร้าง Control แบบอัตโนมัติ ในขณะที่โปรแกรมทำงาน (Run Time)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 2/6/2552   เวลา: 13:13
(อ่าน : 13783) 
พี่น้องครับ ... วัตถุประสงค์ของบทความชิ้นนี้ นอกจากจะเพื่อใช้ประโยชน์ในการเขียนโปรแกรม เช่น ระบบการจองห้องพัก การจองโต๊ะตามร้านอาหาร ซึ่งจะมีลักษณะของการสร้าง Control ขึ้นมาใหม่แบบอัตโนมัติ ในขณะที่โปรแกรมกำลังทำงาน (Run Time) แล้ว งานชิ้นนี้ผมเองก็อยากจะ Present ตามแนวคิดแบบบ้านๆ พื้นๆ ในสไตล์ของผมอีกครั้งล่ะครับ โดยอาศัยหลักการง่ายๆถึงง่ายมาก คือ คัดลอก (Copy) และ วาง (Paste) Control ไว้บนฟอร์ม แล้วเพิ่มจำนวน Control ด้วยค่า Index และอาศัยคำสั่ง Load เข้ามาช่วย ซึ่งจะง่ายต่อการเกิดเหตุการณ์ (Events) เพื่อที่จะควบคุมการทำงานของโปรแกรมได้ ... และนี่เป็นการย้ำเตือนอีกครั้ง เพื่อให้พี่น้องได้เห็นถึงคำว่า "พื้นฐาน" ที่แท้จริง ซึ่งจะนำทางให้เรา "ต่อ-ยอด" ต่อไปได้อีกอย่างไม่ยากเย็นนัก
ดาวน์โหลด
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6
  • ตามปกติขณะอยู่ที่ Design Time เราก็จะใช้วิธีการ Copy และ Paste คอนโทรลลงไปและกำหนดค่า Index เพื่อทำเป็น Control Array
    ด้วยแนวคิดนี้นี่เอง ที่เรานำไปใช้ในการสร้างปุ่มคำสั่งแบบอัตโนมัติ ในขณะ Run Time
  • สร้าง CommandButton ต้นแบบขึ้นมาก่อน 1 ตัว (กรณีของ Control อื่นๆก็เช่นเดียวกัน)
    • Name = CtrlCommand
    • Index = 0
  • เมื่อสั่งให้โปรแกรมทำงาน (Run Time) .. ก็จะเกิดการคัดลอก Control ด้วยคำสั่ง (Load) ตามจำนวนที่เราต้องการ
  • เหตุการณ์ Click เลือกที่ Control แต่ละตัว
    เริ่มต้นกระบวนการทำงาน
    
    Option Explicit
    
    ' เก็บค่า Index ของ Control Array
    Private CtrlIndex As Integer
    
    ' ==========================================================
    ' เหตุการณ์ของการคลิ๊กเมาส์ซ้าย เพื่อเลือก CommandButton ที่ต้องการ
    ' ==========================================================
    Private Sub CtrlCommand_Click(Index As Integer)
        ' นำไปประยุกต์กันต่อเองล่ะกันครับ ... พี่น้อง
        MsgBox "CtrlCommand " & Index & " ถูกเลือก."
    End Sub
    
    Private Sub Form_Load()
        Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
        
        ' ปกติวิธีการสร้าง CommandButton Control Array ลงบนฟอร์ม
        ' 1. สร้าง CommandButton ต้นแบบออกมาไว้ก่อน 1 ตัว และตั้งค่าคุณสมบัติ
        '     - Name = CtrlCommand
        '     - Index = 0
        ' 2. คัดลอก หรือ Copy Control แล้ววาง (Paste) ลงบนฟอร์ม
        
        ' เราก็จะใช้วิธีการเดียวกันนั่นแหละครับ เพียงแต่ใช้ Code สั่งงานในขณะ Run Time แทน
        ' การโหลด Form หรือ Control เข้าสู่หน่วยความจำ ... เราใช้คำสั่ง Load
        ' กำหนด Index ของ CommandButton Control ตัวแรกเท่ากับ 0
        CtrlIndex = 0
        ' ป้ายบอกชื่อ Control
        CtrlCommand(0).Caption = CtrlCommand(0).Name & " index " & CtrlCommand(0).Index
        
        ' เพิ่ม CommandButton อีก 5 ตัว
        Call AddControl(5)
    
    End Sub
    
    ' ===========================================================
    ' โปรแกรมย่อยที่ใช้ในการเพิ่ม CommandButton ตามจำนวนที่กำหนด แบบ Run Time
    ' ===========================================================
    Private Sub AddControl(NumOfControl As Integer)
    Dim Count As Integer
        
        ' เริ่มสร้าง CommandButton ตัวที่ 2 (Index = 1) ต่อไป
        For Count = 1 To NumOfControl
            
            ' คำสั่ง Load คือ การโหลด Form หรือ Control เข้าสู่หน่วยความจำ
            ' การใช้คำสั่งนี้ ก็จะเหมือนกับการคัดลอก และ วาง Control ลงบนฟอร์มนั่นเอง
            ' และเพิ่มจำนวนค่าของ Index ขึ้นอีก1 ... เพราะมันเป็น Array ไงล่ะครับ
            ' เทคนิคง่ายๆ คำสั่งง่ายๆ ... สุดยอดดดดดดดดดดดดดดดดดดดดดดดดดดด
            CtrlIndex = CtrlIndex + 1
            Load CtrlCommand(CtrlIndex)
        
            With CtrlCommand(CtrlIndex)
                ' จัดตำแหน่งของ Control ...
                Select Case (Count Mod 2)
                    ' เลขจำนวนเต็มใดๆ หารเอาเศษ (MOD) ด้วย 2 หากผลลัพธ์เป็น 0 เลขจำนวนเต็มนั้นๆจะเป็นเลขคู่
                    Case 0
                        .Left = 900
                        .Top = CtrlCommand(CtrlIndex - 1).Top + _
                                    CtrlCommand(CtrlIndex - 1).Height + 60
                    
                    ' เลขจำนวนเต็มใดๆ หารเอาเศษ (MOD) ด้วย 2 หากผลลัพธ์เป็น 1 เลขจำนวนเต็มนั้นๆจะเป็นเลขคี่
                    Case 1
                        .Left = CtrlCommand(CtrlIndex - 1).Left + _
                                    CtrlCommand(CtrlIndex - 1).Width + 60
                        .Top = CtrlCommand(CtrlIndex - 1).Top
                    
                End Select
                
                .Visible = True
                ' ป้ายบอกชื่อ Control
                CtrlCommand(Count).Caption = CtrlCommand(Count).Name & _
                                                                                " index " & CtrlCommand(Count).Index
            End With
        Next
    
    End Sub
    
    Conclusion:
    ตั้งแต่เขียนบทความมานี้ ผมมักจะกล่าวอ้างถึงคำว่า "พื้นฐาน" อยู่ตลอดเสมอมา เพื่อต้องการสื่อไปให้พี่น้องทุกๆท่าน ที่กำลังเริ่มต้นเรียนรู้ ฝึกฝน พัฒนางานซอฟท์แวร์อยู่ในขณะนี้ อย่าได้ท้อแท้ หวั่นกลัว ว่าการศึกษางานทางสายนี้มันเป็นเรื่องที่ยากเย็นแสนเข็ญ แท้ที่จริงแล้วเราสามารถ "คิด" ที่จะนำสิ่งต่างๆ ซึ่งอยู่ใกล้ๆตัวเราเองนั่นแหละ เพื่อนำมาแก้โจทย์ แก้ปัญหาในงานซอฟท์แวร์ได้เป็นอย่างดี

    ทำไม่ได้ หรือ ไม่ได้ทำ หรือ ไม่ได้คิดแม้แต่ที่จะทำ

  • จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
    เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
    CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
    Email: [email protected] หรือ โทร. 08-6862-6560