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

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

StreamReader 寫 textbox 中文亂碼

 Dim sr1 As New StreamReader("C:\test.txt", System.Text.Encoding.Default)

只要用這個語法就正常了。

2012年12月2日 星期日

DataGridView Double Click 欄位填值


 Private Sub DataGridView1_CellDoubleClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellDoubleClick
        Select Case e.ColumnIndex
            Case 0
               TextBox1.Text = DataGridView1.CurrentRow.Cells(0).Value
            Case 3
                TextBox1.Text = DataGridView1.CurrentRow.Cells(3).Value
        End Select
    End Sub


Case 0 代表第一欄,

CurrentRow 就是 Double Click 的那一列,

Cells(0).Value  第一個欄位的值。

DataGridView 資料清空的語法

加底下這行就搞定了。

DataGridView1.DataSource = Nothing

2012年12月1日 星期六

DataGridView 指定首列顯示

加入底下這行,指定 Row_num 即可讓特定列移至首列。

 DataGridView1.FirstDisplayedScrollingRowIndex = Row_num

DataGridView 指定欄位排序

加入底下這行,修改要排序的欄位,例如第三欄 Columns(3)

從小到大或從大到小,修改為 Ascending 或 Descending

DataGridView1.Sort(DataGridView1.Columns(3), System.ComponentModel.ListSortDirection.Descending)

Richtextbox 搜尋字串並標示背景顏色

    Dim indexOfSearchText As Integer = 0
    Dim start As Integer = 0

    Private Sub search_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles search.Click
       
         Dim startindex As Integer

start_search:

        If TextBox1.Text.Length > 0 Then
            startindex = FindMyText(TextBox1.Text.Trim(), start, RichTextBox1.Text.Length)
        Else
            MsgBox("沒有關鍵字")
            GoTo mark_end
        End If

        ' If string was found in the RichTextBox, highlight it
        If startindex >= 0 Then
            ' Set the highlight color
            RichTextBox1.SelectionBackColor = Color.GreenYellow

            ' Find the end index. End Index = number of characters in textbox
            Dim endindex As Integer = TextBox1.Text.Length
            ' Highlight the search string
            RichTextBox1.Select(startindex, endindex)
            ' mark the start position after the position of
            ' last search string
            start = startindex + endindex
            GoTo start_search
        End If
mark_end:
    End Sub

    Public Function FindMyText(ByVal txtToSearch As String, ByVal searchStart As Integer, ByVal searchEnd As Integer) As Integer
        ' Set the return value to -1 by default.
        Dim retVal As Integer = -1

        ' A valid starting index should be specified.
        ' if indexOfSearchText = -1, the end of search
        If searchStart >= 0 AndAlso indexOfSearchText >= 0 Then
            ' A valid ending index
            If searchEnd > searchStart OrElse searchEnd = -1 Then
                ' Find the position of search string in RichTextBox
                indexOfSearchText = RichTextBox1.Find(txtToSearch, searchStart, searchEnd, RichTextBoxFinds.None)
                ' Determine whether the text was found in richTextBox1.
                If indexOfSearchText <> -1 Then
                    ' Return the index to the specified search text.
                    retVal = indexOfSearchText
                End If
            End If
        End If
        Return retVal
    End Function


改編自以下網址,感謝原作者。
http://www.dotnetcurry.com/ShowArticle.aspx?ID=146

DateTimePicker 自動預設當天日期

只要在 Form_Load 加入底下這一行,

在載入 Form 時就會自動顯示當天日期。

DateTimePicker1.Value = DateTime.Now

Form 載入時全螢幕顯示


打開 Form 的屬性,將 WindowsState 設定為 Maximized。