www.oocities.org/pontipa001

 เรื่องฟอร์ม
หน้าแรก
อุปกรณ์ที่ประกอบเป็นเครื่องคอมพิวเตอร์ เกาเหลาเทคนิคการใช้ HTML วิธีทำสร้าง Shortcut บน Desktop ปัญหาใหญ่ของ Data transfer

สำหรับหัวข้อนี้จะแนะนำเกี่ยวกับการใช้เรื่องฟอร์ม

แนะนำการใช้ Editor ใน VB
การจัดฟอร์มให้อยู่กึ่งกลาง
การปิดฟอร์มทุกฟอร์ม
เตือนก่อนที่จะปิดฟอร์ม
ไม่อนุญาติให้ปิดฟอร์มโดยใช้ Control Menu
การส่งค่าตัวแปรผ่านระหว่างฟอร์ม
เปิดฟอร์มให้อยู่เหนือฟอร์มอื่นตลอดถึงแม้กำลังใช้ฟอร์มอื่น
การเคลื่อนย้ายฟอร์มโดยไม่ต้องใช้ TitleBar
ไม่อยากให้ผู้ใช้ Resize Form
ควร Set Forms to Nothing
เกี่ยวกับตัวแปรฟอร์ม

แนะนำการใช้Editor ใน VB
     Editor ใน VB เราต้องใช้ในการป้อนโปรแกรม จึงแนะนำการใช้ดังนี้
   1. เมื่อต้องการแสดงโปรแกรมทั้งหมด หรือหลาย Module พร้อมกัน ให้ไปแก้ไขที่เมนู Tools->Option
       เลือกแถบคั่น Editor เลือก Full Modile View
   2. ใช้แป้นพิมพ์ Ctrl+ลูกศรขึ้น หรือ ลง เพื่อเลื่อนที่ละ Module เลย
   3. ใช้แป้นพิมพ์ Shift+F2 ที่ชื่อของโปรแกรมย่อย เมื่อต้องการดู Code ของโปรแกรมย่อยนั้น
   4. ใช้แป้นพิมพ์ Ctrl+Shift+F2 กลับไปโปรแกรมย่อยเดิม หลังจากที่ใช้ Shift+F2 แล้ว

การจัดฟอร์มให้อยู่กึ่งกลาง

**** หมายเหตุ ถ้าท่านใช้ VB 5 จัดฟอร์มให้อยู่กึ่งกลางเป็นเรื่องที่ง่ายมาก คือไปเปลี่ยน Properties StartUpPosition ให้เป็น Center Screen หรือถ้าจัดอยู่กึ่งกลาง Form MDI ให้ใช้ Center Owner
  Public Sub CenterForm(frmMoveForm As Form)
    frmMoveForm.Left = (Screen.Width - frmMoveForm.Width) / 2
    frmMoveForm.Top = (Screen.Height - frmMoveForm.Height) / 2 - gMenuBarHeight
  End Sub
  '**** gMenuBarHeight เป็นค่าที่กำหนดความสูงของเมนู Bar โดยประมาณ

การปิดฟอร์มทุกฟอร์ม

   การปิดฟอร์มทุกฟอร์มมีประโยชน์มากหากท่านเขียนโปรแกรมจำพวก MDI Form
     Public Sub CloseAll()
        On Error Resume Next
        Dim iFormCount As Integer
        iFormCount = Forms.Count - 1
        For i = iFormCount To 0 Step -1
             Unload Forms(i)
             Set Forms(i) = Nothing
       Next
     End Sub

เตือนก่อนที่จะปิดฟอร์ม
นี้เป็นโปรแกรมเตือนก่อนที่จะปิดฟอร์ม หากผู้ใช้ตอบ Yes จะปิดฟอร์ม ตอบ No จะไม่อนุญาติให้ปิดฟอร์ม
Private Sub Command1_Click()
  Unload Me
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  Cancel = (MsgBox("ต้องการออกจากฟอร์ม IY/N)", vbYesNo) = vbNo)
End Sub

ไม่อนุญาติให้ปิดฟอร์มโดยใช้ COntrol Menu
ถ้าหาท่านกำหนดคุณสมบัติ(Propertie) ของฟอร์ม ControlBox = Flase แล้วปุ่ม Minimize / Maxmize จะหายไปด้วย แต่ถ้าหากต้องการปุ่ม Mininize / Maxmize แต่ไม่ต้องการให้ปิดฟอร์มโดยใช้ปุ่มปิดฟอร์ม (X)   ให้ทำดังนี้

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  If Unloadmode = vbFormControlMenu Then  '*** ปกติ vbFormControlMenu = 0
     Cancel = True
  End If
