29 กันยายน 2553

VB.Net Class Episode 2 การสร้างคลาส

VB.Net Class Episode 1 ซึ่งเป็นภาคแรก เราได้เรียนรู้การสร้างคอนโทรลคลาส แล้วลากมาวางไว้ที่ฟอร์ม (ถ้ายังไม่ได้อ่าน กรุณากลับไปอ่านโดยด่วน http://kasem-mesak.blogspot.com/2010/09/vbnet-class-epsode-1.html)
แต่มีคลาสอีกตัวที่อยู่นอกเหนือคอรโทรคลาส ซึ่งก็คือ ฟอร์ม ถ้าเราจะทำเป็นคลาส แล้วให้ฟอร์มอื่นสืบทอดไปใช้งานอีกทอดหนึ่ง ทำอย่างไรบทความนี้มีคำตอบ

การสร้าง Sub Class ของ Form
1. เปิด Visual Studio 20xx จากนั้นคลิกเลือก New Project....
เลือก Visual Basic -> Windows -> Windows Forms Application
ที่ช่อง Name ป้อน myFormClass





















2. ที่ฟอร์ม Designer ให้ตกแตงฟอร์มตามตัวอย่าง
















3. ทำการบันทึก โดยไปที่เมนู File -> Save All
ช่อง Name ป้อน myFormClass
ช่อง Location ป้อน D:\VBNET_CLASS
ช่อง Solution Name ป้อน myFormClass








4. จากนั้นให้ไปคลิกเมาส์ปุ่มขวาที่ ชื่อ myFormClass เลือก Properties
ที่แทป Application ปลี่ยนค่าใน Application type เป็น Class Library














5. ทำการ Build โปรเจกต์ให้เป็นไฟล์ DLL โดยไปที่เมนู Build -> Build myFormClass
( จะได้ไฟล์ myFormClass.dll อยู่ในโฟลด์เดอร์
D:\VBNET_CLSS\myFormClass\myFormClass\bin\Debug )

การนำ sub Class ของฟอร์มไปใช้

1. เปิด Visual Studio 20xx จากนั้นคลิกเลือก New Project....
เลือก Visual Basic -> Windows -> Windows Forms Application
ที่ช่อง Name ป้อน myProjForm

2. ไปที่เมนู Project -> Add New Item...
ที่ Common Items เลือก Windows Forms จากนั้นเลือก Inherited Form
แล้วคลิกปุ่ม Add













3. ที่หน้าต่าง Inheritance Picker คลิกปุ่ม Browse
4. ไปเลือกไฟล์ myFromClass.DLL ที่เราได้สร้างไว้
(อยู่ในโฟล์เดอร์ D:\VBNET_CLSS\myFormClass\myFormClass\bin\Debug )
เมื่อเลือกเสร็จคลิกปุ่ม Open
5. จากนั้นจะกลับมาที่หน้าต่าง Inheritance Picker อีกครั้ง
ให้คลิกที่ Form1 แล้วคลิก OK
















เราก็จะได้ฟอร์มที่สืบทอดมาจาก sub class ที่เราได้สร้างไว้
ซึ่งจะทำให้เกิดความสะดวกในการจัดการรูปแบบของฟอร์ม
สามารถสร้างฟอร์มคลาสที่รวบรวมคำสั่งต่าง ๆ ที่จำเป็นไว้ได้
และอื่น ๆ อีกมากมาย

เรื่องของคลาส ส่วนใหญ่เป็นเรื่องของสืบทอด ถ้าเราเข้าใจที่ไปที่มา
เราก็สามารถใช้งานได้อย่างง่ายดาย

โชคดีมีฟอร์มใช้อีกแล้วครับท่าน

24 กันยายน 2553

VB.Net Class Episode 1 การสร้างคลาส

เคยไหมเวลาพูดถึงเรื่องคลาสทีไร งงทุกที ไปหาตัวอย่างที่เขายกขึ้นมา เห็นมีแต่ตัวอย่าง บ้าน หรือไม่ก็ รถ อ่านจบก็งง จะเขียนโปรแกรมมันไปเกี่ยวอะไรกับบ้านหรือรถ(ว่ะ) สรุปเกาหัว ผละออกมาดีกว่า ผลสรุปเขียนไม่เป็นซักที หลายครั้งไปเจอเพื่อน ๆ พอคุยเรื่องการเขียนโปรแกรมแนว OOP ส แกก็เล่ามาว่า ได้เชิญวิทยากร อันดับ 101 ของไทยมาอบรม วิทยากรบรรยาย เกี่ยวกับ OOP ได้เยี่ยมมาก ทฤษฎีเป๊ะ ๆ มีรถสีอะไร บ้านต้องมีหน้าต่างกี่บ้านประตูกี่บาน สีอะไร โห ฟังไปเคลิ้มไป บรรยายเก่งมาก ๆ ยกนิ้วให้เลย พอเรียนจบ เกาหัว งานนี้ได้เพิ่มเหามาอีก สรุปกลับมาก็ยังเขียนโปรแกรมแนวสร้างบ้านไม่เป็น ทั้ง ๆ ที่เป็นคนเขียนโปรแกรมและทำระบบมาก่อน จริง ๆ โทษใครไม่ได้ ต้องโทษตัวเอง (คงจะแก่เกินเรียนแล้วล่ะ) เอาล่ะ ไม่เป็นไร วันก่อนฟังเรื่องราวของกระดุมเม็ดแรก จำชื่อ อ. ผู้แต่งเรื่องนี้ไม่ได้ต้องกราบขออภัยด้วย เวลาเราใส่เสื้อถ้าเราเผลอไปติดกระดุมเม็ดแรกผิด จะสังเกตว่ามันจะผิดไปจนหมด อิๆ กว่าจะรู้ตัวก็โน่นไปเป็นสุดท้าย เมื่อติดผิดก็ต้องเลาะใหม่หมด แล้วเริ่มใหม่ (อ้าวไปนอกเรืองซะแล้ว) แต่โปรแกรมไม่ใช่กระดุม แต่มันก็ใกล้เคียงกัน บางทีผิดนิดเดียว แต่ต้องรื้อใหม่หมด แต่ก็มีข้อดี ยิ่งเขียนผิด เขียนแล้วมี Error คนเขียนยิ่งเก่ง (ถ้ามันไม่เลิกเขียนไปซะก่อน) การเขียนโปรแกรมคือการแก้ปัญหา ใครมีปัญหาอะไรก็มาให้เราแก้ให้ จำไว้ว่ายิ่งเขียนยิ่งได้บุญ (ตังค์ก็ได้ด้วย) นอกเรื่องไปซะนาน คลาส (class) ก็ไม่ใช่กระดุม แต่มันก็มีลักษณะเหมือนกระดุม เป็นเม็ด ๆ มีหน้าที่ในตัวมัน อิๆ ไม่ได้ยกตัวอย่างเรื่องบ้าน กับ รถ แล้วน่ะ แต่เป็น กระดุม เข้าเรื่องดีกว่า

เรื่องของคลาสมันเป็นเรื่องยาว ทฤษฎี อ่านแล้วงง ฟังจบแล้วทึ่ง เลยต้องทำเป็นตอน ๆ แบบ StarWar ต้องเอาตอนจบไว้ภาคแรก ๆ แล้วค่อยย้อนกลับไปอดีต บทความนี้ก็เหมือนกัน เอาตอนจบไว้ภาคแรกเลย เพื่อให้เห็นภาพที่เราจะย้อนไปจุดเริ่มต้นได้

เวลาเราสร้างฟอร์ม เราต้องลาก โน่น ลาก นี่จาก Toolbox มาวาง เช่น ลาก TextBox หรือ Button มาวาง ดังภาพ

























สิ่งต่าง ๆ ที่อยู่ใน Toolbox ที่เราลากมา เราจะเรียกมันว่า เบสคลาส (base class) ซึ่งเป็นต้นเรื่องของทุกสิ่ง แต่ไอ้ตัวตนเรื่องนี่สิ มันทำให้เกิดเรื่อง(นี้) ตอนมันอยู่ดี ๆ ใน toolbox มันเป็น คลาส แต่พอลากมาวาง มันกลายเป็นออบเจกต์ (object) หรือภาษาไทยเรียกว่าวัตถุ แต่เนื่องจาก Microsoft เป็นบริษัทช่างคิด คิดหลายตลบ สรุป คิดให้คลาสที่ตัวเองสร้างขึ้นให้มันโง่ที่สุด โง่หรือไม่ดูที่ คลาส TextBox ที่สร้างขึ้นมา มันโง่สิ้นดี ความโง่อันดับแรกคือกด Enter แล้วจะให้มันออกจาก TextBox ก็ไม่ได้ ดันให้ใช้ปุ่ม tab ตานี้ต้องมาเป็นหน้าที่ของคนเขียนโปรแกรมเขียนยัดใส่ไว้ว่า ถ้ากดปุ่ม Enter ใน textbox ตัวนี้เมื่อไหร่ ให้ส่งคำสั่ง tab ไปเพื่อเลื่อนไปช่องถัดไป
เอาล่ะหว่า ฟอร์มแต่ละฟอร์ม มี TextBox เป็นสิบ (ยังไม่นับคลาสตัวอื่นที่เอามาสร้างอีกเป็นกระบุง) เขียนคำสั่งกันตาเหลือกแน่ แต่เรากำลังกล่าวถึง OOP (วิธีการเขียนโปรแกรมแนวบ้านกับรถ) ซึ่งคลาสนั้นจะมีคุณสมบัติสืบทอด (inheritance) จากคลาสแม่แบบที่เราเรียกว่า base class ไปเป็นคลาสย่อย (sub class) หรือคลาสลูก แล้วลูกก็สามารถสร้างลูกต่อไปได้เรื่อย ๆ เฮ้อออ สรุปว่า งง อยู่ดี
กลับมาที่ตัวก่อเรื่อง คือ TextBox ถ้าเราต้องการให้มันรู้จักปุ่ม Enter ในการเลื่อนไปที่อื่น เราก็ต้องปฎิสนธิให้มันเพื่อให้มันเกิดลูกขึ้นมา กลายเป็น sub class ของ TextBox ตัวใหม่ สำหรับวิธีการปฎิสนธิมันเหรอมีขั้นตอน ดังนี้
1. เปิดโปรแกรม Visual Studio 20xx
2. ไปที่เมนู File -> New Project...
3. ที่หน้าต่าง New Project คลิกเลือกที่ Windows Forms Application แล้วที่ช่อง Name ใส่ชื่อเป็น myFirstClass แล้วคลิกปุ่ม OK (คลาสแรกของฉัน)
4. จากนั้นจะขึ้น ฟอร์ม มาให้เขาเขียนคำสั่ง ตอนนี้ไม่ต้องสนใจ ปล่อยมันไปก่อน
5. ไปที่เมนู Project เลือก Add Class... ก็ได้
6. ที่หน้าต่าง Add New Item ให้คลิกเลือก Class แล้วตรงส่วนของ Name ตั้งชื่อเป็น KTextBox แล้วคลิกปุ่ม Add ดังภาพ (ตัว K ย่อมาจาก Kasem)




















7. จะขึ้นหน้าต่างให้ป้อนคำสั่ง ให้ทำการป้อนคำสั่ง ดังนี้



Public Class KTextBox
Inherits System.Windows.Forms.TextBox
Private Sub OnTextBox_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles Me.KeyPress
If e.KeyChar = Chr(Keys.Enter) Then
SendKeys.Send("{TAB}")
End If
End Sub
End Class



8. ให้ไปที่เมนู Build > Build myFirstClass (ชื่อโปรเจกต์ที่เราตั้งขึ้นตอนแรก) หากไม่มี error อะไรเกิดขึ้น เราสร้างคลาสเสร็จแล้ว

9. กลับไปที่ Form1.vb ให้คุณดูที่หน้าต่าง Toolbox ไล่ดูให้ทั่วจะเห็น myFirstclass Components ที่เราสร้างขึ้นมา ให้คุณทำการลาก sub class ชื่อ KTextBox มาวางไว้ที่ฟอร์ม ดังภาพ
























10. จากนั้นกดปุ่ม F5 เพื่อสั่งให้ฟอร์มทำงาน ลองทดสอบดูโดยการกดปุ่ม enter ที่ textbox แต่ละตัว

เป็นอย่างไรบ้างการสืบทอดคลาส และวิธีการเรียกใช้งาน

อธิบายคำสั่ง

Public Class KTextBox -> สร้างคลาสชื่อ KTextBox

Inherits System.Windows.Forms.TextBox -> คลาสที่สร้างสืบทอดมาจากพ่อแม่มันคือ TextBox

ส่วน ล่างนี้คือ subroutine สำหรับตรวจสอบการกดปุ่ม

Private Sub OnTextBox_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles Me.KeyPress
If e.KeyChar = Chr(Keys.Enter) Then
SendKeys.Send("{TAB}")
End If
End Sub


การบ้าน ให้แก้ไขคลาส KTextBox โดยกำหนดให้ textbox ของเรามีค่าเริ่มต้นดังนี้
font เป็น Tahoma , size 10
width เป็น 100
height เป็น 22
(ใบให้นิดนึง มันเกี่ยวกับ constructor )

โชคดี มีคลาสใช้ ทำดูหลาย ๆ คลาส แล้วจะรู้ว่ามันไม่ใช่แค่บ้านกับรถ

เฉลยการบ้าน
ทำโดยการเพิ่ม constructor เข้าไปในคลาส ดังนี้

Public Class KTextBox
Inherits System.Windows.Forms.TextBox

Sub New()
Dim FontName As String = "Tahoma"
Dim FontSize As Integer = 10
Dim FS As New Font(FontName, FontSize, FontStyle.Regular)
Me.Font = FS
Me.Width = 100
Me.Height = 22
End Sub

Private Sub OnTextBox_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles Me.KeyPress
If e.KeyChar = Chr(Keys.Enter) Then
SendKeys.Send("{TAB}")
End If
End Sub
End Class


ไว้พบกันตอน Episode 2

10 กันยายน 2553

System Tray ด้วย VB.Net

บทความนี้เขียนมาก็เนื่องจาก วันดีคืนดี มีการปรับปรุงระบบอินเทอร์เน็ตที่องค์กรเพิ่มระบบป้องกันใหม่ นอกจากระบุตัวตนการใช้งาน ก็คือ TimeOut เมื่อไม่มีการใช้งานอินเทอร์เน็ตเกิน 5 นาที ก็จะตัดการทำงาน ทีนี้เวลาจะมาใช้ใหม่ก็ต้อง log in ใหม่ วัน ๆ ต้อง log in กันไม่รู้กี่รอบ
ปัญหามา ปัญญาเกิด ทำไงดีขี้เกียจ ก็เลยสร้างโปรแกรมเล็ก ๆ ฝังไว้ใน System Tray ให้มันหลอกเช็คไปที่เว็บไซต์ข้างนอกที่เป็นสากล จะได้กระตุ้นหลอกว่าข้ายังใช้งานอยู่น่ะ อย่ามาตัด TimeOut ฉัน
ก็เลยมี 2 งานมาอยู่ในบทความนี้ ประกอบด้วย System Tray แล้วก็ตรวจสอบ Internet Connection

เริ่มกันเลย

1. เปิดโปรแกรม Visual Studio 2008 (2005 หรือ 2010 ก็ได้) จากนั้น เลือกเมนู File ---> New Project ที่หน้าต่าง New Project เลือก Visual Basic เลือก Windows เลือก Windows Forms Application จากนั้นที่ช่อง Name ตั้งชื่อตามต้องการ สำหรับตัวอย่างนี้จะตั้งเป็น myTray แล้วคลิกปุ่ม OK

2. ไปที่ Toolbox
ลากคอนโทล Button มาวางไว้ที่ฟอร์ม กำหนด Properties -> Text พิมพ์ Minimize
ลากคอนโทล Label มาวางไว้ที่ฟอร์ม กำหนด Properties -> Text พิมพ์ ..กำลังตรวจสอบสัญญาณ..
ลากคอนโทล NotifyIcon มาวางไว้ที่ฟอร์ม กำหนด Properties -> Icon โดย หารูปไอคอนที่ต้องการ
ลากคอนโทล Timer มาวางไว้ที่ฟอร์ม

ตามภาพด้านล่าง















3. ดับเบิ้ลคลิกที่ฟอร์มว่าง ๆ แล้วป้อนคำสั่งดังนี้

















ถ้าอ่านไม่ออก ก็ Copy ตรงนี้ไปได้เลย

Public Class Form1
Dim nTimeCheck As Integer = 60 ' ตรวจสอบทุก nn วินาที
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Timer1.Interval = nTimeCheck * 1000
CheckConnect()
HideSysTray()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
HideSysTray()
End Sub
Private Sub NotifyIcon1_MouseDoubleClick( _
ByVal sender As System.Object, ByVal e As _
System.Windows.Forms.MouseEventArgs) _
Handles NotifyIcon1.MouseDoubleClick
ShowSysTray()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Timer1.Tick
CheckConnect()
End Sub
Private Sub CheckConnect()
If Me.IsConnectionAvailable() Then
Me.Label1.Text = "สถานะเชื่อมต่ออินเทอร์เน็ต"
Me.Label1.ForeColor = Color.Green
Else
Me.Label1.Text = "!!! อินเทอร์เน็ตขาดการติดต่อ !!!"
Me.Label1.ForeColor = Color.Red
End If
End Sub
Private Sub HideSysTray()
Me.Hide()
NotifyIcon1.ShowBalloonTip(3000, _
"สวัสดี อินเทอร์เน็ต", "by Kasami", ToolTipIcon.Warning)
Me.WindowState = FormWindowState.Normal
End Sub
Private Sub ShowSysTray()
Me.Show()
Me.WindowState = FormWindowState.Normal
End Sub
Private Function IsConnectionAvailable() As Boolean
'Call url
Dim url As New System.Uri("http://www.google.com/")
'Request for request
Dim req As System.Net.WebRequest
req = System.Net.WebRequest.Create(url)
Dim resp As System.Net.WebResponse
Try
resp = req.GetResponse()
resp.Close()
req = Nothing
Return True
Catch ex As Exception
req = Nothing
Return False
End Try
End Function
End Class

จากนั้นก็ทำการเรียกฟอร์มให้ทำงาน (Start Debug)

โชคดี กับ System Tray

07 กันยายน 2553

เทียบคำสั่ง VB.Net กับ VFP

Form Event

เช็คปุ่มฟังก์ชันคีย์บนฟอร์ม
VFP
1. ที่ Form Property กำหนด KeyPreview = .T.
2. ที่ ฟอร์มอีเวนต์ ชื่อ KeyPress เมื่อกดปุ่ม F5 แล้วให้ปุ่มคำสั่ง cmdExec ทำการประมวลผล
และ ปุ่ม ESC ให้ออกจากฟอร์ม

&& Form.KeyPress Event
DO CASE
CASE nKeyCode = -4
ThisForm.cmdExec.SetFocus()
ThisForm.cmdExec.Click()
CASE nKeyCode = 27
ThisForm.Release
ENDCASE


VB.Net
1. ที่ Form Property กำหนด KeyPreview = true
2. ที่ ฟอร์มอีเวนต์ ชื่อ KeyUp เมื่อกดปุ่ม F5 แล้วให้ปุ่มคำสั่ง cmdExec ทำการประมวลผล และ ปุ่ม ESC ให้ออกจากฟอร์ม

Private Sub Form1_KeyDown( _
ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs _
) Handles MyBase.KeyDown 'แก้จาก Me.KeyDown - เป็น - MyBase.KeyDown
Select Case e.KeyCode
Case Keys.F5
Me.btnExec.Focus()
Me.btnExec.PerformClick() ' VFP ใช้ Click() เฉย ๆ
Case Keys.Escape
End 'exit
End Select
End Sub
"I Believe in You"

Copyright(c) 2007 - 2022 by Kasem Kamolchaipisit.