none
[vb.net 2010] button應用請教 RRS feed

  • 問題

  • 在VB6中,將按鈕屬性的TAG,拿來當開關、INDEX拿來當PLC輸出的接點。

    但VB.NET的按鈕,只有一個TAG的屬性可以應用。

    若拿來當開關(ON/OFF)的話,就無法指定PLC的輸出點。

    若拿來當PLC的輸出點的話,就無法使用開關(ON/OFF)的功能。

    不知要如何改寫會比較好?

    VB.NET的按鈕物件,屬性除了text 跟tag可以用之外,是否還有其它可拿來自定使用的。

    Private Sub cmdSWOnOff_Click(Index As Integer)
      Dim bSwitch As Boolean
      Dim XPoint As Variant
      Dim Title As Variant
      Dim Number As Integer
      XPoint = Array("X44", "X45", "X46", "X47", "X50", "X51")
      Title = Array(" P-1-1 手動", " P-1-1 自動", " P-2-1 手動", " P-2-1 自動", " P-2-2 手動", " P-2-2 自動")
      
      bSwitch = cmdSWOnOff(Index).Tag
      Number = Index * 2
    
      If bSwitch = False Then
        With cmdSWOnOff(Index)
          .Tag = 1
          .BackColor = vbGreen
          .Caption = Title(Number)
        End With
        gf = PLC.SetDevice(UCase(XPoint(Number)), 1)     '手動
        gf = PLC.SetDevice(UCase(XPoint(Number + 1)), 0) '自動
      Else
        With cmdSWOnOff(Index)
          .Tag = 0
          .BackColor = vbRed
          .Caption = Title(Number + 1)
        End With
        gf = PLC.SetDevice(UCase(XPoint(Number)), 0)      '手動
        gf = PLC.SetDevice(UCase(XPoint(Number + 1)), 1)  '自動
      End If
    
    End Sub

    2012年9月21日 上午 08:46

解答

  • 小弟是VB.net的初學者,對 繼承 還不熟

    button中有一個TabIndex的屬性,發現它可以自由指定數值,而且就算重覆也不會異常。

    所以小弟把它拿來當index用,這樣就有二個屬性可以應用了。

    比如:

    有三個按鈕,它的TabIndex分別指定為0,1,2;Tag屬性初始為0。

    這樣就可以達到,用一個按鈕,來模擬選擇開關了(有ON/OFF、也可以送接點信號)。

    以下是小弟剛剛試出來的。

      Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        '//馬達控制
        For Each btn5 As Control In gbPump.Controls
          If TypeOf btn5 Is Button Then
            AddHandler CType(btn5, Button).Click, AddressOf btnPump_Click
          End If
        Next
      End Sub
    
     '//馬達控制
      Private Sub btnPump_Click(sender As System.Object, e As System.EventArgs)
        Dim bSwitch As Integer
        Dim XPoint(), Title() As String
        Dim Number As Integer
    
        XPoint = {"X34", "X35", "X36", "X37", "X40", "X41"}
        Title = {"P-1-1" & vbNewLine & "手動", "P-1-1" & vbNewLine & "自動",
                 "P-2-1" & vbNewLine & "手動", "P-2-1" & vbNewLine & "自動",
                 "P-2-2" & vbNewLine & "手動", "P-2-2" & vbNewLine & "自動"}
    
        bSwitch = CType(sender, Button).Tag
        Number = CType(sender, Button).TabIndex * 2
    
        If bSwitch = 0 Then
          With CType(sender, Button)
            .Tag = 1
            .BackColor = Color.Green
            .Text = Title(Number)
          End With
          lRet = PLC.SetDevice(UCase(XPoint(Number)), 1)     '手動
          lRet = PLC.SetDevice(UCase(XPoint(Number + 1)), 0) '自動
        Else
          With CType(sender, Button)
            .Tag = 0
            .BackColor = Color.Red
            .Text = Title(Number + 1)
          End With
          lRet = PLC.SetDevice(UCase(XPoint(Number)), 0)      '手動
          lRet = PLC.SetDevice(UCase(XPoint(Number + 1)), 1)  '自動
        End If
      End Sub

    • 已標示為解答 大呆 2012年9月21日 下午 01:27
    2012年9月21日 下午 12:46

