เรื่องฟอร์ม
หน้าแรก อุปกรณ์ที่ประกอบเป็นเครื่องคอมพิวเตอร์ เกาเหลาเทคนิคการใช้ HTML วิธีทำสร้าง Shortcut บน Desktop ปัญหาใหญ่ของ Data transferสำหรับหัวข้อนี้จะแนะนำเกี่ยวกับการใช้เรื่องฟอร์ม
แนะนำการใช้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 ให้เปลี่ยน Properties ของฟอร์ม Border Style ให้เป็น Fixed Dialog ซะก็หมดเรื่อง
แต่ปัญหาอยู่ที่ว่า ถ้ากำหนดเป็น Fixed Dialog แล้วปุ่ม Minimize/Maxzimzie กลับหายไปซะนี่
ในกรณีที่บางท่านใช้ฟอร์มแบบ MDI อยากให้ผู้ใช้สามารถ Minimize ได้แต่ไม่ให้ Resize Form ละทำอย่างไร
ลงใช้วิธีนี้ดูซิครับ ได้ผลดีมาก คือ Border Style เป็น Sizable และ ใส่ Code ตรง Form_ResizeSub 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