วิชวลสตูดิโอ ดอทเน็ต (Visual Studio .NET)

ปรับปรุง : 2556-01-16 (เพิ่ม ftpgetfile)
ข้อมูลทั้งหมดเกี่ยวกับวิชวลสตูดิโอดอทเน็ต ได้จากการอ่าน ทดสอบ และใช้เวลาไปมากมายในแต่ละเรื่อง ..
ไม่มีเรื่องใดได้จากการนั่งทางใน .. แม้พยายามนั่งแล้วก็ตาม ..
ถ้าเป็นไปได้ช่วยคัดลอก (Copy) ทุกอย่างที่ผมเขียนไปเผยแพร่ต่อด้วย .. จะได้ลดเวลาในการค้นหา และทดสอบ
Microsoft Visual Studio 2010 Professional คือ สภาพแวดล้อมแบบบูรณาการ ที่รวมงานพื้นฐาน ได้แก่ การสร้าง การแก้ไข การเผยแพร่ ซึ่ง VS2010 ช่วยให้จินตนาการจากความคิดกลายเป็นเรื่องจริง
.NET Framework คือ โมดูลการโปรแกรมของไมโครซอฟท์ที่ครอบคลุม การสร้างโปรแกรมประยุกต์ได้อย่างสวยงาม ต่อเนื่อง ปลอดภัย และสามารถใช้งานได้ในภาคธุรกิจ ซึ่ง .NET Framework 4 เข้ากันได้กับรุ่นก่อนหน้านี้ และรองรับโปรแกรมประยุกต์ที่เคยพัฒนาไว้แล้ว

แนะนำเว็บ (Web Guides)
+ new operator (Visual Basic) : vs 2010
+ http://www.microsoft.com/en-us/download/details.aspx?id=2890
+ http://www.thaiall.com/vsnet/newinstall
+ http://www.thaiall.com/vbnet
+ http://www.thaiall.com/aspnet
+ http://www.thaiall.com/vb
+ http://www.thaiall.com/teachaccess
+ สอน VB http://vbproject.net63.net/Lesson/Lesson1/Lesson1.html
Reference : รายการ String Functions (Visual Basic)

ภาพวิธีเพิ่ม Tool ตัวใหม่ใน Toolbox