所有回覆

  • 安你好

    有考慮過使用 Structure

    參考以下範例

    Public Class Form1
        Private Structure PLC
            Public open As Boolean
            Public index As Integer
        End Structure
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim PLCArray(1) As PLC
            PLCArray(0).open = False
            PLCArray(0).index = 0
            PLCArray(1).open = True
            PLCArray(1).index = 1
            Button1.Tag = PLCArray(0)
            Button2.Tag = PLCArray(1)
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            MsgBox(CType(Button1.Tag, PLC).open.ToString() & " : " & CType(Button1.Tag, PLC).index.ToString())
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            MsgBox(CType(Button2.Tag, PLC).open.ToString() & " : " & CType(Button2.Tag, PLC).index.ToString())
        End Sub
    End Class
    

     
    2012年9月21日 上午 09:32
  • 小弟要的功能是把一個[按鈕],模擬成一個 [選擇開關] 的功能。

    就是按一下為ON,再按一下為OFF;而且要可以輸出信號。

    在vb6中,很容易達成;但轉過來vb.NET時,小弟就不知道要如何撰寫了。

    腦袋轉不過來。

    2012年9月21日 上午 10:39
  • 您好,
    如果繼承Button後,額外加一個Index屬性來用呢?

    Public Class MyButton
        Inherits System.Windows.Forms.Button
    
        Dim _index As Integer = 0
        Public Property Index() As Integer
            Get
                Return _index
            End Get
            Set(value As Integer)
                _index = value
            End Set
        End Property
     
    End Class


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年9月21日 下午 12:07
  • 小弟是VB.net的初學者,對 繼承 還不熟

    button中有一個TabIndex的屬性,發現它可以自由指定數值,而且就算重覆也不會異常。

    所以小弟把它拿來當index用,這樣就有二個屬性可以應用了。

    比如:

    有三個按鈕,它的TabIndex分別指定為0,1,2;Tag屬性初始為0。

    這樣就可以達到,用一個按鈕,來模擬選擇開關了(有ON/OFF、也可以送接點信號)。

    以下是小弟剛剛試出來的。

      Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        '//馬達控制
        For Each btn5 As Control In gbPump.Controls
          If TypeOf btn5 Is Button Then
            AddHandler CType(btn5, Button).Click, AddressOf btnPump_Click
          End If
        Next
      End Sub
    
     '//馬達控制
      Private Sub btnPump_Click(sender As System.Object, e As System.EventArgs)
        Dim bSwitch As Integer
        Dim XPoint(), Title() As String
        Dim Number As Integer
    
        XPoint = {"X34", "X35", "X36", "X37", "X40", "X41"}
        Title = {"P-1-1" & vbNewLine & "手動", "P-1-1" & vbNewLine & "自動",
                 "P-2-1" & vbNewLine & "手動", "P-2-1" & vbNewLine & "自動",
                 "P-2-2" & vbNewLine & "手動", "P-2-2" & vbNewLine & "自動"}
    
        bSwitch = CType(sender, Button).Tag
        Number = CType(sender, Button).TabIndex * 2
    
        If bSwitch = 0 Then
          With CType(sender, Button)
            .Tag = 1
            .BackColor = Color.Green
            .Text = Title(Number)
          End With
          lRet = PLC.SetDevice(UCase(XPoint(Number)), 1)     '手動
          lRet = PLC.SetDevice(UCase(XPoint(Number + 1)), 0) '自動
        Else
          With CType(sender, Button)
            .Tag = 0
            .BackColor = Color.Red
            .Text = Title(Number + 1)
          End With
          lRet = PLC.SetDevice(UCase(XPoint(Number)), 0)      '手動
          lRet = PLC.SetDevice(UCase(XPoint(Number + 1)), 1)  '自動
        End If
      End Sub

    • 已標示為解答 大呆 2012年9月21日 下午 01:27
    2012年9月21日 下午 12:46
  • FAQ

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=%e6%8e%a7%e5%88%b6%e9%a0%85%e9%99%a3%e5%88%97


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年9月21日 下午 01:09
  • 雖然不曉得你想要的選擇開關功能是怎麼樣子,看你的說明好像用 If...Then...else....可以完成。

    先建立布林變數,讀取 I/O 點 的 True/False ,將值傳給布林變數,
    之後就可以使用 If.....Then....

    讀 I/O 點你應該會,我就用 f(x) 來代替讀寫 I/O

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim Switch As Boolean
            Switch = f(x) '讀取 I/O 狀態,將 ON/OFF 轉為 True/False
            Button1.Text = If(f(x), "ON", "OFF") 
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If Switch = True Then
                f(x) = False 'I/O 點設為 OFF
                Button1.Text = "OFF"
            Else
                f(x) = True 'I/O 點設為 ON
                Button1.Text = "ON"
            End If
        End Sub 

    類似這樣。


    • 已編輯 C.Kevin 2012年9月21日 下午 03:38
    2012年9月21日 下午 03:23
  • 感謝各位提供的各種方法跟資訊。

    小弟己經模索出來了。 ^_^

    =============================

    不同領域的專業(自動化控制),有時很難去解釋說明。

    小弟的主要工作是寫 PLC (可程式邏輯控制器),一般用在工廠自動化、設備自動化、電氣控制...等等

    VB6(VB.NET)只是協助拿來<模擬>實際零件的電氣信號< 讀(寫) 零件的輸出(入)信號>

    方便作 PLC 程式的測試、除錯。縮短實際至客戶(工程、工地)的試機時間與錯誤。

    ==============================

    說明一下:小弟的想法/用途

    功能:在PC上用一個 [按鈕] 來模擬一個現實中零件 [選擇開關] 的功能動作

    選擇開關:是一個可以左右切換的零件。

    當切到左邊時(手動功能),會送一個信號(ON)給PLC的輸入端(假設X34=1),而另一組輸入端信號(自動功能)會被切掉變成OFF(假設X35=0)

    當切到右邊時(自動功能),會送一個信號(ON)給PLC的輸入端(假設X35=1),而另一組輸入端信號(手動功能)會被切掉變成OFF(假設X34=0)

    也就是說,同時間內,二個功能,只能有一個功能可以使用。

    實際模擬效果如下:文字提示是後來追加的(同一個按鈕,有二種提示文字),方便得知該按鈕目前的接點是那一個。

    2012年9月22日 上午 01:13
  • 你現在是 DI/DO 有問題還是控制項陣列有問題?

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年9月22日 上午 01:48
  • 控制項陣列的問題,之前就有發問請教過了;版主 小朱 及 亂馬客 有提供範例給小弟參考。

    現在都沒問題了 ^_^

    感謝各位的教導。

    2012年9月22日 上午 02:17