BackgroundWorker 用法

1. 設定 BackgroundWorker.WorkerReportsProgress = true
2. 在主執行緒中處理 BackgroundWorker.ProgressChanged 事件,用這個事件常式來更新進度列 .
3. 在工作執行緒(也就是 OnDoWork 事件常式)中,使用 ReportProgress() 方法來引發 ProgressChanged 事件,然後把進度資料設給這個事件,讓它有資料可以交給主執行緒的 ProgressChanged 事件常式 .

多執行緒的寫法(以FTP加進度BAR為例)

'//定義一個Thread
Dim FTPThread As Thread = Nothing

'//多執行緒所要執行的程式
Private Sub conFTP()
.......
End Sub

Private Sub Form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
'//執行緒一(執行FTP)
Me.FTPThread = New Thread( _
New Threading.ThreadStart(AddressOf Me.conFTP))
Me.FTPThread.Start()

'//執行緒二(控制lab讀取中的進度顯示)
Dim p As New Show_prog(Label2, Timer2)
p.showProg()
End Sub

'//控制lab讀取中的進度顯示
Public Class Show_prog
Dim v_ShowMsg As String = ""
Dim c_lab As Label
Dim c_tim As Timer

Public Sub New(ByVal lab As Label, ByVal tim As Timer)
c_lab = lab
c_tim = tim
End Sub