XAMPP คือ โปรแกรมช่วยติดตั้ง apache webserver, mysql และ phpmyadmin ทำให้เครื่องคอมพิวเตอร์เปิดให้บริการระบบฐานข้อมูล และใช้ phpmyadmin เข้าบริหารจัดการ แล้วใช้สนับสนุนการเขียนโปรแกรมด้วย Visual Basic .NET โดยเชื่อมโยงระบบฐานข้อมูลผ่าน MySQL Connection .net [#] ที่สามารถดาวน์โหลด (Download) ชุดติดตั้ง control จาก mysql.com แล้วเรียกใช้ control หรือ library เหล่านั้นใน Vistual Studio .NET
+ ตัวอย่าง solution ที่ดึง mysql มาทำงานใน datagridview 463 KB

Console Application : time
การจับเวลาด้วย Now.Ticks
1. วัตถุประสงค์ คือ หาเวลาที่ถูกใช้ระหว่างประมวลผลของเครื่อง 2. now.ticks บอกเวลาปัจจุบันมีหน่วยเป็น nano seconds 3. datetime คืนค่าเวลาปัจจุบันในรูปแบบที่ต้องการ MMM Three-letter month. ddd Three-letter day of the week. d Day of the month. HH Two-digit hours on 24-hour scale. mm Two-digit minutes. yyyy Four-digit year. 4. ค่าของ 1 millisecond (หนึ่งในพันวินาที) = 10000 ใน ticks 5. รูปแบบวันที่ (วันเดือนปี) ต้องตรงกับใน regional and language http://www.java2s.com/Tutorial/VB/0100__Date-Time/NowTicks.htm http://www.dotnetperls.com/datetime-format-vbnet
Console Application : Dateadd and FileSystemObject
การเขียน-อ่าน Text file โดยใช้ข้อมูลวันที่ที่เพิ่มขึ้น
1. วัตถุประสงค์ คือ หาทำงานกับ text file และข้อมูลวันที่ 2. การทำงานกับ CreateObject("Scripting.FileSystemObject") ที่เป็น VB Script 3. สร้างแฟ้มด้วย CreateTextFile Method 4. อ่านแฟ้มด้วย OpenTextFile Method 5. เพิ่มวันที่ด้วย DateAdd http://code.function.in.th/vb6/datetime http://msdn.microsoft.com/en-us/library/sheydkke%28v=vs.84%29.aspx
Console Application : give & get value with function
การเขียน function ใน console application บน VS 2010 อย่างง่าย
1. วัตถุประสงค์ คือ การแปลงเลขฐานที่ต้องการเป็นเลขฐานสิบ 2. เนื้อหาที่เกี่ยวข้อง 2.1 ระดับของตัวแปรมี 4 ระดับ ตัวอย่างนี้แสดงการทำงานของตัวแปร 2 ระดับ 2.2 การผ่านค่าไปยัง function มี byval และ byref 2.3 console application จะมี default method คือ sub main ใน method1 2.4 function numtodec ถูกสร้างให้ทำงานแยกอิสระจาก main 2.5 มีการเรียกใช้ method ของ math และ string http://msdn.microsoft.com/en-us/library/system.math.pow.aspx 3. ขนาดแฟ้ม แบบ Debug โปรแกรมมีขนาด consoleapplication1.exe มีขนาด 15,872 bytes แบบ Release โปรแกรมมีขนาด consoleapplication1.exe มีขนาด 11,776 bytes + numtodec.zip 88 KB
Console Application : memory in GC
display memory in Garbage Collection
1. วัตถุประสงค์ คือ การแปลงเลขฐานที่ต้องการเป็นเลขฐานสิบ 2. เนื้อหาที่เกี่ยวข้อง 2.1 ใช้ GC.GetTotalMemory(True) แสดงค่า memory ที่ถูกใช้ 2.2 ใช้ตัวแปร String เก็บค่า และสั่งเพิ่มค่าผ่าน method ใน class 2.3 ใช้ .length นับตัวอักษรในตัวแปร String
Console Application : thread in garbage collection
working with gc.collect and thread
Console Application : function call another function
2 module ใน module1.vb
1. วัตถุประสงค์ คือ การแปลงเลขฐานสิบเป็นฐาน 2 - 16 2. เนื้อหาที่เกี่ยวข้อง 2.1 การส่งค่ากลับแบบ csv สามารถใช้ split แยก และเรียกใช้เขตข้อมูลที่ต้องการ 2.2 operator / จะใช้ double รับค่าทศนิยมได้ ส่วน \ จะคืนผลหารที่ไม่มีค่าเศษ 2.3 การประกาศตัวแปรชื่อ sum ใน 2 function จะมีขอบเขตของตนเอง 2.4 โปรแกรมที่ release แล้วนำไปใช้ได้ คือ dectonum.exe 3. เงื่อนไข 3.1 ชื่อ module ใน application ต้องไม่ซ้ำกัน 3.2 แฟ้ม module1.vb อาจมี module ภายในได้หลายโมดูล 3.3 เขียนแบบ module แล้วไม่สามารถกำหนด type เป็น class library
Console Application : webrequest & filestream
ติดต่อแฟ้มจากอินเทอร์เน็ต แล้วเขียนลงแฟ้ม
1. วัตถุประสงค์ คือ อ่านแฟ้มจากเว็บเพจ แล้วเขียนลงเครื่อง 2. เนื้อหาที่เกี่ยวข้อง 2.1 ใช้ webrequest ติดต่ออ่านข้อมูลเข้ามาครั้งละ 1000 bytes 2.2 read เท่าที่อ่านได้ หากพบอักษรพิเศษก็จะหยุด แล้วค่อยอ่านต่อ 2.3 ใช้ filestream เขียนลงเครื่อง 2.4 หากอ่าน html มาเก็บแล้ว จะใช้ FileStream แบบ FileMode.Open อ่านมาใช้ได้ก็ได้ 3. อ้างอิงจาก http://www.thaiall.com/vbnet/requestwebimage.htm
Windows Forms Application : webrequest & filestream in form
เลือกเว็บเพจ แล้วดาวน์โหลดภาพทั้งหมด มาเขียนลงเครื่อง
1. วัตถุประสงค์ คือ อ่านแฟ้มจากเว็บเพจ แล้วเขียนลงเครื่อง 2. เนื้อหาที่เกี่ยวข้อง 2.1 ทำงานกับ windows forms 2.2 อ่านมาเขียนเป็น text file ลงเครื่อง 2.3 แยกลิงค์ของภาพเข้า textbox 2.4 อ่านภาพจาก textbox ทีละบรรทัด 3. อ้างอิง loadweb.rar + .exe
Windows Forms Application : env in listview
การแสดงค่าจาก environment ใน listview ที่สร้างใน runtime
1. วัตถุประสงค์ คือ แสดงการเรียกใช้ตัวแปรระดับ environment และการทำงานกับ listview
2. การทำงานกับ listView
- Dim listView1 As New ListView()
- listView1.Bounds = New Rectangle(New Point(10, 10), New Size(600, 400))
- listView1.View = View.Details
- listView1.Columns.Add("id", -2, HorizontalAlignment.Left)
- listView1.Columns.Add("name", -2, HorizontalAlignment.Left)
3. เตรียม item ส่งเข้า listview
- item1 = New ListViewItem(i.ToString, 0)
- item1.SubItems.Add(Environ(i).Split("=")(0))
- item1.SubItems.Add(Environ(i).Split("=")(1))
- listView1.Items.AddRange(New ListViewItem() {item1})
- Me.Controls.Add(listView1)
+ download solution + setup การทำงานกับ listview 463 KB
Windows Forms Application : runtime + listview + environ
การควบคุม listview 2 objects และ runtime design
ขอบเขตของตัวแปรมี 4 ระดับ คือ environment, form, local, block
- กำหนดตัวแปร environment ได้ที่ control panel, system, advanced, environment variables
- listview in runtime design
- new() คือ constructor ของคลาส
Windows Forms Application : mysql in datagridview
การอ่านข้อมูล mysql ด้วย connector ใส่ datagridview
1. install xampp for mysql & phpmyadmin 2. install mysql-connector-net-6.5.4.msi 3. right click on Toolbox & choose Items ... 4. check in .NET Framework Components
    - MySqlCommand - MySqlConnection - MySqlDataAdapter
5. paste Mysqlconnection control on form1 6. paste DataGridView control on form1 7. code guide in Form1.vb
    Imports MySql.Data.MySqlClient Dim conn = New MySqlConnection conn.ConnectionString = ... Dim cmd, adt, mydata, sql .. for MySqlCommand, MySqlDataAdapter, DataTable conn.Open() try .. catch .. cmd.Connection = conn cmd.CommandText = sql adt.SelectCommand = cmd adt.Fill(mydata) DataGridView1.DataSource = mydata conn.Close()
+ sample code from vbnet/upd_mysql_connect.htm + download solution + setup 463 KB
Windows Forms Application : mysql in inputbox
การอ่านข้อมูล mysql แสดงใน msgbox + inputbox
- inputbox () 
- msgbox ()
- try .. catch ..
- MySqlDataReader 
- ExecuteReader()
Windows Forms Application : webbrowser + command + runtime + instance
Web browser แบบมีปุ่ม และ textbox รับ address
- work in runtime with instance
- control by command button
- form_load to close form
Console Application : wininet.dll
การใช้ ftpgetfile คัดลอกแฟ้มจาก ftp server มาวางในเครื่อง remote
1. วัตถุประสงค์ คือ การเรียกใช้ฟังก์ชัน ftpgetfile จาก wininet.dll 2. เนื้อหาที่เกี่ยวข้อง 2.1 เป็นการทำงานใน console application ร่วมกับ class 2.2 แบ่งเป็น function และ sub โดย sub ใช้กำหนดค่า 2.3 กำหนด Overridable set_var จะได้ปรับได้ 2.4 get_file สามารถถูกทำ overload ได้ 2.5 ให้ติดตั้ง xampp, start ftp server, create user 2.6 202.44.204.24 = ftp.nectec.or.th 2.7 เทคนิคนี้จะรับแฟ้มมารอบเดียว ไม่ผ่าน buffer
Console Application : FTPWebRequest : FTP.Uploadfile
การใช้ upload แฟ้มจาก local ไปวางในเครื่อง remote
1. วัตถุประสงค์ คือ การเรียกใช้ FTPWebRequest upload แฟ้มจาก FTP Server 2. เนื้อหาที่เกี่ยวข้อง 2.1 ใช้เฉพาะ module ใน console application 2.2 ใช้ตัวแปรรับค่า ก่อนส่งให้กับแต่ละฟังก์ชัน 2.3 ไม่แสดงผลเมื่อ upload ได้ 2.4 ให้ติดตั้ง xampp, start ftp server, create user 2.5 account ต้องเป็นแบบ write ได้ 2.6 จำกัด 2 แฟ้มในการอัพ ถ้าไม่กำหนด ConnectionLimit
Console Application : FTP.Downloadfile แบบที่ 1 เรียกใน main
การ download แฟ้มผ่าน FTPWebRequest
1. วัตถุประสงค์ คือ การเรียกใช้ FTPWebRequest download แฟ้มจาก FTP Server 2. เนื้อหาที่เกี่ยวข้อง 2.1 ทดสอบกับ nectec 2.2 กำหนดตัวแปรแบบ const และ using 2.3 using คู่กับ end using จะทำการ dispose วัตถุอัตโนมัติ หลัง end using
Console Application : FTP.Downloadfile แบบที่ 2 เรียกผ่าน class
การ download แฟ้มผ่าน FTPWebRequest
1. วัตถุประสงค์ คือ การเรียกใช้ FTPWebRequest download แฟ้มจาก FTP Server 2. เนื้อหาที่เกี่ยวข้อง 2.1 ทดสอบทั้งใน local และ nectec 2.2 ตัวแปรส่ง 2 แบบคือผ่าน function และผ่าน constructor 2.3 ตรวจจับความผิดพลาดด้วย try .. catch .. 2.4 แสดงความก้าวหน้าในการ download ด้วยเครื่องหมาย # 2.5 ในเครื่อง local ทดสอบด้วย xampp ที่เปิด ftp server
Console Application : FTPWebRequest : ListDirectoryDetails
การแสดงรายชื่อแฟ้มใน FTP Server
1. วัตถุประสงค์ คือ การแสดงรายชื่อแฟ้ม 2. เนื้อหาที่เกี่ยวข้อง 2.1 ใช้ ListDirectoryDetails ซึ่งละเอียดกว่า ListDirectory ที่แสดงเฉพาะชื่อ 2.2 ทดสอบกับ ftp://ftp.nectec.or.th 2.3 http://www.thaiall.com/learn/useftp.htm
Console Application : FTPWebRequest : ListDirectory
การแสดงรายชื่อแฟ้มจาก FTP server
1. วัตถุประสงค์ คือ การเรียกใช้ system.net และ system.io 2. เนื้อหาที่เกี่ยวข้อง 2.1 WebRequestMethods.Ftp.ListDirectory และ list 2.2 การทำงานกับ List Object 2.3 ใช้ Constructor 2.4 ใช้ for each lst In mylist กับ array แบบ list
Class Library & Private Assembly : to create myclass.dll
การสร้าง .dll เพื่อใช้ในการพัฒนาโปรเจ็กต์ p.101
1. สร้าง private assembly โดยสร้าง class library
2. พิมพ์ code ตามตัวอย่าง
3. menubar, file, save all project ใน folder ที่กำหนด
4. ได้ assembly name เป็น classlibrary1 หรือเปลี่ยนก็ได้
5. menubar, build, configuration manager กำหนดให้ configuration เป็น release
6. menubar, build, rebuild จะได้แฟ้ม .dll ในห้อง release

การเรียกใช้ .dll
1. สร้าง Windows Forms Application
2. right click บน solution name & click Add Reference
3. เลือกแฟ้ม myclass.dll จะพบชื่อ myclass ใน references หาก Show All Files
4. ใน view code ของ form สามารถ import namespace ใน myclas.dll ได้แล้ว
5. เรียกใช้ method ใน class ได้เช่นกัน
StructureProperty, GET, SET for private object [6]p.47

หัวข้อ
- class library แสดงการควบคุม property ของตัวแปร v
- การเรียกใช้ตัวแปร v ต้องดำเนินการผ่าน method (ยกเว้นตัวอย่างนี้)
- ส่วนขยายแบบ property คู่กับ get และ set
- ตัวอย่างนี้ไม่มีการประมวลผลก่อนรับ และคืนค่า
- หากมีคลาสอื่นเรียกใช้ v ต้องเรียกผ่าน pub_v เท่านั้น
Public Class Class1
    Private v As Integer
    Shared Sub main()
        Dim c As New class1
        With c
            .v = 11
        End With
        Console.Write(c.v)
        Console.Read()
    End Sub

    Public Property pub_v() As Integer
        Get
            Return v
        End Get
        Set(ByVal value As Integer)
            v = value
        End Set
    End Property
End Class
StructureProperty, GET, SET in Windows Forms Application [6]p.47

หัวข้อ
- การเรียกใช้ v แบบ private ผ่าน namespace ClassLibrary1
- ต้องเรียกใช้ pub_v เพื่อให้เข้าถึง v
Imports ClassLibrary1
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, 
    ByVal e As System.EventArgs) Handles MyBase.Load
        Dim c As New Class1
        With c
            .pub_v = 11
        End With
        MsgBox(c.pub_v)
    End Sub
