2012年12月11日 星期二

Telnet ... 簡單的寫法


    Private T_Stream As Net.Sockets.NetworkStream
    Private T_Client As New Net.Sockets.TcpClient()
    Private bytWriting As [Byte]()
    Private bytReading As Byte()

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        T_Client.SendTimeout = 1500
        T_Client.Connect("主機IP", "23")
        T_Stream = T_Client.GetStream
        System.Threading.Thread.Sleep(1500)  ' 暫停一下等主機回應
        TextBox1.Text = TextBox1.Text & ReadData() & vbCrLf     ' 取得回應的資料 

        WriteData("帳號指令等" & vbCrLf)      ' 輸入  ... 重複 WriteData ReadData 就跟用 Telnet 一樣   
        System.Threading.Thread.Sleep(500)
        TextBox1.Text = TextBox1.Text & ReadData() & vbCrLf

        T_Stream.Close()
        T_Client.Close()
    End Sub

    Private Function ReadData() As String
        Dim sData As String
        ReDim bytReading(T_Client.ReceiveBufferSize)
        T_Stream.Read(bytReading, 0, T_Client.ReceiveBufferSize)
        sData = Trim(System.Text.Encoding.Default.GetString(bytReading))
        ReadData = sData
    End Function

    Private Sub WriteData(ByVal sData As String)
        bytWriting = System.Text.Encoding.Default.GetBytes(sData)
        T_Stream.Write(bytWriting, 0, bytWriting.Length)
    End Sub

備註:如果回傳的資料過大,可能會漏掉部份內容,
         因為 ReceiveBufferSize 預設為 8192,
         可於 ReadData() 增加下列語法,加大 BufferSize
         T_Client..ReceiveBufferSize = xxxxxx 


2012年12月7日 星期五

控制項名稱動起來


        如果希望依程式需要引用同類的控制項,
     
        可以使用   Controls("控制項" & 變數),

         底下是個簡單的範例,

         將五張圖片隨機填入五個 picturebox。       

        Dim xnum As Integer

        For si = 1 To 5
            xnum = Math.Round(Rnd() * 6, 0)
            Select Case xnum
                Case 0
                    Controls("picturebox" & si).BackgroundImage = My.Resources._1
                Case 1
                    Controls("picturebox" & si).BackgroundImage = My.Resources._2
                Case 2
                    Controls("picturebox" & si).BackgroundImage = My.Resources._3
                Case 3
                    Controls("picturebox" & si).BackgroundImage = My.Resources._4
                Case 4
                    Controls("picturebox" & si).BackgroundImage = My.Resources._5
            End Select
        Next

DataGridView 定義時間格式

從資料庫讀取時間欄位載入到 DataGridView 時,

秒數可能會不見,

只要指定時間格式就 OK了。

DataGridView1.Columns("time_arrive").DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss"

執行程式時提示訊息的方法


       在執行程式時,如果希望提示訊息,
       可以用以下的方式:

        Dim Excuting_msg As New Form
        Excuting_msg.TopMost = True
        Excuting_msg.Width = "300"
        Excuting_msg.Height = "230"
        Excuting_msg.Text = "Message !!!"
       '下面這行可以放圖上去
        Excuting_msg.BackgroundImage = My.Resources.Resources.圖的檔名
        Excuting_msg.BackgroundImageLayout = ImageLayout.Stretch
        Excuting_msg.StartPosition = FormStartPosition.CenterScreen
        Excuting_msg.Show()

        '執行完畢時將訊息關閉。

        Excuting_msg.Close()

        備註:將圖加入資源的流程:
                 1.方案名稱按右鍵點屬性
                 2.點資源 > 加入資源 > 加入現有檔案

                 這樣就可以引用資源圖片了。
     

2012年12月5日 星期三

Multithreading 初體驗


程式長時間執行時想中斷程式,會發現介面完全無法操作,

採用 Multithreading 可以解決這個問題,

以下是簡單的範例  ... 中斷無限迴圈

Imports System.Threading

Public Class Form1
    Dim Thread_A As Thread = Nothing
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Thread_A = New Thread(New ThreadStart(AddressOf Me.ThreadAsub))
        Thread_A.IsBackground = True
        Thread_A.Start()
    End Sub
    Private Sub ThreadAsub()
        Dim c_ID As String
        Dim x As Integer = 0
        c_ID = Thread.CurrentThread.GetHashCode()   ' 這行可取得 Thread ID
        update(c_ID, TextBox1)
        Do Until x = 1
            update("測試字串", TextBox2)    '無限迴圈寫入字串
        Loop
    End Sub

'  因為 Thread_A 跟操作介面是不同的 Thread,無法直接寫入TextBox,
   改採以下的寫法就可以順利運作

    Private Delegate Sub updateX(ByVal MyText As String, ByVal c As Control)

    Private Sub update(ByVal MyText As String, ByVal c As Control)
        If Me.InvokeRequired() Then
            Dim cb As New updateX(AddressOf update)
            Me.Invoke(cb, MyText, c)
        Else
            If c.Name = "TextBox1" Then
                c.Text = MyText
            ElseIf c.Name = "TextBox2" Then
                TextBox2.AppendText(MyText & vbCr)
            End If
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Thread_A.Abort()   ' 中斷程式
    End Sub
End Class

DateTimePicker 取得一週後的日期


DateTimePicker1.Value.AddDays(7).Date.ToString("MM/dd/yyyy")

只要改變 AddDays(num) 的數字,

就可以取得特定日期字串,

搭配 ToString 可輸出不同的日期格式,

例如:ToString("yyyy-MM-dd")  等等。

2012年12月4日 星期二

RichTextBox SelectionBackColor 還原


 RichTextBox1.SelectionStart = 0
 RichTextBox1.SelectionLength = RichTextBox1.Text.Length
 RichTextBox1.SelectionBackColor = Color.White

就是全選後塗成白色就還原了。