'''
''' 顯示
'''
Public Sub showProg()

c_lab.Text = v_ShowMsg
c_lab.Visible = True
c_tim.Interval = 300
c_tim.Enabled = True

'lab
c_lab.Location = New Point(70, 147)

AddHandler c_tim.Tick, AddressOf Timer_Tick
End Sub

Dim i As Integer = 0

Public Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
If OBS1.v_bol_FTP = False Then '//是否讀取結束
c_lab.Visible = False
RemoveHandler c_tim.Tick, AddressOf Timer_Tick
Else
Select Case i
Case 0
v_ShowMsg = "讀取中."
Case 1
v_ShowMsg = "讀取中.."
Case 2
v_ShowMsg = "讀取中..."
Case 3
v_ShowMsg = "讀取中...."
Case 4
v_ShowMsg = "讀取中....."
Case 5
v_ShowMsg = "讀取中......"
Case 6
v_ShowMsg = "讀取中......."
Case 7
v_ShowMsg = "讀取中........"
Case 8
v_ShowMsg = "讀取中........."
Case 9
v_ShowMsg = "讀取中.........."
i = 0
End Select
i += 1

c_lab.Text = v_ShowMsg
c_lab.Update()
End If
End Sub

End Class

VB寫程式的八個優良習慣

1、”&”置換”+”
2、變量命名大小寫,語句錯落有秩,源代碼維護方面
3、請養成以下的「物件命名約定」良好習慣
4、在簡單的選取條件情況下,使用IIf()函數
5、盡量使用Debug.Print進行除錯
6、在重複對某一對象的屬性進行修改時,盡量使用With….End With
7、MsgBox中盡量使用消息圖示,這樣程式比較有規範
8、在可能的情況下使用枚舉

1、”&”置換”+”
在很多人的寫程式語系中,用「+」來連線字串,這樣容易導致歧義。良好的習慣是用「&」來連線字串.

不正確:
Dim sMessage As String
sMessage = “1” + “2”

正確:
Dim sMessage As String
sMessage = “1” & “2”

注意:”&”的後面有個空格

2、變量命名大小寫,語句錯落有秩,源代碼維護方面

下面大家比較一下以下兩段代碼:

讀懂難度很大的代碼:

Dim SNAME As String
Dim NTURN As Integer

If NTURN = 0 Then
If SNAME = “vbeden” Then
Do While NTURN < 4
NTURN = NTURN + 1
Loop
End If
End If

容易讀懂的代碼:

Dim sName As String
Dim nTurn As Integer

If nTurn = 0 Then
If sName = “vbeden” Then
Do While nTurn < 4
nTurn = nTurn + 1
Loop
End If
End If

[返回索引]

3、請養成以下的「物件命名約定」良好習慣

推薦使用的控件前綴

控件類型 前綴 例子
3D Panel pnl pnlGroup
ADO Data ado adoBiblio
Animated button ani aniMailBox
Check box chk chkReadOnly
Combo box, drop-down list box cbo cboEnglish
Command button cmd cmdExit
Common dialog dlg dlgFileOpen
Communications com comFax
Control (當特定類型不詳時,在過程中所使用的) ctr ctrCurrent
Data dat datBiblio
Data-bound combo box dbcbo dbcboLanguage
Data-bound grid dbgrd dbgrdQueryResult
Data-bound list box dblst dblstJobType
Data combo dbc dbcAuthor
Data grid dgd dgdTitles
Data list dbl dblPublisher
Data repeater drp drpLocation
Date picker dtp dtpPublished
Directory list box dir dirSource
Drive list box drv drvTarget
File list box fil filSource
Flat scroll bar fsb fsbMove
Form frm frmEntry
Frame fra fraLanguage
Gauge gau gauStatus
Graph gra graRevenue
Grid grd grdPrices
Hierarchical flexgrid flex flexOrders
Horizontal scroll bar hsb hsbVolume
Image img imgIcon
Image combo imgcbo imgcboProduct
ImageList ils ilsAllIcons
Label lbl lblHelpMessage
Lightweight check box lwchk lwchkArchive
Lightweight combo box lwcbo lwcboGerman
Lightweight command button lwcmd lwcmdRemove
Lightweight frame lwfra lwfraSaveOptions
Lightweight horizontal scroll bar lwhsb lwhsbVolume
Lightweight list box lwlst lwlstCostCenters
Lightweight option button lwopt lwoptIncomeLevel
Lightweight text box lwtxt lwoptStreet
Lightweight vertical scroll bar lwvsb lwvsbYear
Line lin linVertical
List box lst lstPolicyCodes
ListView lvw lvwHeadings
MAPI message mpm mpmSentMessage
MAPI session mps mpsSession
MCI mci mciVideo
Menu mnu mnuFileOpen
Month view mvw mvwPeriod
MS Chart ch chSalesbyRegion
MS Flex grid msg msgClients
MS Tab mst mstFirst
OLE container ole oleWorksheet
Option button opt optGender
Picture box pic picVGA
Picture clip clp clpToolbar
ProgressBar prg prgLoadFile
Remote Data rd rdTitles
RichTextBox rtf rtfReport
Shape shp shpCircle
Slider sld sldScale
Spin spn spnPages
StatusBar sta staDateTime
SysInfo sys sysMonitor
TabStrip tab tabOptions
Text box txt txtLastName
Timer tmr tmrAlarm
Toolbar tlb tlbActions
TreeView tre treOrganization
UpDown upd updDirection
Vertical scroll bar vsb vsbRate

——————————————————————————–
推薦使用的資料訪問物件 (DAO) 的前綴
用下列前綴來指示資料訪問物件
資料庫物件 前綴 例子
Container con conReports
Database db dbAccounts
DBEngine dbe dbeJet
Document doc docSalesReport
Field fld fldAddress
Group grp grpFinance
Index ix idxAge
Parameter prm prmJobCode
QueryDef qry qrySalesByRegion
Recordset rec recForecast
Relation rel relEmployeeDept
TableDef tbd tbdCustomers
User usr usrNew
Workspace wsp wspMine

——————————————————————————–

套用程式頻繁使用許多選單控件,對於這些控件具備一群組唯一的命名約定很實用。除了最前面 “mnu” 標示以外,選單控件的前綴應該被延伸:對每一級嵌套增加一個附加前綴,將最終的選單的標題放在名稱字串的最後。下表列出了一些例子。

推薦使用的選單前綴
選單標題序列 選單處理器名稱
File Open mnuFileOpen
File Send Email mnuFileSendEmail
File Send Fax mnuFileSendFax
Format Character mnuFormatCharacter
Help Contents mnuHelpContents

當使用這種命名約定時,一個特定的選單群組的所有成員一個接一個地列在 Visual Basic 的「屬性」視窗中。而且,選單控件的名字清楚地表示出它們所屬的選單項。

為其它控件選取前綴

對於上面沒有列出的控件,應該用唯一的由兩個或三個字元群組成的前綴使它們標準化,以保持一致性。只有當需要澄清時,才使用多於三個字元的前綴。

常量和變量命名約定
除了對象之外,常量和變量也需要良好格式的命名約定。本節列出了 Visual Basic 支援的常量和變量的推薦約定。並且討論標識資料類型和範圍的問題。

變量應該總是被定義在盡可能小的範圍內。全局 (Public) 變量可以導致極其複雜的狀態機構,並且使一個套用程式的邏輯非常難於理解。全局變量也使代碼的重用和維護更加困難。

Visual Basic 中的變量可以有下列範圍

範圍 聲明位置 可見位置
過程級 過程,子過程或函數過程中的 『Private』 在聲明它的過程中
模組級 窗體或代碼模組(.frm、.bas )的聲明部分中的 『Private』 窗體或代碼模組中的每一個過程
全局 代碼模組(.bas)的聲明部分中的 『Public』 套用程式中的每一處

在 Visual Basic 的套用程式中,只有當沒有其它方便途徑在窗體之間共享資料時才使用全局變量。當必須使用全局變量時,在一個單一模組中聲明它們,並按功能分群組。給這個模組取一個有意義的名稱,以指明它的作用,如 Public.bas。

較好的編碼習慣是盡可能寫模組化的代碼。例如,若果套用程式顯示一個對話框,就把要完成這一對話任務所需要的所有控件和代碼放在單一的窗體中。這有助於將套用程式的代碼群組織在有用的元件中,並減小它執行時的開銷。

除了全局變量(應該是不被傳遞的),過程和函數應該僅對傳遞給它們的對象動作。在過程中使用的全局變量應該在過程起始處的聲明部分中標識出來。此外,應該用 ByVal 將參數傳遞給 Sub 過程及 function 過程,除非明顯地需要改變已傳遞的參數值。

隨著工程大小的增長,劃分變量範圍的工作也迅速增加。在類型前綴的前面放置單字母範圍前綴標明了這種增長,但變量名的長度並沒有增加很多。

變量範圍前綴

範圍 前綴 例子
全局 g gstrUserName
模組級 m mblnCalcInProgress
近端到過程 無 dblVelocity

若果一個變量在標準模組或窗體模組中被聲明為 Public,那麼該變量具有全局範圍。若果一個變量在標準模組或窗體模組中被分別聲明為 Private,那麼該變量有模組級範圍。

注意: 一致性是卓有成效地使用這種技術的關鍵;Visual Basic 中的語法檢查器不會擷取以 “p.” 開頭的模組級變量。

常量
常量名的主體是大小寫混合的,每個單詞的首字母大寫。儘管標準 Visual Basic 常量不包括資料類型和範圍訊息,但是象 i、s、g 和 m 這樣的前綴對於理解一個常量的值和範圍還是很有用的。對於常量名,應遵循與變量相同的規則。例如:

mintUserListMax   ‘對使用者清單的最大限制
‘(整數值,近端到模組)
gstrNewLine     ‘新行字元
‘(字串,套用程式全局使用)

變量
聲 明所有的變量將會節省寫程式時間,因為鍵入動作引起的錯誤減少了(例如,究竟是 aUserNameTmp,還是 sUserNameTmp,還是 sUserNameTemp)。在「選項」對話框的「編輯器」標籤中,復選「要求變量聲明」選項。Option Explicit 語句要求在 Visual Basic 程式中聲明所有的變量。

應該給變量加前綴來指明它們的資料類型。而且前綴可以被延伸,用來指明變量範圍,特別是對大型程式。

用下列前綴來指明一個變量的資料類型。

變量資料類型

資料類型 前綴 例子
String (字串類型) str strFName
Integer (短整數類型) int intQuantity
Long (長整數類型) lng lngDistance
Single (單精度浮點數類型) sng sngAverage
Double (雙精度浮點數類型) dbl dblTolerance
Boolean (布爾類型) bln blnFound
Byte (位元組類型) byt bytRasterData
Date (日期類型) dte dteNow
Currency (貨幣計算與定點計算類型) cur curRevenue
Object (物件類型) obj objCurrent
Variant (變體類型) vnt vntCheckSum

描述變量和過程名

變量或過程名的主體應該使用大小寫混合形式,並且應該足夠長以描述它的作用。而且,函數名應該以一個動詞起首,如 InitNameArray 或 CloseDialog。

對於頻繁使用的或長的項,推薦使用標準縮略語以使名稱的長度合理化。一般來說,超過 32 個字元的變量名在 VGA 顯示器上讀起來就困難了。

當使用縮略語時,要確保它們在整個套用程式中的一致性。在一個工程中,若果一會兒使用 Cnt, 一會兒使用 Count,將導致不必要的混淆。

使用者定義的類型
在一項有許多使用者定義類型的大工程中,常常有必要給每種類型一個它自己的三個字元的前綴。若果這些前綴是以 “u” 開始的,那麼當用一個使用者定義類型來工作時,快速識別這些類型是很容易的。例如,ucli 可以被用來作為一個使用者定義的客戶類型變量的前綴。

[返回索引]

4、在簡單的選取條件情況下,使用IIf()函數

羅索的代碼:
If nNum = 0 Then
sName = “sancy”
Else
sName = “Xu”
End If

簡單的代碼:
sName=IIf(nNum=0,”sancy”,”Xu”)

5、盡量使用Debug.Print進行除錯

在很多初學者的除錯中,用MsgBox來追蹤變量值.其實用Debug.Print不僅可以達到同樣的功效,而且在程式最後編譯過程中,會被忽略.而MsgBox必須手動註釋或刪除.

通常:
MsgBox nName

應該:
Debug.Print nName

6、在重複對某一對象的屬性進行修改時,盡量使用With….End With

通常:
Form1.Height = 5000
Form1.Width = 6000
Form1.Caption = “This is MyLabel”

應該:
With Form1
.Height = 5000
.Width = 6000
.Caption = “This is MyLabel”
End With
這種結構程式執行效率比較高,特別在循環語句裡。

7、MsgBox中盡量使用消息圖示,這樣程式比較有規範

一般來說

vbInformation 用來提示確認或成功動作的消息

vbExclamation 用來提示警示的消息

vbCritical 用來提示危機情況的消息

vbQuestion 用來提示詢問的消息

[返回索引]

8、在可能的情況下使用枚舉

枚舉的格式為
[Public | Private] Enum name
membername [= constantexpression]
membername [= constantexpression]
….
End Enum

Enum 語句包括下面部分:

部分 描述
Public 可選的。表示該 Enum 類型在整個工程中都是可見的。Enum 類型的預設情況是 Public。
Private 可選的。表示該 Enum 類型只在所聲明的模組中是可見的。
name 必需的。該 Enum 類型的名稱。name 必須是一個合法的 Visual Basic 標識符,在定義該 Enum 類型的變量或參數時用該名稱來指定類型。
membername 必需的。用於指定該 Enum 類型的群組成元素名稱的合法 Visual Basic 標識符。
constantexpression 可選的。元素的值(為 Long 類型)。可以是別的 Enum 類型。若果沒有指定 constantexpression,則所賦給的值或是是 0(若果該元素是第一個 membername),或是比其直接前驅的值大 1。

說明
所謂枚舉變量,就是指用 Enum 類型定義的變量。變量和參數都可以定義為 Enum 類型。Enum 類型中的元素被起始化為 Enum 語句中特殊的常量值。所賦給的值可以內含正數和負數,且在執行時不能改變。例如:

Enum SecurityLevel IllegalEntry = -1 SecurityLevel1 = 0 SecurityLevel2 = 1 End Enum

Enum 語句只能在模組層級中出現。定義 Enum 類型後,就可以用它來定義變量,參數或返回該類型的過程。不能用模組名來限定 Enum 類型。類模組中的 Public Enum 類型並不是該類的成員;只不過它們也被寫入到類型庫中。在標準模組中定義的 Enum 類型則不寫到類型庫中。具有相同名字的 Public Enum 類型不能既在標準模組中定義,又在類模組中定義,因為它們共享相同的命名空間。若不同的類型庫中有兩個 Enum 類型的名字相同,但成員不同,則對這種類型的變量的引用,將取決於哪一個類型庫具有更高的引用優先級。

不能在 With 塊中使用 Enum 類型作為目的。

Enum 語句示例
下面的示例演示用 Enum 語句定義一個命名常量的集合。在本例中是一些可以選取的彩色常量用於設計資料庫的資料輸入窗體。

Public Enum InterfaceColors
icMistyRose = &HE1E4FF&
icSlateGray = &H908070&
icDodgerBlue = &HFF901E&
icDeepSkyBlue = &HFFBF00&
icSpringGreen = &H7FFF00&
icForestGreen = &H228B22&
icGoldenrod = &H20A5DA&
icFirebrick = &H2222B2&
End Enum

好處是加快寫程式速度

VB.NET實現窗體圖標最小化到狀態欄

來源:http://big5.chinaz.com:88/www3.chinaz.com/Program/.NET/0P3133E2007.html

本文所使用的編程環境是Microsoft Visual Studio 2005,首先打開 Visual Studio。在文件 (File) 菜單上,單擊新建項目 (New Project)。 在新建項目 (New Project) 對話框的模板 (Templates) 窗格中,單擊 Windows 應用程序 (Windows Application)。單擊確定 (OK)。

想要將窗體圖標最小化時自動隱藏到任務欄,我們可以使用一個控件,這個控件的名字叫做NotifyIcon控件,打開左側的工具箱找到 NotifyIcon控件直接將它拖到窗體上。把NotifyIcon的Icon屬性設一下,當然ICON屬性你可以設置一個好看的圖標。

將下來單擊Form1窗體,進入屬性設置把Form的WindowState設成Minimized;ShowInTaskbar屬性設成False。圖2
接下來我們就要輸入代碼了 Chinaz.com

在Form的Resize代碼事件中,

 

以下為引用的內容:
Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize
If Me.WindowState = FormWindowState.Minimized Then
Me.Hide()
End If
End Sub

站長.站代碼的意思是讓窗體最小化的時候就自動隱藏到狀態欄。

這樣運行的時候窗體就會自動隱藏,出現在狀態欄了。

想雙擊圖標的時候顯示窗體的話可以設置NotifyIcon控件的DoubleClick代碼

代碼如下:

以下為引用的內容:
Private Sub NotifyIcon1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles NotifyIcon1.DoubleClick
Me.ShowInTaskbar = True
Me.Show()
Me.WindowState = FormWindowState.Normal
End Sub

如果我們想創建右鍵菜單的話,我們可以在窗體上添加一個ContextMenustrip控件,用NotifyIcon的ContextMenu屬 性進行關聯。在工具箱中選擇菜單和工具欄,直接將ContextMenu控件拖到窗體上進入屬性設置,輸入相應菜單關鍵字(自己想輸入的文字如下圖的軟件 版本等)。 Chinaz.com

  圖3

然後單擊窗體的NotifyIcon1控件,設置屬性,在contextmenustrip處選擇剛才編輯過的右鍵菜單ContextMenustrip1進行關聯請看圖4

然後按F5運行程序,點擊窗體最小化按鈕,窗體的圖標自動隱藏到狀態欄了。點擊右鍵你可以看到精美的右鍵菜單。 Chinaz.com

動態產生tableadapter的SQL SELECT 查詢

在OBS02DataSet_12.vb中自行撰寫:

Namespace OBS02DataSet1TableAdapters
Partial Public Class OBS12TableAdapter

Public ReadOnly Property DbCommandCollection() As IDbCommand()
Get
Return Me.CommandCollection
End Get
End Property

Public Function FillWhere(ByVal dataTable As DataTable, ByVal whereExpression As String) As Integer
Dim text1 As String = Me.CommandCollection(0).CommandText
Try
Me.CommandCollection(0).CommandText += " WHERE " + whereExpression
Return Me.Fill(DataTable)
Finally
Me.CommandCollection(0).CommandText = text1
End Try
End Function
End Class
End Namespace

用法:

Dim whereExpression As String = "lastname='batman'" '組WHERE字串
Me.OBS12TableAdapter.FillWhere(Me.OBS02DataSet_12.OBS12, whereExpression)