End Class
Structureconstructor with 2 class in 1 source code of console application [6]p.269
- การเรียกใช้ class ใน namespace เดียวกัน โดยเขียน 2 class ภายในแฟ้มเดียวกัน

หัวข้อ
- การเรียกใช้ instance จาก class
- การเปิดพื้นที่ในหน่วยความจำแยกกัน
- ถ้าเปลี่ยน v1 เป็น shared จะทำให้ค่ามาจากตำแหน่งเดียวกัน
- ผลคือ ค่าของ my_v.v1 และ c.v1 จะเป็นค่าเดียวกัน
Public Class Class1
    Shared my_v As New second_class
    Shared Sub main()
        Dim c As New second_class
        c.v1 = 6
        Console.Write(c.v1) '6
        Console.Write(my_v.v1) '5
        Console.Write(second_class.v2) '0
        Console.Read()
    End Sub
End Class

Public Class second_class
    Public v1 As Integer
    Public Shared v2 As Integer
    Public Sub New()
        v1 = 5
    End Sub
End Class
Structureinherits, overload, shared in console application [6]p.209
- การสืบทอด (inherite) ต่อกัน 3 รุ่น ของ 3 คลาส โดยทำงานใน console application

หัวข้อ
- ปู่มี 1 sub และ 1 function
- พ่อทำการ overload method ของปู่
- ลูกสืบทอดจากปู่ แต่เรียกใช้ของพ่อ

งานมอบหมาย : จงเขียนโปรแกรม 1) สร้างคลาส a ที่มี function และ sub โดย function ทำหน้าที่บวกเลข 2 ค่าที่รับมา และ sub พิมพ์ 1 - 10 2) สร้างคลาส b สืบทอดจากคลาส a โดย overload sub ให้พิมพ์ 1 - 20 3) สร้างคลาส c เรียกใช้ function และ sub โดยแสดงการใช้งาน property ผ่าน get และ set กับตัวแปร z ที่กำหนดในคลาส a
Public Class Class1
    Inherits grand_father ' ถ้าตรงนี้เป็นพ่อจะให้ผลต่างออกไป
    Shared Sub main()
        Dim g As New grand_father
        Dim f As New father
        Console.Write(g.my_v()) ' 10
        Console.Write(f.my_v()) ' 11
        g_sub() '12
        Console.Read()
    End Sub
End Class

Public Class father
    Inherits grand_father
    Public Overloads Function my_v() As Integer
        Return 11
    End Function
End Class

Public Class grand_father
    Private v As Integer
    Public Function my_v() As Integer
        v = 10
        Return v
    End Function
    Shared Sub g_sub()
        Console.Write(12)
    End Sub
End Class
Structureuse 2 class library of inheritance
Imports ClassLibrary1 ' add reference required
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim g As New grand_father
        Dim f As New father
        MsgBox(g.my_v() & f.my_v()) ' 1011
        grand_father.g_sub() '12
    End Sub
End Class
+ winapp_call_grandfather.zip 96 KB 
(มี solution ของ windows forms application และ .dll 2 แฟ้ม คือ grand_father.dll + father.dll)
Root namespace: Classlibrary1 Project name: grand_father Solution name: grand_father Class name: grand_father
Root namespace: Classlibrary1 Project name: father Solution name: father Class name: father 
Structure grand, father, child in console & windows forms application
- การเขียนโปรแกรมเพื่อแสดงการสืบทอดแบบต่าง ๆ ตั้งแต่ระดับปู่ ไปถึงลูก แล้วนำไปสืบทอดต่อใน form

หัวข้อ
- ปู่มี function, sub และ Property
- instance มีแบบ private และ public
Public Class Mygrand
    Private g1 As Integer
    Public g2 As String
    Public Function cntg(ByVal x As String) As String
        g2 = CStr(Len(x))
        Return g2
    End Function
    Public Sub setg()
        exg1 = 1
        g2 = "two"
    End Sub
    Public Property exg1() As Integer
        Get
            If (g2 = "zero") Then Return 0 Else Return g1
        End Get
        Set(ByVal value As Integer)
            If (g2 = "two") Then g1 = 2 Else g1 = value
        End Set
    End Property
End Class
' mygrand.rar (source + .dll)

หัวข้อ
- พ่อสืบทอดจากปู่
- นำ sub มาทำ Overloads หรือเปลี่ยนการประมวลผล
Public Class Myfather
    Inherits mygrand_ns.Mygrand
    Public Overloads Sub setg()
        exg1 = 3
    End Sub
End Class
' myfather.rar (source + .dll)

หัวข้อ
- หลังสืบทอด รุ่นลูกก็ใช้ประโยชน์เต็มที่
- in_mychild เป็นการสร้าง class เพื่อ overload function
' add reference mygrand_as & myfather_as
Module mychild
    Sub Main()
        Dim nation As New mygrand_ns.Mygrand
        nation.exg1 = 7
        Console.Write(nation.exg1) ' 7
        Dim burin As New in_mychild
        burin.setg()
        Console.Write(burin.exg1) ' 3
        burin.g2 = "zero"
        burin.exg1 = 4
        Console.Write(burin.exg1) ' 0
        Console.Write(burin.cntg("two")) ' 2
        Console.Read()
    End Sub
End Module
Class in_mychild
    Inherits myfather_ns.Myfather
    Public Overloads Function cntg(ByVal x As String) As String
        Dim o As String = ""
        If (x = "one") Then o = "1"
        If (x = "two") Then o = "2"
        Return o
    End Function
End Class
' mychild.rar (source + .exe)

หัวข้อ
- สามารถทำ oveload ใน windows forms
- ตัวอย่างนี้ แยก class ออกมาจาก form1
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, 
    ByVal e As System.EventArgs) Handles MyBase.Load
        Dim myform As New in_form
        MsgBox(myform.cntg("three"))
    End Sub
End Class
Class in_form
    Inherits myfather_ns.Myfather
    Public Overloads Function cntg(ByVal x As String) As String
        Dim o As String = ""
        If (x = "one") Then o = "1"
        If (x = "two") Then o = "2"
        If (x = "three") Then o = "3"
        Return o
    End Function
