[摘要]以春節(jié)聯(lián)歡晚會(huì)電視節(jié)目手機(jī)號(hào)碼抽獎(jiǎng)為例,介紹利用Visual Basic2005設(shè)計(jì)電視節(jié)目手機(jī)號(hào)碼抽獎(jiǎng)程序的步驟和關(guān)鍵技術(shù)。
[關(guān)鍵詞]VisualBasic2005 手機(jī)號(hào)碼 電視抽獎(jiǎng)
中圖分類號(hào):TP3文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1671-7597(2009)0510021-02
近年來,各地電視臺(tái)為了增進(jìn)節(jié)目與觀眾的互動(dòng),在節(jié)目中設(shè)置了用手機(jī)和小靈通參與節(jié)目短信投票活動(dòng),在節(jié)目舉行到高潮時(shí),邀請(qǐng)抽獎(jiǎng)嘉賓開啟手機(jī)號(hào)碼抽獎(jiǎng),屏幕不停翻滾手機(jī)號(hào)碼,當(dāng)停止抽獎(jiǎng)時(shí)屏幕顯示中獎(jiǎng)手機(jī)號(hào)碼。本文通過一個(gè)春節(jié)聯(lián)歡晚會(huì)電視節(jié)目抽獎(jiǎng)程序?yàn)槔ǔ绦蜻\(yùn)行結(jié)果如圖1所示),介紹了利用Visual Basic2005設(shè)計(jì)手機(jī)號(hào)碼抽獎(jiǎng)程序的步驟和關(guān)鍵技術(shù)。
一、電視節(jié)目手機(jī)號(hào)碼抽獎(jiǎng)程序的特點(diǎn)
電視節(jié)目手機(jī)號(hào)碼抽獎(jiǎng)程序有下列特點(diǎn):(1)電視節(jié)目抽獎(jiǎng)程序力求界面友好,窗體無標(biāo)題欄和無關(guān)控件,程序操作方法要簡(jiǎn)單,當(dāng)按空格鍵實(shí)現(xiàn)抽獎(jiǎng)啟動(dòng)與停止;(2)手機(jī)號(hào)碼數(shù)據(jù)由電信營(yíng)運(yùn)商提供,可能數(shù)據(jù)量大,每個(gè)號(hào)碼都要有平等的機(jī)會(huì)參與抽獎(jiǎng),號(hào)碼翻滾速度適中,翻滾的號(hào)碼數(shù)據(jù)要作隱私保護(hù)(屏蔽中間4位數(shù)字),對(duì)抽中的號(hào)碼要鎖定并記錄到數(shù)據(jù)庫(kù)中。
二、電視節(jié)目手機(jī)號(hào)碼抽獎(jiǎng)程序設(shè)計(jì)
(一)程序界面設(shè)計(jì)和數(shù)據(jù)庫(kù)設(shè)計(jì)
電視抽獎(jiǎng)時(shí)一般同時(shí)會(huì)顯示出幾組手機(jī)號(hào)碼數(shù)據(jù),用組框(Groupbox)
控件對(duì)號(hào)碼進(jìn)行分組,一個(gè)手機(jī)號(hào)碼有11位數(shù)字,用11個(gè)標(biāo)簽分開顯示,本例有4組號(hào)碼需要44個(gè)標(biāo)簽控件(第一組命名label101~label111,第二組label201~label211,其他組依此類推)。設(shè)置窗體的邊框樣式FormBor
DerStyle為None,實(shí)現(xiàn)抽獎(jiǎng)程序運(yùn)行無標(biāo)題欄。設(shè)置窗體的WindowsState
屬性為Maximized,實(shí)現(xiàn)抽獎(jiǎng)程序運(yùn)行時(shí)最大化。
考慮到手機(jī)號(hào)碼數(shù)據(jù)量大和數(shù)據(jù)庫(kù)表的可擴(kuò)充性,選用SQL Server20
05作為手機(jī)抽獎(jiǎng)數(shù)據(jù)庫(kù)。在SQL Server環(huán)境下建立一個(gè)名為Mobile_Lotter
Y的數(shù)據(jù)庫(kù),然后建立兩張數(shù)據(jù)表:(1)TphoneNumber存儲(chǔ)待抽取的手機(jī)號(hào)碼;(2)TselectedNumber存儲(chǔ)已經(jīng)抽中的手機(jī)號(hào)碼。兩張表都含有(Phone
Number varchar(11))字段,表示11位手機(jī)號(hào)碼。
(二)數(shù)據(jù)訪問技術(shù)的實(shí)現(xiàn)
程序中多處要訪問數(shù)據(jù)庫(kù),考慮到VB2005訪問SQL Server數(shù)據(jù)庫(kù)的簡(jiǎn)便性,特設(shè)計(jì)一個(gè)數(shù)據(jù)庫(kù)操作類CDBOperation,在類下面定義一個(gè)共享函數(shù)DBOperate()對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。
Public Class CDBOperation
Shared Function DBOperate(ByVal SQLString As String) As DataTable
Try
Dim SconString As String
SconString = "Data Source=(local);Initial Catalog=Mobile_Lottery;Integrated Security=SSPI"
'連接SQL Server數(shù)據(jù)庫(kù)
Dim myconn As New SqlConnection
myconn.ConnectionString = SconString
myconn.Open()
Dim myComm As New SqlCommand(SQLString, myconn)
If InStr(SQLString.ToUpper, "INSERT") > 0 Or InStr(SQLString.ToUpper, "DELETE") Or InStr(SQLString.ToUpper, "UPDATE") Then '增加、刪除、更新操作
myComm.ExecuteNonQuery()
myconn.Close()
Else'查詢操作
myComm.ExecuteNonQuery()
Dim mydataset As New DataSet
Dim mydataApater As New SqlDataAdapter
mydataApater.TableMappings.Add("Table", "Temp")
mydataApater.SelectCommand = myComm
mydataApater.Fill(mydataset)
myconn.Close()
Return mydataset.Tables("Temp")
End If
Catch ex As SqlException
MsgBox(ex.Message)
End Try
End Function
End Class
為了避免從數(shù)據(jù)庫(kù)頻繁讀寫數(shù)據(jù),影響抽獎(jiǎng)程序的運(yùn)行速度,在窗體啟動(dòng)事件中事先把手機(jī)號(hào)碼數(shù)據(jù)一次性讀入到全局內(nèi)存數(shù)據(jù)表(mytable) 中,抽獎(jiǎng)進(jìn)行中直接從mytable中抽取,不需要頻繁訪問數(shù)據(jù)庫(kù)。
Private Sub frmPhonenumber_Load( …… )
mytable = CDBOperation.DBOperate("select * from TPhoneNumber")
'讀手機(jī)數(shù)據(jù)庫(kù)到全局內(nèi)存數(shù)據(jù)表mytable中。
Nend = mytable.Rows.Count1'全局變量Nend記錄手機(jī)號(hào)碼總條數(shù)
End Sub
(三)當(dāng)按空格鍵開始抽獎(jiǎng),再按空格鍵停止抽獎(jiǎng)并鎖定抽中號(hào)碼的程序設(shè)計(jì)
空格鍵是鍵盤中最長(zhǎng)的一個(gè)鍵,如果用它來控制抽獎(jiǎng)的啟停,就會(huì)給操作軟件帶來方便,在程序中要設(shè)法捕捉按下空格鍵所觸發(fā)的事件。按鍵按下時(shí)都會(huì)觸發(fā)keypress事件,該事件傳遞被按鍵的ASCII碼值,在窗體的keypress事件捕捉按下的鍵值,從而對(duì)程序進(jìn)行控制。空格鍵的ASCII值是32,根據(jù)按鍵值e.keychar來測(cè)試是否按了空格鍵。程序界面設(shè)計(jì)時(shí),計(jì)時(shí)器控件Enabled屬性設(shè)置為False,即初始時(shí)未自動(dòng)進(jìn)行抽獎(jiǎng)必須按空格鍵開始抽獎(jiǎng),然后按空格鍵停止抽獎(jiǎng)。
Private Sub frmPhonenumber_KeyPress(……)
If Asc(e.KeyChar) = 32 Then
Timer1.Enabled = Not Timer1.Enabled
'一反一復(fù)式控制
End If
在窗體的KeyPress事件中,要測(cè)試計(jì)時(shí)器timer1.Enabled屬性,如果其值為不可用(False),表明己經(jīng)停止?jié)L動(dòng)(即抽中了號(hào)碼),要鎖定抽獎(jiǎng)號(hào)碼,把抽中的號(hào)碼放到TselectedNumber表中保存,然后刪除TphoneNumber表中相應(yīng)的號(hào)碼。
If Timer1.Enabled = False Then
Dim i As Integer
For i = 1 To 4
CDBOperation.DBOperate("insert into TSelectedNumber(PhoneNumber) values('" & WinningNumbers(i) & "') ") '把抽中的號(hào)碼放到TselectedNumber表
CDBOperation.DBOperate("delete from TPhoneNumber where PhoneNumber='" & WinningNumbers(i) & "'")'刪除TphoneNumber表中抽中的號(hào)碼
Next
End If
(四)實(shí)現(xiàn)電腦屏幕不停翻滾加以隱私保護(hù)的手機(jī)號(hào)碼
實(shí)現(xiàn)電腦屏幕不停翻滾手機(jī)號(hào)碼數(shù)據(jù),可設(shè)置計(jì)時(shí)器觸發(fā)周期(滾動(dòng)頻率)Interval屬性(單位毫秒,建議設(shè)為10,每秒鐘觸發(fā)100次)讓計(jì)時(shí)器timer1每隔Interval周期不停地執(zhí)行滾動(dòng)號(hào)碼。為了讓每個(gè)號(hào)碼都有平等的機(jī)會(huì)參與抽獎(jiǎng),采用隨機(jī)數(shù)抽取內(nèi)存數(shù)據(jù)表中的手機(jī)號(hào)碼。設(shè)Nbegin起始數(shù)字,Nend表示終止數(shù)字,可以利用隨機(jī)數(shù)公式n = Int(Rnd() *(Nend-Nbegin+1)+Nbegin)產(chǎn)生[Nbegin,Nend]的隨機(jī)數(shù),然后利用產(chǎn)生的隨機(jī)數(shù)作為序號(hào)讀取內(nèi)存表mytable中相應(yīng)的數(shù)據(jù)行到TempNumbers。從內(nèi)存表中讀取的數(shù)據(jù)是11位的手機(jī)號(hào)碼,如果直接全部顯示出來,會(huì)泄露手機(jī)用戶的隱私,有必要對(duì)手機(jī)號(hào)碼進(jìn)行保護(hù),具體的方法是只取TempNumbers串的前3位和后4位字符,中間4位的四位在界面設(shè)計(jì)時(shí)用“×”代替。
Dim i, Nbegin, n As long
Nbegin = 0
n = Int(Rnd() * (Nend - Nbegin + 1) + Nbegin)
'產(chǎn)生[Nbegin,Nend]之間的隨機(jī)數(shù)
TempNumbers = mytable.Rows(n).Item("PhoneNumber")
'讀內(nèi)存數(shù)據(jù)表相應(yīng)的行
WinningNumbers(1) = TempNumbers
'取TempNumbers串的前3位和后4位字符放到標(biāo)簽控件
label101.Text = Mid(TempNumbers, 1, 1)
Label102.Text = Mid(TempNumbers, 2, 1)
Label103.Text = Mid(TempNumbers, 3, 1)
Label108.Text = Mid(TempNumbers, 8, 1)
Label109.Text = Mid(TempNumbers, 9, 1)
Label110.Text = Mid(TempNumbers, 10, 1)
Label111.Text = Mid(TempNumbers, 11, 1)
其它組按第一組的相同的方法設(shè)計(jì)代碼。
三、結(jié)束語
通過以上的分析,電視節(jié)目手機(jī)號(hào)碼抽獎(jiǎng)并不是那么神秘、那樣復(fù)雜,只要我們富于豐富的想像力,就能夠設(shè)計(jì)出符合需求的各種電視節(jié)目手機(jī)號(hào)碼抽獎(jiǎng)程序。
此程序在Windows xp、Visual Basic 2005、SQL Server2000環(huán)境下測(cè)試通過。
參考文獻(xiàn):
[1]豈興明、矯津毅、銀華強(qiáng),Visual Basic.Net 項(xiàng)目開發(fā)寶典[M].電子工業(yè)出版社,2007.
[2]丁愛萍,Visual Basic2005程序設(shè)計(jì)[M] 人民郵電出版社,2008.
作者簡(jiǎn)介:
包宋德,湖南衡陽(yáng)人,湖南婁底職業(yè)技術(shù)學(xué)院系統(tǒng)分析師,湖南大學(xué)在讀軟件碩士,研究方向:軟件技術(shù)。