End Sub

 

การส่งค่าตัวแปรผ่านระหว่างฟอร์ม
การส่งค่าตัวแปรผ่านฟอร์มนี้มีประโยช์นสูงเช่นกัน ในการเขียนโปรแกม ปกติถ้าเราใช้ตัวแปรแบบ Global   เราสามารถส่งค่าหรือรับค่าผ่านโปรแกรมได้ในทุกๆฟอร์ม แต่ใน VB4, VB5 เราสามารถใช้ตัวแปรแบบ Public เพื่อส่งหรือรับค่าได้ ดังตัวอย่าง
   เมื่อต้องการส่งค่าผ่านจาก Form1 ไป Form 2 ทำดังนี้
ใน Form1 ใส่ Command1 Button แล้วใส่เหตุการณ์ Click
Private Sub Command1_Click()
    Dim sAnswer As String
    Form2.pINOUT = "ส่งค่านี้ไปที่ฟอร์ม2"
    Form2.Show vbModal
    sAnswer = Form2.pINOUT '*** รับค่าจากฟอร์ม2
End Sub
ใน Form2 ใส่ Command1 Button แล้วใส่เหตุการณ์ Click
Public pINOUT As String  '*** ต้องกำหนดตัวแปรเป็นแบบ Public
Private Sub Command1_Click()
    pINOUT = "ค่านี้จะส่งกลับไป Form1  " '*** ค่าที่จะส่งกลับไป
    Unload Me
End Sub
หรือใช้รับค่าโดยผ่านจาก Function จาก Form 2 ก็ได้ดังนี้
ใน Form1 
Private Sub Command1_Click()
    Dim sAnswer As String
    sAnswer = Form2.GetValue() '*** รับค่าจากฟังก์ชั่นในฟอร์ม 2
End Sub
ใน Form2 ใส่ Command1 Button แล้วใส่เหตุการณ์ Click
Dim sReturn As String
Public Function GetValue() As String  '*** กำหนดเป็น Public Fuction เพื่อส่งไป Form1
   Me.Show vbModal
   GetValue = sReturn
End Function
Private Sub Command1_Click()
    sReturn = "ค่านี้จะส่งไปที่ Function GetValue   "
    Unload Me
End Sub

เปิดฟอร์มให้อยู่เหนือฟอร์มอื่นตลอดถึงแม้ว่ากำลังเปิดใช้ฟอร์มอื่น
กำหนด ส่วน Declear ไว้ใน Module ดังนี้
#If Win16 Then Declare Sub SetWindowPos Lib "User" ( _
           ByVal hWnd As Integer, _
           ByVal hWndInsertAfter As Integer, _
           ByVal X As Integer, ByVal Y As Integer, _
           ByVal cx As Integer, ByVal cy As Integer, _
           ByVal wFlags As Integer)
#Else Declare Function SetWindowPos Lib  "user32" ( _
          ByVal hwnd As Long, _
          ByVal hWndInsertAfter As Long, _
          ByVal x As Long, ByVal y As Long, _
          ByVal cx As Long, ByVal cy As Long, _
          ByVal wFlags As Long) As Long
#End If
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2

เมื่อต้องการเปิดใช้ฟอร์มให้อยู่เหนือฟอร์มอื่น
SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE

เมื่อต้องการยกเลิกการใช้งาน
SetWindowPos Parent.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE

 

การเคลื่อนย้ายฟอร์มโดยไม่ต้องใช้ Title Bar

ในการใส่ฟอร์มจำพวก Dialog นั้นส่วนใหญ่เขาจะไม่ให้เคลื่อนย้ายฟอร์ม แต่เราสามารถที่จะทำได้โดยใช้ API เข้ามาช่วยดังนี้
กำหนดส่วน Declear ไว้ที่ Module
Declare Function ReleaseCapture Lib "user32" () As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (_
       ByVal hwnd As Long, ByVal wMsg As Long, _
       ByVal wParam As Long, lParam As Any) As Long
Public Const HTCAPTION = 2
Public Const WM_NCLBUTTONDOWN = &HA1

ใส่ PictureBox ไว้บนฟอร์มแล้วใส่ Mouse Down Event ดังนี้
Private Sub Picture1_MouseDown(Button As  Integer, Shift As Integer, X As Single, Y As Single)
         ReleaseCapture SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
End Sub

 