End Class
Structureinherit, property, overrides, console application
- การควบคุมตัวแปรแบบ private และการใช้ sub และ function ทำงานร่วมกับ property

หัวข้อ
- นำโปรแกรมก่อนหน้านี้มาปรับให้มีเนื้อหา
- การ overload จะมีผลกับต่อลูก แต่ไม่มีผลย้อนกลับต่อปู่
- การ override จะมีผลย้อนกับต่อปู่ที่สืบทอดมาด้วย
งานมอบหมาย : จงเขียนโปรแกรมสืบทอด checkid54 โดย checkid55 โดยผลการสืบทอดให้ทำ override ฟังก์ชัน check_admin ที่กำหนดรหัสผ่านในโปรแกรม จากเดิม "pass" เป็นใหม่ "nation" ซึ่ง checkid54 มี instance 2 ตัว คือ admin_password เป็น public ใช้เก็บค่ารหัสผ่านที่ผู้ใช้ส่งไปตรวจสอบ และ id เป็น private เข้าถึงได้เฉพาะ property ex_id ซึ่งการ get จะต้องตรวจว่ารหัสผ่านถูกต้องหรือไม่ ผ่าน function check_admin หากถูกต้องก็ส่งค่าจาก id ให้กับผู้ร้องขอ และ set จะต้องตรวจว่ารหัสผ่านถูกต้องหรือไม่ก่อน แล้วตรวจว่ารหัสที่รับเข้ามา 7 หลัก หรือไม่ หากเป็น 7 หลัก และรหัสอยู่ระหว่าง 47 - 54 ให้เปลี่ยนค่า id ตามค่า get_id แต่ถ้าค่าไม่อยู่ระหว่าง 47-54 ให้เปลี่ยนค่า id เป็น 5400000 หากไม่เป็น 7 หลักจะคืนค่า 5499999 และส่วนเรียกประมวลผลให้ใช้ code ดังนี้
Dim chk As New checkid55
chk.set_pass_admin("nation")
chk.ex_id = 5401001
Console.Write(chk.ex_id) ' 5401001
Module Module1
    Sub Main()
        Dim chk As New checkid55
        chk.set_pass_admin("nation")
        chk.ex_id = 5401001
        Console.Write(chk.ex_id)  ' 5401001
        Console.ReadLine()
    End Sub
End Module

Public Class checkid54
    Private id As Integer
    Public admin_password As String
    Public Overridable Function check_admin() As Boolean
        If (admin_password = "pass") Then Return True Else Return False
    End Function
    Public Sub set_pass_admin(ByVal pass As String)
        admin_password = pass
    End Sub
    Public Property ex_id() As Integer
        Get
            If (check_admin()) Then Return id Else Return 0
        End Get
        Set(ByVal get_id As Integer)
            If (check_admin()) Then
                Dim id12 As Integer = CInt(Mid(CStr(get_id), 1, 2))
                If (Len(CStr(get_id)) = 7) Then
                    If (id12 >= 47 And id12 <= 54) Then
                        id = get_id
                    Else
                        id = 5400000
                    End If
                Else
                    id = 5499999
                End If
            End If
        End Set
    End Property
End Class

Public Class checkid55
    Inherits checkid54
    Public Overrides Function check_admin() As Boolean
        If (admin_password = "nation") Then Return True Else Return False
    End Function
End Class
Structureabstract, overloads, overrides, overridable
- การประกาศ class แบบที่ยังไม่มี code หรือมี code ไม่สมบูรณ์ และจำเป็นต้องเขียน code ภายหลัง

หัวข้อ
- abstract หรือ mustinherit ระบุว่า class มี method ที่ไม่มี code
- MustOverride ใช้ระบุว่าเป็น method ที่จะต้องเขียน code ภายหลัง
- Overridable ใช้ระบุว่าเป็น method ที่อาจต้องเขียน code ใหม่
- Overrides ใช้เขียน code ให้ method ที่ประกาศเป็น overridable
- Overloads ใช้เขียน code ทับ method ที่มี code แล้ว
- การ inherits ความสัมพันธ์ของพ่อกับลูกเรียกว่า is-a relationship
- การ implements interface ความสัมพันธ์ของพ่อกับลูกเรียกว่า has-a relationship
[6]p.352 is-a, has-a relationship
Module Module1
    Sub Main()
        Dim w1 As New work3
        Console.Write(w1.x1 + w1.f1() + w1.f2())
        Console.Read()
    End Sub
End Module

Class work3
    Inherits work2
    Public Overrides Function f1() As Integer
        Return 3
    End Function
    Public Overrides Function f2() As Integer
        Return 2
    End Function
    Public Overloads Function f3() As Integer
        Return 4
    End Function
End Class

MustInherit Class work2
    Inherits work1
    Public x1 As Integer = 4 ' dim = private
End Class

MustInherit Class work1
    Public MustOverride Function f1() As Integer
    Public Overridable Function f2() As Integer
        Return 1
    End Function
    Public Function f3() As Integer
        Return 2
    End Function
End Class
Structureoverrides, overloads
- การแทนที่ method หลังสืบทอด หรือเปลี่ยนให้สามารถรับได้หลายรูปอย่าง polymorphism

หัวข้อ
- father สืบทอดจาก grand_father
- father ทำทั้ง overloads และ overrides
- ถ้ารับค่าเป็นเลขบ้าง อักษรบ้าง ผสมกันบ้าง ก็รับไหว
Module Module1
    Sub Main()
        Dim child As New father
        child.getnum(100, "sombat", "panu")
        child.getnum(100, "sombat")
        child.getnum(100)
        Console.ReadLine()
    End Sub
End Module
Class father
    Inherits grand_father
    Overloads Sub getnum(ByVal num As Integer, ByVal name As String, ByVal lastname As String)
        Console.WriteLine(name & " " & lastname & " " & num)
    End Sub
    Overloads Sub getnum(ByVal num As Integer, ByVal name As String)
        Console.WriteLine(name & " " & " " & num)
    End Sub
    Overrides Sub getnum(ByVal num As Integer)
        Console.WriteLine("number is " & num)
    End Sub
End Class
Class grand_father
    Overridable Sub getnum(ByVal num As Integer)
        Console.Write(num)
    End Sub
End Class
Structureoverrides, overloads
- การรับและส่งค่ากับฟังก์ชันที่มีการสืบทอด และทำงานกับ override และ overload

หัวข้อ
- split ด้วย space
- overrides ต้องกำหนด overridable ไว้ก่อน
- overloads จะเป็นการแทนที่ หรือปรับ parameter
งานมอบหมาย :
จงเขียนโปรแกรมใน console application รับข้อมูลจากแป้นพิมพ์ โดยรอบแรกรับชุดตัวอักษร เป็นชื่อ และสกุล เข้า 2 ตัวแปร แล้วส่งให้ function getv ทำหน้าที่แสดงผล แบบรวมบรรทัดเดียว แล้วรอบสองรับชุดตัวอักษร โดยเป็นตัวเลข 2 จำนวนแบบเว้นด้วยช่องไฟเข้า 1 ตัวแปร แล้วส่งให้ function getv ทำหน้าที่บวกกันแล้วแสดงผล ก่อนปิดการทำงานของโปรแกรมให้พิมพ์ชื่อผู้เขียนที่ผ่าน inherite โดยเรียก sub mycredit และ function getv ให้เข้ามาใน module ผ่านการสืบทอด
กำหนดให้ 1) getv ในรอบแรกเป็นของ class mycal54 รับค่าชุดตัวอักษรเข้า 2 ตัวแปร 2) getv ในรอบที่สองเป็นของ class mycal55 รับ 2 จำนวนเข้า 1 ตัวแปร 3) mycredit ใน class mycal54 มีชื่อ burin แต่จะไม่ถูกเรียกใช้ หลังถูกสืบทอด 4) mycredit ถูก override ใน class mycal55 โดยมีชื่อของท่านแทนชื่อที่กำหนดก่อนหน้านี้
Module Module1
    Sub Main()
        Dim g As New mycal55
        Dim name As String, surname As String
        name = Console.ReadLine()
        surname = Console.ReadLine()
        Console.WriteLine(g.getv(name, surname))
        Dim t As String
        t = Console.ReadLine()
        Dim var1 As Integer, var2 As Integer
        var1 = CInt(t.Split(" ")(0))
        var2 = CInt(t.Split(" ")(1))
        Console.WriteLine(g.getv(var1, var2))
        g.mycredit()
        Console.ReadLine()
    End Sub
