2008-08-19 經驗小品 (5) VB8 下的自訂控制項陣列

黎煥欣  Li Huan Hsin

在做 NTU Array 的時候, 我們使用一大堆的 USB Serial port 來接收資料, 以現在 4 個 DC 的情況而言, FT 板有 36 個, Co  板有 16 個, 而且有時會裝, 有時不會在線上. 若是用傳統寫法, 全部都在設計階段放上去, 那寫起來及設計都非常難過. 後來翻了半天的書及線上 HELP, 總算整理並實際寫出一個可變性的控制程式.  下面就是範例

 

第一件事就是加入宣告 (Imports System.IO.Ports) 這樣才能在後面的程式中使用

接著就是在公共區域中宣告廣域的控制項陣列, 後面順便也宣告廣域的 UI 控制項陣列, 可以與 port 控制項陣列配合動作.

 

在程式真正執行時 (這裡是程式開始 frmMain.Load 中), 就把所有的 UI 陣列生出來. 與設計時放下去不同的是, 它的位置和大小都一定要寫明. 否則根本不知道它會跑到那裡去.

另外, 在這個 case, label 控制項的字型要變更, Font 的指定不是  = .... (font) , 而是要產生一個新的 Font 物件給它, 用 = New Font ("細明體", 9) 的方式指定.

在各個控制項的特性 (property) 設定好之後, 有一個 tag 特性最好也設下去, 這樣子當那一個控制項有事件發生時, 可以用這個 tag 值搞清楚是誰在觸發事件 (按了那個 button!)

之後就要將特性設好的控制項加入上層的表單中, 也就是 "呈現" 出來. 一般就是寫成

Me.Controls.Add(要加入的控制項) 就可以了. 但在這個例子, 我還想把它呈現在一個 GroupBox 內, 這樣視覺效果比較好, 而且控制動作會比較階層化. 但 GroupBox 是個 Container, 在表單之下, 但在我們的控制項之上. 所以在加入新的控制項的時候, 就要用

Me.GrouBox3.Controls.Add(控制項) 的寫法了

最後就是要將這些新加的控制項, 當發生事件時, 要到那裡處理這個事件. 在這裡就是一堆 button 的 click 事件. 另外已經寫了 btnFtToggle_click 的副程式, 我們就用

AddHandler 控制項.click, Addressof   btnFtToggle_Click

表示當控制項發生 click 事件時, 系統就會跑到指定的 btnFtToggle_click 副程式執行了, 這就是自訂控制項事件處理副程式的運用方法. 但是當呼叫 btnFtToggle_Click 時, 副程式要怎麼知道是那一個 id% 的 button click 呢. 這就要額外的資訊了. 這額外的資訊就在下圖產生 button 控制項時, 把 id% 值以字串的方式放到  Tag 這個 property 內的用處了.


自定的 Serial port 控制項陣列方法也差不多, 首先訂出 comXX 的字串為預定要使用的 comport 名稱, 在這裡是以 31 開頭. 接著用

Me.comCo(i%) = New SerialPort(comid$, 921600, Parity.None, 8, StopBits.One) 將它 "生" 出來, 隨後就啟動 (open) 它. 整個過程若是發生錯誤 (comport 不存在), Try..Catch 就會捉住, 弄個 flag 將它記錄下來, 以後不會動它就是了..... 

 

程式開始執行後, 螢幕上就出現我們的自訂 UI 控制項陣列了

 

嘗試啟動 serial port, 第四大組沒有動作, UI 就秀出 Disable 的樣子

 

即然新的 Serial Port 陣列已經開啟, 就彁可以用它接收資料了.

 

整個 UI 控制項包在 GroupBox 裡的樣子. 同時連續讀取資料, 顯現在螢幕上 "00011000......"


-------------------------------------------------------------------------------------------------------------------------------------

最後要提到, 那在後面的一大堆生成的 button 按下去後, 照上面的說法, 都送到了 btnFtToggle_Click 這個副程式了. 這個副程式還是要能辨識那一個 button. 上面提到的 Tag property 就有用了. 如下面的程式碼中, 首先用定義一個 object 為觸發事件的那一個 object 的複本 (Dim obj As Button = sender)

再利用這個 object 複本中的 tag 屬性. 就可以知道是那一個 button 被 click 了.

雖然有些繁複, 但這是作者想到最簡單的作法了.


 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 huanhsin 的頭像
    huanhsin

    黎煥欣的工作部落格

    huanhsin 發表在 痞客邦 留言(0) 人氣()