ไม่อยากให้ผู้ใช้ Resize Form

   ถ้าท่านไม่อยากให้ผู้ใช้ Resize Form ให้เปลี่ยน Properties ของฟอร์ม Border Style ให้เป็น Fixed Dialog ซะก็หมดเรื่อง
แต่ปัญหาอยู่ที่ว่า ถ้ากำหนดเป็น Fixed Dialog แล้วปุ่ม Minimize/Maxzimzie กลับหายไปซะนี่
   ในกรณีที่บางท่านใช้ฟอร์มแบบ MDI อยากให้ผู้ใช้สามารถ Minimize ได้แต่ไม่ให้ Resize Form ละทำอย่างไร
   ลงใช้วิธีนี้ดูซิครับ ได้ผลดีมาก คือ Border Style เป็น Sizable และ ใส่ Code ตรง Form_Resize

   Sub Form_Resize()
     On Error Resume Next  '*** ไม่ให้ Error กรณี Minimize Form
     Me.Width = 4800
     Me.Height = 4800
     Me.Refresh
   End Sub

ควร Set Forms to Nothing (27ตุลาคม)
หลังจากที่เปิดใช้ฟอร์มแล้ว ควร Set Forms = Nothing ด้วยเพื่อที่จะคืนหน่วยความจำ ไปใส่ตรง Form_Unload  ถ้าคุณชื่อฟอร์มคุณคือ Form1 คุณใช้  Set Form1 = Nothing แต่ที่นี้ปัญหามีอยู่ว่าถ้าคุณต้องคัดลอกฟอร์มไปอีกชื่อนึง ต้องมาคอยเปลี่ยนชื่อ Form1 เป็นอีกชื่อหนึ่ง ซึ่งอาจลืมเปลี่ยนทำให้เกิด Bug ขึ้นได้   และคุณไม่สามารถใช้  Set Me = Nothing ได้ แต่ยังมีทางแก้คือให้คุณใช้ดังนี้
    Form_Unload(Cancel As Integer)
       Dim Form as Form
       For Each Form In Forms
             If Form Is Me Then
                Set Form = Nothing
                     Exit For
             End If
       Next Form
    End Sub

เกี่ยวกับตัวแปรฟอร์ม (9 พฤศจิกายน)


            มีหลายๆท่านสงสัยเหมือนกับที่ผมสงสัยเมื่อก่อนก็คือ ชื่อฟอร์มเราจะทำให้เป็นตัวแปรได้หรือไม่ มีคำตอบก็คือ ทำได้แต่ว่าไม่สะดวกในการใช้งาน เพราะอย่างไรก็ตามคุณก็ต้องใช้ชื่อฟอร์มอยู่ดี   ดังตัวอย่าง
           Dim MyForm As Form  '*** กำหนดเป็น MyForm เป็นตัวแปรของฟอร์ม
           Set MyForm = Form1   '*** กำหนดค่าตัวแปร MyForm ให้เป็น Form1 (ชื่อฟอร์ม)
           MyForm.Show              '*** นำค่าตัวแปร MyForm ไปใช้
          จะเห็นว่าเราจะต้องระบุ Form1 ถ้าจะนำ Form1 ไปใช้
          แต่มีข้อแนะนำถ้าหากคุณจะใช้ตัวแปรฟอร์มให้คุณสร้างฟังก์ชั่นขึ้นมาดังตัวอย่าง
          สมมุติว่าคุณมี MainForm, Form1,Form2,Form3
          สร้างฟังก์ชั่นใน MyForm MainForm
          Private MyForm(ByVal pForm As String) As Form
              If pForm = "Form1" Then
                 Set MyForm = Form1
              ElseIf pForm = "Form2" Then
                 Set MyForm = Form2
              ElseIf pForm = "Form3" Then
                 Set MyForm = Form3
              End If
          End Function
         เวลาจะใช้งาน เช่นต้องการเปิดใช้ Form1 ให้ใส่ดังนี้
         MyForm("Form1").Show
         นี้เป็นแค่ข้อแนะนำในการใช้ตัวแปรฟอร์ม บางท่านอาจจะมีวิธีที่ดีกว่านี้ก็ได้ หากใครมีอะไรแนะนำดีๆบอกกันบ้างก็ดีนะครับ

หน้าแรก อุปกรณ์ที่ประกอบเป็นเครื่องคอมพิวเตอร์ เกาเหลาเทคนิคการใช้ HTML วิธีทำสร้าง Shortcut บน Desktop ปัญหาใหญ่ของ Data transfer