End Module
Class mycal55
    Inherits mycal54
    Overloads Function getv(ByVal i1 As Integer, ByVal i2 As Integer)
        Return i1 + i2
    End Function
    Overrides Sub mycredit()
        Console.WriteLine("nation")
    End Sub
End Class
Class mycal54
    Function getv(ByVal s1 As String, ByVal s2 As String)
        Return s1 & " " & s2
    End Function
    Overridable Sub mycredit()
        Console.WriteLine("burin")
    End Sub
End Class

Structureoverrides, overloads กับ tostring method
- การทำ overrides กับ method ของระบบ

หัวข้อ
- ปกติเราใช้ tostring อยู่แล้ว
- หากจะทำ override กับ tostring ก็สามารถทำได้
Module Module1
    Sub Main()
        Dim data As New work
        data.n = "แดง"
        data.s = "ทองดี"
        Console.WriteLine(data.ToString())
        Console.WriteLine(data.ToString("คุณ"))
        Console.ReadLine()
    End Sub
End Module
Class work
    Public n As String
    Public s As String
    Public Overrides Function ToString() As String
        Return "นาย " & n & " " & s
    End Function
    Public Overloads Function ToString(ByVal k As String) As String
        Return k & n & " " & s
    End Function
End Class
Structureinterface
- ประกาศ interface ชื่อ person หากจะสร้างวัตถุพนักงานใหม่ ก็ต้องให้รายละเอียดเข้าไป เป็นการบังครับ

หัวข้อ
- interface ของบุคคลมี 2 หน้าที่
- เวลา implements ต้องกำหนดการศึกษากับความสามารถพิเศษ
- การ implements interface ความสัมพันธ์ของพ่อกับลูกเรียกว่า has-a relationship
ตัวอย่าง
- dbmgmt ต้องมี insert, delete, update, select
- sale ต้องมี proid, quan, price
Module Module1
    Sub Main()
        Dim boy As New sale
        Console.WriteLine(boy.education("business administration"))
        Console.WriteLine(boy.talent("speach in public"))
        Console.WriteLine(boy.have_experience("NTU 5 years"))
        Dim girl As New clerk
        Console.WriteLine(girl.education("accounting"))
        Console.WriteLine(girl.talent("certification in ms word"))
        Console.WriteLine(girl.car_driving("yes"))
        Console.ReadLine()
    End Sub
End Module
Interface person
    Function education(ByVal t As String) As String
    Function talent(ByVal t As String) As String
End Interface
Class sale
    Implements person
    Function education(ByVal t As String) As String Implements person.education
        Return t
    End Function
    Function talent(ByVal t As String) As String Implements person.talent
        Return t
    End Function
    Function have_experience(ByVal t As String) As String
        Return t
    End Function
End Class
Class clerk
    Implements person
    Function education(ByVal t As String) As String 
Implements person.education
        Return t
    End Function
    Function talent(ByVal t As String) As String Implements 
person.talent
        Return t
    End Function
    Function car_driving(ByVal t As String) As String
        Return t
    End Function
End Class
StructureGeneric of swapping [6]p.405
Public Class Class1
    Public Shared Sub main()
        Dim c As New Class1, x As Integer = 5, y As Integer = 6
        c.swapi(x, y)
        Console.Write(x & y) ' 65
        c.swapint(x, y)
        Console.Write(x & y) ' 56
        Dim a As String = "A", b As String = "B"
        c.swapint(a, b)
        Console.Write(a & b) ' BA
        Console.Read()
    End Sub
    Sub swapi(ByRef x As Integer, ByRef y As Integer)
        Dim z As Integer = x
        x = y : y = z
    End Sub
    Sub swapint(Of any_type)(ByRef x As any_type, ByRef y As any_type)
        Dim z As any_type = x
        x = y : y = z
    End Sub
End Class
Databasemysqlconnection, wampp, console, select one record => class, module, windows forms
' add reference C:\Program Files\MySQL\MySQL Connector Net 6.5.4\Assemblies\v4.0\MySql.Data.dll
' in xampp (99 MB), start mysql

1. ติดตั้ง xampp เพื่อเปิดบริการ mysql ได้พอร์ท 3306
2. ติดตั้ง MySQL Connector Net 6.5.4 เพื่อเชื่อมต่อกับ MySQL
3. add reference mysql.data.dll
C:\Program Files\MySQL\MySQL Connector Net 6.5.4
\Assemblies\v4.0\MySql.Data.dll
4. มีระบบฐานข้อมูล mysql ซึ่งมีข้อมูลพร้อมทดสอบ ได้แก่
db:mysql,tb:time_zone_name,fld:time_zone_id,name

5. ตัวอย่าง console application ที่ประมวลผลแบบ sub main ใต้ class
Imports MySql.Data.MySqlClient
Public Class selectone
    Private Shared conn As New MySqlConnection
    Private Shared cmd As New MySqlCommand
    Private Shared opt As String
    Public Shared Sub main()
        Console.WriteLine(select_zone(1000000))
        Console.WriteLine(select_zone(101))
        Console.WriteLine(select_zone(102))
        Console.Read()
    End Sub
    Public Shared Function select_zone(ByVal zid As Integer) As String
        Dim zname As String = "not found"
        Dim connstring As String = "server=127.0.0.1;user id=root;password=;"
        connstring &= "database=mysql;charset=tis620;"
        conn.ConnectionString = connstring
        cmd.Connection = conn
        conn.Open()
        cmd.CommandText = "select time_zone_id,name from time_zone_name "
        cmd.CommandText &= "where time_zone_id = " & zid
        Dim r As MySqlDataReader = cmd.ExecuteReader()
        If r.Read() Then zname = r(1)
        conn.Close()
        Return zname
    End Function
End Class

6. ตัวอย่าง console application ที่ประมวลผลแบบ sub main ใต้ module
ซึ่งแบบนี้ไม่ต้องกำหนดฟังก์ชันแบบ shared
Imports MySql.Data.MySqlClient
Module module1
    Sub main()
        Dim s As New selectone
        Console.WriteLine(s.select_zone(1000000))
        Console.WriteLine(s.select_zone(101))
        Console.WriteLine(s.select_zone(102))
        Console.Read()
    End Sub
End Module
Public Class selectone
    Private conn As New MySqlConnection
    Private cmd As New MySqlCommand
    Private opt As String
    Public Function select_zone(ByVal zid As Integer) As String
        Dim zname As String = "not found"
        Dim connstring As String = "server=127.0.0.1;user id=root;password=;"
        connstring &= "database=mysql;charset=tis620;"
        conn.ConnectionString = connstring
        cmd.Connection = conn
        conn.Open()
        cmd.CommandText = "select time_zone_id,name from time_zone_name "
        cmd.CommandText &= "where time_zone_id = " & zid
        Dim r As MySqlDataReader = cmd.ExecuteReader()
        If r.Read() Then zname = r(1)
        conn.Close()
        Return zname
    End Function
End Class

7. เปลี่ยน class ที่พัฒนาไปเป็นแบบ class library จะได้แฟ้ม selectone_as.dll
+ selectone_as.dll 12 KB

8. ตัวอย่าง console application แบบเรียกใช้จาก class library
จะต้อง add reference mysql.data.dll และ selectone_as.dll
Imports selectone_ns
Module Module1
    Sub Main()
        Dim s As New selectone
        Console.WriteLine(s.select_zone(1000000))
        Console.WriteLine(s.select_zone(101))
        Console.WriteLine(s.select_zone(102))
        Console.Read()
    End Sub
End Module

9. การทำงานกับ windows forms application
จะต้อง add reference mysql.data.dll และ selectone_as.dll
Imports selectone_ns
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object,
 ByVal e As System.EventArgs) Handles Button1.Click
        Dim s As New selectone
        TextBox1.Text = s.select_zone(102)
    End Sub
End Class
Databasemysqlconnection, wampp, console, select
' add reference C:\Program Files\MySQL\MySQL Connector Net 6.5.4\Assemblies\v4.0\MySql.Data.dll
' in xampp (99 MB), start mysql
Imports MySql.Data.MySqlClient
Public Class Class1
    Public Shared Sub main()
        Dim conn As New MySqlConnection
        conn.ConnectionString = "server=127.0.0.1;user id=root;password=;database=mysql"
        Dim cmd As New MySqlCommand
        cmd.Connection = conn
        cmd.CommandText = "select name,time_zone_id from time_zone_name"
        Dim s As String = ""
        conn.Open()
        Dim r As MySqlDataReader = cmd.ExecuteReader()
        While r.Read()
            s &= r(0) & r(1) & Chr(10) ' 685 records
            ' If r("time_zone_id") = 3 Then Exit While
        End While
        conn.Close()
        Console.Write(s)
        Console.Read()
    End Sub
End Class
Databaseselect, insert, delete, update in console
' add reference C:\Program Files\MySQL\MySQL Connector Net 6.5.4\Assemblies\v4.0\MySql.Data.dll
' in xampp, start mysql
Imports MySql.Data.MySqlClient
Public Class Class1
    Private Shared conn As New MySqlConnection
    Private Shared cmd As New MySqlCommand
    Private Shared opt As String
    Public Shared Sub main()
        conn.ConnectionString = "server=127.0.0.1;user id=root;password=;database=mysql;charset=tis620;"
        cmd.Connection = conn
        Console.WriteLine("sa,s,i,d,u of time_zone_id,name in time_zone_name")
        opt = Console.ReadLine()
        conn.Open()
        If opt = "s" Or opt = "sa" Then select_zone()
        If opt = "i" Then insert_zone()
        If opt = "d" Then delete_zone()
        If opt = "u" Then update_zone()
        conn.Close()
        Console.Read()
    End Sub
    Public Shared Sub select_zone()
        cmd.CommandText = "select time_zone_id,name from time_zone_name"
        Dim r As MySqlDataReader = cmd.ExecuteReader()
        Dim i As Integer = 1
        While r.Read()
            Console.WriteLine(r(0) & r(1)) ' 1684 records
            i = i + 1
            If i > 100 And opt <> "sa" Then
                Console.ReadLine()
                i = 1
            End If
        End While
    End Sub
    Public Shared Sub insert_zone()
        Dim zid As String = Console.ReadLine()
        Dim zname As String = Console.ReadLine()
        cmd.CommandText = "insert into time_zone_name (time_zone_id,name)values(" & zid & ",'" & zname & "')"
        Dim r As Integer = cmd.ExecuteNonQuery()
    End Sub
    Public Shared Sub delete_zone()
        Dim zid As String = Console.ReadLine()
        Dim zname As String = Console.ReadLine()
        cmd.CommandText = "delete from time_zone_name where time_zone_id = " & zid
        Dim r As Integer = cmd.ExecuteNonQuery()
    End Sub
    Public Shared Sub update_zone()
        Dim zid As String = Console.ReadLine()
        Dim zname As String = Console.ReadLine()
        cmd.CommandText = "update time_zone_name set name = '" & zname & "' where time_zone_id = " & zid
        Dim r As Integer = cmd.ExecuteNonQuery()
    End Sub
End Class
Databaseselect, insert, delete, update in console + class library
Imports MySql.Data.MySqlClient
Public Class Class1
    Private Shared conn As New MySqlConnection
    Private Shared cmd As New MySqlCommand
    Private Shared opt As String
    Public Shared Sub main()
        Console.WriteLine("s,i,d,u of time_zone_id,name in time_zone_name")
        opt = Console.ReadLine()
        Dim zid As String
        Dim zname As String
        If opt = "s" Then
            Dim l1 As Integer = Console.ReadLine()
            Dim l2 As Integer = Console.ReadLine()
            Console.Write(select_zone(l1, l2))
        End If
        If opt = "i" Then
            zid = Console.ReadLine()
            zname = Console.ReadLine()
            insert_zone(zid, zname)
            Console.Write(select_zone(1680, 1750))
        End If
        If opt = "d" Then
            zid = Console.ReadLine()
            delete_zone(zid)
            Console.Write(select_zone(1680, 1750))
        End If
        If opt = "u" Then
            zid = Console.ReadLine()
            zname = Console.ReadLine()
            update_zone(zid, zname)
            Console.Write(select_zone(1680, 1750))
        End If
        Console.Read()
    End Sub
    Public Shared Sub open_conn()
        If Len(conn.ConnectionString.ToString) = 0 Then
            conn.ConnectionString = "server=127.0.0.1;user id=root;password=;database=mysql;charset=tis620;"
        End If
        cmd.Connection = conn
        conn.Open()
    End Sub
    Public Shared Function select_zone(ByVal l1 As Integer, ByVal l2 As Integer) As String
        open_conn()
        cmd.CommandText = "select name,time_zone_id from time_zone_name limit " & (l1 - 1) & "," & (l2 - 1)
        Dim r As MySqlDataReader = cmd.ExecuteReader()
        Dim s As String = ""
        While r.Read()
            s &= r(0) & r(1) & Chr(10) ' 1684 records
        End While
        conn.Close()
        Return s
    End Function
    Public Shared Sub insert_zone(ByVal zid As String, ByVal zname As String)
        open_conn()
        cmd.CommandText = "insert into time_zone_name (time_zone_id,name)values(" & zid & ",'" & zname & "')"
        Dim r As Integer = cmd.ExecuteNonQuery()
        conn.Close()
    End Sub
    Public Shared Sub delete_zone(ByVal zid As String)
        open_conn()
        cmd.CommandText = "delete from time_zone_name where time_zone_id = " & zid
        Dim r As Integer = cmd.ExecuteNonQuery()
        conn.Close()
    End Sub
    Public Shared Sub update_zone(ByVal zid As String, ByVal zname As String)
        open_conn()
        cmd.CommandText = "update time_zone_name set name = '" & zname & "' where time_zone_id = " & zid
        Dim r As Integer = cmd.ExecuteNonQuery()
        conn.Close()
    End Sub
End Class
+ mysql_sidu2.zip
Databaseusing class library, mysql in windows form application
Imports ClassLibrary1.Class1
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        TextBox5.Text = ClassLibrary1.Class1.select_zone(TextBox3.Text, TextBox4.Text)
        TextBox5.Refresh()
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TextBox1.Text = 1700
        TextBox2.Text = "ดวงดาว"
        TextBox3.Text = 1670
        TextBox4.Text = 1750
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ClassLibrary1.Class1.insert_zone(TextBox1.Text, TextBox2.Text)
        TextBox5.Refresh()
    End Sub
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        ClassLibrary1.Class1.delete_zone(TextBox1.Text)
        TextBox5.Refresh()
    End Sub
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        ClassLibrary1.Class1.update_zone(TextBox1.Text, TextBox2.Text)
        TextBox5.Refresh()
    End Sub
End Class
+ mysql_form2.zip
Commandshell และ process และ file writing
- การเรียก shell command แบบต่าง ๆ รวมถึงการสร้าง batch file ผ่าน file writing

หัวข้อ
- การใช้ select case
- การเรียกคำสั่งภายนอกผ่าน shell
- การอ้างอิง process id และสั่ง taskkill
- การใช้งาน process object เบื้องต้น
- try catch ใช้ป้องกันผู้ใช้ปิด process เอง
- การทำงานกับ filestream
- การ convert จาก string เป็น byte array 2 แบบ
- ใน case 4 เป็นตัวอย่างที่ไม่ดี ให้ทำ code optimization
- System.Text.Encoding.UTF8.GetBytes ใช้แปลง string เป็น byte array
Imports System.IO
Module Module1
 Dim p = New Process
 Sub Main()
  Dim mypro As Integer
  Console.Write("option: ")
  mypro = Console.ReadLine
  Select Case mypro
   Case 1
    Shell("c:\windows\notepad.exe", AppWinStyle.NormalFocus)
    Shell("explorer.exe http://www.google.com", AppWinStyle.NormalFocus)
   Case 2
    Dim pid1 As Integer 
    pid1 = Shell("c:\windows\notepad.exe", AppWinStyle.NormalFocus)
    Console.Write(pid1)
    Console.ReadLine()
    Shell("c:\windows\system32\taskkill.exe /pid " & pid1)
   Case 3
    start_process("C:\Windows\System32\Notepad.exe")
    Console.Write("start in process")
    Console.ReadLine()
    Try
     p.kill()
    Catch ex As Exception
     Console.Write(ex)
     Console.ReadLine()
    End Try
   Case 4
    Dim data(0) As Byte
    Dim fw As FileStream
    fw = New FileStream("c:\x.bat", FileMode.Create, FileAccess.Write)
    Dim cmd As String = "ipconfig"
    ReDim data(cmd.Length)
    For i = 0 To cmd.Length - 1: data(i) = Asc((cmd.Substring(i, 1))) :Next
    fw.Write(data, 0, cmd.Length)
    '
    cmd = Chr(13) + Chr(10)
    ReDim data(cmd.Length)
    For i = 0 To cmd.Length - 1: data(i) = Asc((cmd.Substring(i, 1))) :Next
    fw.Write(data, 0, cmd.Length)
    '
    cmd = "ping www.google.com > y.txt"
    ReDim data(cmd.Length)
    For i = 0 To cmd.Length - 1 : data(i) = Asc((cmd.Substring(i, 1))) : Next
    fw.Write(data, 0, cmd.Length)
    '
    cmd = Chr(13) + Chr(10)
    ReDim data(cmd.Length)
    data = System.Text.Encoding.UTF8.GetBytes(cmd)
    fw.Write(data, 0, cmd.Length)
    '
    cmd = "pause | type y.txt"
    data = System.Text.Encoding.UTF8.GetBytes(cmd)
    fw.Write(data, 0, cmd.Length)
    '
    fw.Close()
    Shell("c:\x.bat")
  End Select
 End Sub
 Sub start_process(ByVal c As String)
  p.StartInfo.FileName = c
  p.StartInfo.WindowStyle = ProcessWindowStyle.Normal
  p.Start()
 End Sub
End Module
Commandtry catch finally
- การตรวจจับความผิดพลาด และดำเนินการกำกับดูแล
Module Module1
    Sub Main()
        Dim ar(4) As Byte
        For i As Integer = -1 To 4
            Try
                Select Case i
                    Case 1
                        Console.WriteLine(0 / 0) ' NaN (Not a Number)
                        Console.WriteLine(1 / 0) ' Infinity
                        Shell("c:\windows\system32\note_pad.exe")
                        Console.WriteLine("lost 1")
                    Case 2
                        Console.WriteLine("i = 2")
                        Throw New Exception("Throw exception") ' jump to exception
                        Console.WriteLine("lost 2")
                        Shell("lost 3")
                    Case 3
                        IO.File.Delete("c:\windows") ' jump to exception
                        Console.WriteLine("lost")
                    Case Else
                        Console.WriteLine(ar(i))
                End Select
            Catch ex As IndexOutOfRangeException
                Console.WriteLine("Exception :" & "index over 2")
            Catch ex As IO.FileNotFoundException
                Console.WriteLine("Exception 1 :" & "should be notepad.exe")
            Catch ex As UnauthorizedAccessException
                Console.WriteLine("Exception 3 : " & ex.Message)
            Catch ex As Exception
                ' ex.message = "Throw exception"
                Console.WriteLine("Exception 2 : " & ex.Message)
            Finally
                Console.WriteLine("--- end " & i & " ---")
            End Try
        Next
        Console.Read()
    End Sub
End Module
Threadแต่ละ Thread ทำงานของตนเองจนเสร็จแล้วปิดตัวเองไป
- ใช้ Task manager ตรวจจำนวน Thread ที่เพิ่ม และวัดเวลาการทำงานของแต่ละเทรดได้ .. ไม่จำเป็นที่ Thread แรกต้องทำงานเสร็จก่อน
Imports System.Threading
Public Class Form1
    Sub New()
        InitializeComponent()
        Dim myt1 As Thread = New Thread(Sub() MsgBox(run_form(New Form, 1000, "t1")))
        Dim myt2 As Thread = New Thread(Sub() MsgBox(run_form(New Form, 1000, "t2")))
        Dim myt3 As Thread = New Thread(Sub() MsgBox(run_form(New Form, 1000, "t3")))
        myt1.Start()
        myt2.Start()
        myt3.Start()
    End Sub
    Function run_form(ByRef f As Object, ByVal tot As Integer, ByVal tname As String) As String
        f.Width = 300
        f.Height = 300
        Dim txt1 As New TextBox()
        Dim txt2 As New TextBox()
        txt1.Top = 40
        txt2.Top = 80
        txt1.Width = 300
        txt2.Width = 300
        txt1.Text = Now
        txt2.Text = 0
        f.Controls.Add(txt1)
        f.Controls.Add(txt2)
        f.Show()
        txt2_run(f, txt2, tot)
        Dim txt3 As New TextBox()
        txt3.Top = 120
        txt3.Width = 300
        txt3.Text = 0
        txt3.Text = (Now - CDate(txt1.Text)).ToString & " HH:MM:SS.1234567 microsecond"
        f.Controls.Add(txt3)
        Return (tname & "=" & txt3.Text)
    End Function
    Sub txt2_run(ByRef f As Object, ByRef t As Object, ByVal tot As Integer)
        For i As Integer = 1 To tot
            t.Text = i
            f.Refresh()
        Next
    End Sub
    Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
        Me.Hide()
    End Sub
End Class
Dploymentpublish & ftp to server for online installation
- การสร้าง installer เพื่อ publish สำหรับนำไปใช้ กรณีศึกษา บทความในชีวิตประจำวัน
รายละเอียด
การสร้าง installer เพื่อ publish ผลงานที่ทำการ build จาก vs.net 2010 แล้วเผยแพร่ให้กลุ่มเป้าหมาย
ไม่ซับซ้อนเมื่อใช้ vs.net (ใน nsis หรือ android ซับซ้อนกว่า) จึงได้ทำ demo ตัว installer โดยมีขึ้นตอนดังนี้
1. โจทย์ หรือความต้องการ
มีโจทย์ว่าจะทำโปรแกรมแสดงบทความไอทีในชีวิตประจำวันให้ผู้อ่านเปิดอ่านแบบ offline ได้
ซึ่งปกติเผยแพร่ไว้ที่ thaiall.com/itinlife 
แล้วเคยทำแบบนี้ในรูป android apps 
เผยแพร่ใน play store หรือ thaiall.com/android
จึงคัดลอก script ส่วนของ array ที่เป็นภาษา C มาปรับเป็นภาษา Basic
2. การออกแบบโปรแกรม
ทำใน vs.net แบ่งเป็น 2 ส่วนคือ windows forms application และ class library 
โดยเนื้อหาบทความอยู่ใน .dll แต่โปรแกรม form ที่ใช้ทำงานจริง จะเรียกใช้เนื้อหาจาก library
หากจะเพิ่ม-ลบบทความก็เพียงแต่ปรับ .dll แล้วถ้าปรับการแสดงผลก็ต้องไปปรับ form 
ซึ่งแยกให้เห็นการทำงานที่แตกต่างกัน 2 ส่วน
3. เปิดให้ download 3 แบบ
3.1 source code ของ class library ได้รวมเป็น .rar ไว้ที่ 
http://www.thaiall.com/itinlife/vs2010_dll_itarticles.rar
ถ้ามีเฉพาะ library จะประมวลผลไม่ได้ เพราะผมไม่ได้ทำ main() ทิ้งไว้
3.2 source code ของ windows forms application ได้รวมเป็น .rar ไว้ที่
http://www.thaiall.com/itinlife/vs2010_form_itarticles1.rar
ใน form นี้ ผม add reference ไว้แล้ว สามารถทดสอบประมวลผลได้
3.3 execute file ที่เกิดหลัง build และ publish 
ผมใช้ ftp ส่งแฟ้มในห้อง publish ไปเผยแพร่แบบออนไลน์ไว้ที่
http://www.thaiall.com/itinlife/publish/publish.htm
ถ้ากดปุ่ม install หรือ run setup.exe ก็จะได้โปรแกรมไว้ในเครื่อง 
แต่ในการติดตั้งจะ download จาก net
เพราะตัว setup.exe กับใน publish\Application Files นั้นแยกกันชัดเจน
Question - Answer
คำถาม คำสั่งทั่วไปเกี่ยวกับ VB มีอะไรบ้าง
คำตอบ http://www.thaiall.com/vbnet/msvb.htm
คำถาม อ่านค่า Mac Address ซึ่งเป็นเลขประจำตัวของ Network Card อย่างไร
คำตอบ ใช้บริการของ System.Net.NetworkInformation [ อ้างอิง ]
    Imports System.Net.NetworkInformation Module Module1 Sub Main() Dim mac As String = "" Dim nics As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces() If nics Is Nothing OrElse nics.Length < 1 Then mac = "not found" Else For Each adapter As NetworkInterface In nics If (adapter.OperationalStatus = 1) And (adapter.NetworkInterfaceType = 6) And (adapter.Name = "Local Area Connection") Then mac &= adapter.GetPhysicalAddress().ToString & vbCrLf End If Next End If Debug.Write(mac) ' same as DOS>ipconfig /all End Sub End Module
คำถาม อ่านค่า Serial Number ของ Harddisk อย่างไร
คำตอบ ใช้ค่าจาก CreateObject("Scripting.FileSystemObject") [ อ้างอิง ]
    Module Module1 Sub Main() Dim fso As Object = CreateObject("Scripting.FileSystemObject") Dim Drv As Object Drv = fso.GetDrive(fso.GetDriveName("c:")) ' =2007968671 If Drv.IsReady Then Debug.Write(Math.Abs(Drv.SerialNumber) & vbCrLf) Drv = fso.GetDrive(fso.GetDriveName("d:")) ' =1327828258 If Drv.IsReady Then Debug.Write(Math.Abs(Drv.SerialNumber) & vbCrLf) Drv = Nothing : fso = Nothing End Sub End Module 'http://www.vbgold.com/vb-projects/disk-serial-number.shtml
คำถาม Class library แบบ Console application กำหนดให้ startup อย่างไร
คำตอบ สร้าง method แล้วก็ใช้คำว่า console สั่งเขียน หรืออ่าน
    Public Class Class1 Shared Sub main() Console.Write(dbl(5)) Console.Read() End Sub Public Shared Function dbl(ByVal a As Integer) Dim b As Integer b = a * 2 Return b End Function End Class
คำถาม พบคำว่า "A project with an Output Type of Class Library cannot be started directly" หมายถึงอะไร
คำตอบ ถ้าสร้าง Class Library และกำหนด Application type เป็น Class Library จะกำหนด Start up ไม่ได้
หากต้องการประมวลผล ต้องสร้าง project แล้วเพิ่ม reference จาก .dll แล้วเรียกใช้ class ใน method ที่สร้างขึ้นมา
ถ้าจะ startup Class ก็ต้องเปลี่ยน Application type เป็น Console Application แล้วกำหนด startup method

คำถาม ใน class library แบบ console application เมื่อสั่ง Start debugging หรือ F5 แล้วได้แฟ้ม .exe เก็บไว้ที่ไหน
คำตอบ C:\Documents and Settings\burin\My Documents\Visual Studio 2010\Projects\ClassLibrary1\ClassLibrary1\bin\Debug
พบ 4 แฟ้มคือ ClassLibrary1.exe ClassLibrary1.pdb ClassLibrary1.vshost.exe ClassLibrary1.xml
คำถาม ใน class library แบบ class library เมื่อเปลี่ยน configuration manager เป็น release แล้ว build จะเกิดอะไรขึ้น
คำตอบ C:\Documents and Settings\burin\My Documents\Visual Studio 2010\Projects\ClassLibrary1\ClassLibrary1\bin\Debug
พบ 3 แฟ้มในห้อง release คือ ClassLibrary1.dll ClassLibrary1.pdb ClassLibrary1.xml
หากสลับไปมาระหว่าง console application และ class library ก็ไม่พบปัญหา แต่ทำงานแบบ two in one ไม่ได้
คำถาม using คืออะไร
คำตอบ
    การกำหนดให้เปิดวัตถุ แล้วมีการคืนหน่วยความจำให้ระบบทันที ไม่ต้องทำการคืนวัตถุด้วย .dispose() ด้วยตนเอง using o1 as new x() .. end using หรือ dim o2 as new x() o2.dispose() หรือ dim o3 as new mysqlconnection o3.close() เท่ากับ o3.dispose()
คำถาม การเรียกใช้ class library ที่เพิ่ม reference แล้วเขียน code อย่างไร
คำตอบ
    Imports classlibrary1 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load MsgBox(Class1.dbl(5)) End Sub End Class
คำถาม ถ้า add reference แล้วจะ add ซ้ำไม่ได้ หากต้องการ add ซ้ำก็ต้องลบของเก่าก่อน ต้องทำอย่างไร
คำตอบ การ remove reference ให้ double click ที่ my project หรือเรียก properties ของ project
ให้คลิ๊ก tab : reference แล้วคลิ๊กที่ชื่อ reference ที่ต้องการลบ แล้วคลิ๊ก remove
เอกสารอ้างอิง
[1] เรวัตร ธรรมาอภิรมย์, "เจาะลึกเทคโนโลยีใหม่ Microsoft .net Framework", บริษัท เอส.พี.ซี.พริ้นติ้ง จำกัด, กรุงเทพฯ, 2544.
[2] พร้อมเลิศ หล่อวิจิตร, "คู่มือเรียน Visual Basic 2005", บริษัท โปรวิชั่น จำกัด., กรุงเทพฯ, 2549.
[3] ธวัชชัย สุริยะทองธรรม, "พัฒนาเว็บแอพพลิเคชั่น ASP.NET", บริษัท ซัคเซส มีเดีย จำกัด., กรุงเทพฯ, 2548.
[4] ยุทธนา ลีลาศวัฒนกุล, "คู่มือการเขียนโปรแกรมและใช้งาน Visual C++.NET", สำนักพิมพ์อินโฟเพรส, กรุงเทพฯ, 2546.
[5] กิตติ ภักดีวัฒนะกุล, จำลอง ครูอุตสาหะ, "ASP ฉบับโปรแกรมเมอร์", บริษัท เคทีพี คอมพ์ แอนด์ คอนซัลท์ จำกัด., กรุงเทพฯ, 2543.
[6] ศุภชัย สมพานิช, "การเขียนโปรแกรมอย่างมืออาชีพด้วย .NET Framework", บริษัท ไอดีซี พรีเมียร์ จำกัด., นนทบุรี, 2554.

แนะนำเว็บใหม่ : ผลการจัดอันดับ
รักลำปาง : thcity.com : korattown.com : topsiam.com : มหาวิทยาลัยเนชั่น
ศูนย์สอบ : รวมบทความ : ไอทีในชีวิตประจำวัน : ดาวน์โหลด : facebook.com
ติดต่อ ทีมงาน ชาวลำปาง มีฝันเพื่อการศึกษา Tel.08-1992-7223