㈠ vb 用戶控制項
什麼是ActiveX控制項?
一個簡單的回答就是:擁有圖形界面的類。你可能曾經用過類來編程,那是一種實現代碼重用的的好方法。當然,它也提供了很多其它的好處,這兒並不打算一一列舉出來。ActiveX 控制項將這個概念近一步的深化了,能夠讓你編寫一個窗口小部件(widget),然後把它打包起來,在以後的程序里用到它,或者作為特定的問題的解決方法,給程序員提供更簡便的編程方法。 用ActiveX你可以建造「復合式」控制項,由其它的幾種控制項組合而成。也就是說,在ActiveX控制項中你不但可以使用VB中諸如文本框,圖片框之類的普通控制項,你還可以用其它的ActiveX控制項來構成你自己的控制項,實現你想要的功能,並把它打包以背後用。
ActiveX控制項的組成
一個ActiveX控制項由它的一些成員組成:屬性,方法以及事件。它們之間有什麼樣的邏輯關聯呢?還是用我們的身體來做個例子吧,將身體就看成一個ActiveX控制項。 這個控制項首先應該有一些屬性,比如:眼是否睜開屬性。顯然,這個屬性值應該有兩種情況:開或則閉。使用的時候能夠告訴「身體控制項」讓這個屬性換一個新的值,以決定睜眼或者閉眼,或者得到當前的屬性值,以知道目前的身體狀況。
方法是控制項中過程和函數的統稱,同其它任何的VB函數和過程並沒有什麼不同,你同樣可以向它們傳遞參數,並返回想要的值。假設有一個類描敘了身體這個對象,它應該有「Look」這個方法,並且應該能接受「Direction」這個參數,那麼,這個方法就應該寫成這樣:
Public Sub Look(Direction As Integer)
Select Case Direction
Case 0
'向左看
Case 1
'向右看
Case 2
'向前看
Case 3
'向後看
End Select
End Sub
若要求返回值,我們就舉一個「讀」的例子吧。這時你必須把「Read」這個方法聲明成函數而不是過程 :
Public Function Read() As String
'讀的一些操作
Read = "Hello from the World"
End Function
在身體控制項中,我們用的還是「Look」這個方法。當調用這個方法的時候,就是指定眼睛應該去「看」了。同樣,我們還指定了另外一個方法,「Read」。這一個方法將用來返回看到的東西。
「方法」這個概念是不是很簡單呢?如果你還不能夠理解,也可以這樣來想:你的控制項就像是一台機器,你撥動控制開關(輸入參數),轉動把手(調用方法),然後機器的燈閃動,運行起來(執行方法),最後從機器里蹦出一些東西(返回值),就是這樣了。但等等……如果你的機器想告訴你什麼事情,它該怎麼做呢?這時就該是「事件」出場了。
最後,身體控制項還會提供一個「眨眼」的事件,用來在進行眨眼這個動作的時候,通知開發者發生了這個事件,但是不必知道身體內部的工作方式和為什麼這個事件會被觸發。
來動手吧,作一個控制項。不要以為作一個控制項是非常難的事,雖然它和一般應用程序的編寫是有一點不同的地方。在上面我們已經知道,一個ActiveX控制項是由屬性,方法和事件組成的,我們先看看如何在程序中實現這些東西,然後再把它們聯系起來,組合成一個有機的整體。屬性最簡單的形式是用public聲明的公用變數。例如,如果把下面這段代碼放到你的控制項工程的聲明部分:
Public EyeOpen As Boolean
這樣,你就可以在後邊的代碼中使用這個屬性了。但是,這種屬性所能夠做的事實在太少了。它幾乎是不能夠正常工作的。因為在程序的設計期間,屬性值的任何變化都必須通知Visual Basic,以便把控制項實例標記為需要保存。而又因為屬性值可能顯示在多個地方,因此當屬性值發生改變時必須通知開發環境,以便使它能夠同步顯示「屬性」窗口、「屬性頁」對話框等位置上的屬性值。
上面說的是不是有點難理解呢?要是不明白說的什麼,不要急,你先打開一個工程,添加一個控制項,試著改改這個控制項的一些屬性,在來看看上面的話,是不是明白了呢?我們現在的任務,就是要作一個這樣的控制項啊。由此可以看出,控制項編程和一般的編程還是有一些區別的。那麼,該怎麼實現呢?這要使用到屬性過程。
當一個屬性值被引用或者設置的時候,屬性過程自動的被調用。下面我們就來添加一個這樣的屬性:打開代碼窗口,再點擊「工具」菜單,選擇「添加過程」子菜單,彈出的對話框中,填入過程名「EyeOpen」,然後再把類型設置為「屬性」。當你點了確定之後,VB自動的為你創建了一個屬性過程的原型,代碼會被添加到代碼窗口中:
Public Property Get EyeOpen() As Variant
End Property
Public Property Let EyeOpen(ByVal vNewValue As Variant)
End Property
剩下的你要做的,是寫入屬性處理代碼,把這個骨架填滿。
你可以看到,VB實際上為你寫了兩個,「Get」和「Let」屬性過程,有點疑惑嗎?實際上很簡單:「Get」是當屬性值被引用的時候調用的過程,而「Let」則是當屬性值被寫入的時候調用的。(事實上還有第三種類型的過程,我們將在後面遇到,這里先提個醒)要讓一個屬性過程能夠正確的工作,必須還要有一個變數來保存真正的屬性值。把下面這一行添加到聲明部分:
Private m_EyeOpen As Boolean
注意到那個'm_'前綴,一般是放在用戶控制項的內部變數之前。 現在該是填充過程框架的時候了。先看看Let過程,這個過程帶有一個參數:預設的是名字是vNewValue,variant類型。但我們想要一個布爾類型的變數而不是variant,因為眼睛在我們的模型中只有開和閉兩種狀態。所以把這個參數改成「New_EyeOpen As Boolean」。如果你想要這個屬性作為只讀屬性出現,那麼就不要再改動Let過程,讓過程體空在那兒。否則,當想要設置這個屬性值的時候,應該執行這樣的代碼:
Public Property Let EyeOpen(New_EyeOpen As Boolean)
m_EyeOpen = New_EyeOpen
PropertyChanged "EyeOpen"
'後面還可以寫一些相關的代碼,對屬性的設置做出反應
End Property
當要在程序中寫入屬性值的時候,就會調用這個函數,先把屬性值保存在一個私有變數裡面,然後執行PropertyChanged這個內部方法,它用來告訴Visual Basic屬性值有了變化,並觸發一個WriteProperties事件。關於這一點的具體的內容,在後面還會提到。
而Get過程更為簡單!它和標准函數沒有兩樣:
Public Property Get EyeOpen() As Boolean
EyeOpen = m_EyeOpen
End Property
做完這些就完了嗎?不!忘了前面說的屬性值是需要保存的,因此當編程會話發生轉換的時候,它們能夠保持下來。那麼怎麼樣來保存和取出屬性值呢?這時就要用到PropertyBag對象了。
使用PropertyBag
PropertyBag對象包含兩個方法:一個用來讀出,一個用來寫入。前面提到了,當任何的屬性發生變化的時候,會觸發控制項的WriteProperties事件。這時就可以把屬性值保存在屬性包中了。下面的代碼實現這個功能:
PropBag.WriteProperty "EyeOpen", m_EyeOpen, True
PropBag是PropertyBag對象的一個實例。WriteProperty函數包含三個參數,第一格是屬性名稱,後面的是要保存的值,最後的參數是在無用戶定義屬性的情況下,將寫入的默認值。把這個和ReadPropertiy方法的默認值設置結合起來,就可以為屬性值設置預設值了。如果屬性值和預設值相同,那麼屬性值就不會真正的被保存。當要讀出的時候,ReadProperty函數發現在屬性包中沒有內容,就會返回預設值。這樣可以節省一些系統開銷。要注意的是:必須將一個成員屬性的名稱作為字元串傳遞。當你將控制項作國際化處理時,不要改變這一字元串的名稱,它必須與該屬性的申明的名稱相匹配。
當控制項被重啟動後,你必須重載如所有保存的屬性值。當每次讀取PropertyBag中的數據時, ReadProperties事件被觸發。在這個事件的處理過程中,你要做的任務就是載入保存在屬性包中的屬性值,調用ReadProperty函數來實現這一點。要注意的是:在讀和寫兩個函數中的預設值設置要一樣。例如:
m_EyeOpen = PropBag.ReadProperty("EyeOpen", True)
一個同步預設值的方法是為其設置常量,在需要的時候直接使用常量來代替具體的值,這樣就不用擔心出問題了。例如:
Private Const m_def_EyeOpen = True
「m_def_」前綴通常放在預設值常量的前面。
當控制項被啟動的時候,一般要為屬性設置初始值。這一般是在usercontrol的InitProperties 事件中實現的。這個事件發生於控制項實例首次實體化時,也就是把控制項實例放置到窗體上的時候,它在以後的整個設計期間里都不會再發生。Usercontrol還有一個Initialize事件,它是每次控制項實例被創建時觸發的。顯然,初始化過程如果放在Initialize事件中就太過頻繁了,沒有這個必要。設計 ActiveX 控制項需要根本性地轉變一些觀念。需要響應的關鍵事件是往往不同於一般的程序設計。下面是我們想要實現的代碼:
Private Sub UserControl_InitProperties()
m_EyeOpen = m_def_EyeOpen
End Sub
好,到現在關於屬性的部分基本就結束了,下一篇中我們要講到的是另外的一個成員:方法。
事件是用來通知使用控制項的程序員,某件事情發生了,好讓程序員可以相應的處理。事件在VB編程中比比皆是,例如,當滑鼠點擊控制項時會發生Click事件,文本框內容改變了會發生Change事件,等等。但這兒要講的不同於這些東西,也不同於InitProperties, ReadProperties, WriteProperties前面提到過的事件,那些是系統已經定義好了的。我們要做的是定義自己的事件。自定義的事件必須聲明在模塊的聲明部分,然後就能夠在任何地方任何時候,只要你覺得應該有事件了,就可以觸發它。例如,一個代表眨眼的事件應該這樣聲明:
Public Event Blink()
在括弧中,你可以放置任何你想要傳遞給事件的參數。對於一個Click事件,這個參數可能滑鼠點擊時x和y坐標。而在這里,因為只是眨眼,就用不到額外的參數了。
觸發事件,得使用RaiseEvent方法。對於我們的眨眼事件,我們把它和一個計時器聯系起來,這樣它就能夠時不時的眨眼了:
Private Sub Blinker_Timer()
RaiseEvent Blink
End Sub
就這樣,一個事件就完成了,沒有任何技巧或者秘密可言。現在留給程序原作的,只要編寫相應的事件處理過程就行了,就像下面這樣:
Private Sub BodyControl1_Blink()
Debug.Print "嘻嘻,我又眨眼了!"
End Sub
到這兒,大部分關於ActiveX控制項的基本問題都講了。後面的將是一些更高級的內容,包括圖片和字體屬性,「關於」對話框,運行時之讀屬性等等。在繼續之前,再看看前面的內容,好好的在理解一下。好了嗎?OK,現在開始更為激動的歷程。
********************************************************************************************************************************
首先,我們先來看看對於屬性,還有什麼可以挖掘的東西,比如顏色或者圖片之類的東西。
高級屬性設計
色彩值被存貯在長整形變數中,但是如果你只是定義一個長整形變數,顯然是不能夠得到像vb中所提供的那個顏色選單:
這看起來很復雜,實際上做起來卻一點也不難:所有你要做的只是把屬性聲明為OLE_COLOR類型,就像下面這段代碼所作的那樣:
Public Property Get BackColor() As OLE_COLOR
BackColor = UserControl.BackColor
End Property
Public Property Let BackColor(ByVal New_BackColor As OLE_COLOR)
UserControl.BackColor = New_BackColor
PropertyChanged "BackColor"
End Property
記得前面曾經提過除了Let,Get,還有第三種屬性過程嗎?現在揭開迷底:它就是Set屬性過程,當要給對象變數賦值的時候,是不能用Let,而必須用Set來代替。這是因為保存在控制項內部的對象變數,保存的並不是對象的拷貝,而只是對象的引用,也就是一個內存地址了。為了同一般變數的復制保存區別開來,VB引入了Set屬性過程。
或許你可能知道:字體和圖片就是保存在對象中的,而且,它們都擁有各自的的對話框來設置相關屬性。要用到這些對話框,所有我們要作的就是把圖片或者字體申聲明為Picture或者Font對象類型,並且為其設置Set屬性過程。
Public Property Get Font() As Font
Set Font = lblText.Font
End Property
Public Property Set Font(ByVal New_Font As Font)
Set lblText.Font = New_Font
PropertyChanged "Font"
End Property
看看上面的代碼,你是不是在想:也沒有什麼很難的啊。確實,就是這樣簡單啊。下面,我們來看看如何為控鍵建立只讀屬性。這也是在控制項的設計中用的比較多的一個內容。
只讀屬性
最簡單的方法,就是不要在Let/Set屬性過程中加入任何東西。但通常,這並不能滿足要求,有時,你可能需要一個運行時只讀的屬性。所謂運行時——和設計時相對應,是指控制項最終在一個開發完成的程序中運行,而設計時指的是控制項被使用在開發程序的過程中。
要實現運行時只讀,要用到Usercontrol的AmbientProperties對象。它提供了很多關於控制項容器的屬性。中有一個UserMode屬性,當控制項處在運行時狀態時,UserMode值為真。通過在Let/Get過程中提供對UserMode的檢測,就可以很容易的實現運行是只讀屬性了:
Public Property Get MultiLine() As Boolean
MultiLine = m_MultiLine
End Property
Public Property Let MultiLine(ByVal New_MultiLine As Boolean)
If Ambient.UserMode Then
Err.Raise 382
Exit Sub
EndIf
m_MultiLine = New_MultiLine
PropertyChanged "MultiLine"
End Property
這段代碼保護屬性只能夠在設計時被修改,如果在運行時試圖改變它, 就會產生「Property is read-only at run-time」錯誤。
和AmbientProperties對象相近的還有Extender對象。對於Extender對象,在開始編寫控制項前有必要好好的了解。Extender對象是一個晚期綁定的借口,開發員可以通過它訪問由控制項容器(而不是控制項本身)維護和控制的控制項屬性。它提供了一些屬性,像Name,Enable,Left,Top,Height,Width等等,這些大多出現在一般的控制項中,在編寫控制項屬性前,應該看看是否已經存在在Extender對象中,一方面可以避免重復工作,另一方面也更有效率。
但是使用Extender對象還存在一些問題:並不是所有的容器都支持訪問相同的Extender屬性。所以選用Extender對象是必須十分小心,否這做出的控制項只能為特定的容器所使用。但如果你只是為VB開發控制項,那就不用有這些顧慮了,盡量的用吧。
還有一點要注意的是,Extender對象不能在usercontrol的initialize事件中訪問它,但是可以在initProperties和ReadProperties事件中使用。
枚舉
在控制項中設置屬性時,使用枚舉是一種很常見的的方式。它提供了一個下拉列表和若干選項讓你選擇。這樣方便了用戶的操作,又不用考慮過多的兼容性和錯誤處理問題,簡化了屬性設置,而且更加安全。
首先,必須建立一個枚舉結構,放在聲明部分。然後給出一系列的常量和對應的字元串。常量值可以零,或者是任何比它前面一個常量值大的整數。如果沒有給出常量,那麼VB自動為其賦值,第一個未指定的賦值為零,其它的值為前面一個數加一:
Public Enum eDirection
Left
Right = 1
Up
Down
End Enum
要實現枚舉屬性,必須創建一個帶有Let和Get屬性過程的標准屬性。這里的技巧是將屬性的類型聲明為給出的枚舉類型:
Public Property Get Direction() As eDirection
Direction = m_Direction
End Property
Public Property Let Direction(ByVal New_Direction As eDirection)
m_Direction = New_Direction
PropertyChanged "Direction"
End Property
唯一要注意的是,只能夠在設計時修改屬性列表,而不允許在運行時這么做。其它的,像讀,寫,保存和檢索,都和使用標准屬性是一樣的。
這就是所有的技巧了。難以置信的簡單,是嗎?你的控制項是不是看起來更為專業了呢?
Usercontrol對象
用 Visual Basic 所創建的 ActiveX 控制項總是由 UserControl 對象加上選中放到 UserControl 上的任何控制項(稱為子控制項或則組成控制項)所組成。就象 Visual Basic 窗體一樣,UserControl 對象具有代碼模塊以及可視化的設計器。將組成控制項放到 UserControl 對象的設計器上,就象把控制項放到窗體上一樣。 在窗體上放置 ActiveX 控制項的實例時,就創建了 UserControl 對象,以及放在 UserControl 設計器上的所有子控制項的實例。這些對象都被封裝在控制項中。
UserControl 對象有自己的屬性、方法和事件。對於一些屬性,像BorderStyle,BackColor等等,與其自己寫代碼來實現 BackColor 屬性,不如就直接使用UserControl對象的。這就意味著 ActiveX 控制項的 BackColor 屬性只需要簡單地調用 UserControl 對象的 BackColor 屬性就行了。同樣地,也可以在UserControl 對象現有的 Click 事件的基礎上設計您的控制項的 Click 事件。
事實上在前面的內容中,我們時時都在和這個對象打交道,但是它有一些特別的東西,是應該值的多一些注意的。它的大部分屬性應該在控制項的設計時來完成設置。在這兒我解釋一些比較晦澀難懂得屬性的含義,還有一些一望既知,就不多費口舌了。
Alignable屬性,當被設置成真的時候,VB將自動為控制項添加一個新的屬性:align。這樣就能夠像放置工具條那樣安排控制項在容器中的位置,而且這還意味著你的控制項能夠被放置在MDI程序中。
CanGetFocus屬性,能夠決定用戶控制項是否能夠在運行時獲得焦點。當要創建一個圖形控制項,或者像Timer那樣在運行是不可見的控制項時,就要設置這個值為False。要注意的是:只要控制項至少包含一個設置為能夠接收焦點的子控制項,CanGetFocus 屬性就不能設置為 False。如果 CanGetFocus 設置為 False,則其所有的子控制項都不能設置為接收焦點。
ControlContainer屬性定義一個控制項是否能夠像frames或者PictureBoxes控制項那樣作為控制項容器包含其它的控制項。
DefaultCancel 屬性可以為控制項添加Default和 Cancel屬性。在添加 Default 和 Cancel 屬性後,控制項就可充當標准命令按鈕。也就是說當Default被設為Ture後,按下回車鍵會觸發控制項的click事件,而當Cancel屬性被設為Ture時,Esc鍵按下也會觸發click事件。
你可以通過檢查AmbientProperties對象的DisplayAsDefault屬性來知道控制項是不是預設控制項。
InvisibleAtRuntime能夠讓你建立像Timer之類的控制項,在運行的時候是不可見的。
最後,ToolboxBitmap 屬性用來指定放在VB工具箱上的圖標的。微軟建議的大小是32x32,但是實踐證明23x23或24x24工作起來更好,32x32是被縮放到那麼大了再顯示出來的。
屬性的屬性
說起來有點繞口,也有點費解,是嗎?。VB允許為控制項的每個成員設置屬性。這裡麵包含了一些較高級的內容,能夠讓你建造更為專業化的控制項。在菜單欄中點擊工具|過程屬性,會出現下面的對話框:
你可以在描敘框內輸入一段對控制項的說明,在幫助上下文標識符內輸入一個幫助的關聯ID號,將你的控制項與一個幫助文件關聯起來,這樣當點了屬性後再按F1鍵就可以給出這個屬性的幫助內容。
利用「在屬性瀏覽其中使用本頁」欄位,可以給控制項的定製屬性頁分配選定的號碼。這樣當用戶從VB的屬性瀏覽器中選擇該成員時,VB將直接線是屬性頁。 「屬性分類」欄位能夠讓屬性在VB的屬性瀏覽器的「按分類序」模式中出現在特定的類別下。這些類別包括外觀,字體,位置,雜項等等,只要選擇一項就行了。「隱藏該成員」可以讓屬性不在屬性瀏覽器中顯示出來,這對於一些不想讓用戶看到得公有成員有用,但是要記住,它只是隱藏而不是不許被使用。而利用「在屬性瀏覽器中不顯示」可以在控制項的設計時(而不是在運行時)把屬性從屬性瀏覽器中去掉。作為一般的原則,任何用ReadProperties和WriteProperties實現的永久的屬性,都應當被屬性瀏覽器顯示出來,反之,任何非永久性的屬性就不應被顯露出來。
「預設用戶界面」用來設置控鍵的預設屬性和方法。比如,因為Caption屬性是Lable控鍵的預設屬性,那麼就可以對代碼進行一些簡化,把
Label1.Caption = "Hello"
可以簡寫為:
Label1 = "Hello"
最後是關於數據綁定的部分。在VB中,資料庫的應用是很常見的。利用MS的數據訪問功能,可以很容易的把控制項屬性和資料庫的欄位聯系起來。當選擇了「屬性為數據綁定」和「綁定屬性到數據欄位」兩個復選框後,該屬性就可以以標准綁定控鍵的方式運行,這意味著你可以在為該屬性選擇資料庫控制項和欄位名稱。
最後的話
到這兒,幾乎大部分和用戶控制項有關的內容都講完了。你現在就可以開始為自己的程序定製合適的控制項,還可以讓別人分享你的成果。雖然內容不是很多,但要完全吃透也不是件容易的事。所以,多看多練還是必要的,學無止境嘛。
當然,沒有十全十美的東西,對於ActiveX控制項也是這樣的。合理的使用用戶控制項是必須要注意的事情。ActiveX控制項很容易就會變得很復雜,一不小心的話,你所付出的會遠遠多於你所得到的。
如果你只是想要一個帶有屬性和方法的對象,那麼類或許是更好的選擇。用戶控制項與應用程序間相對復雜的介面,會佔用較多的資源。而在編程方面,控制項也要比類復雜一些。但是如果你要求屬性,方法和事件實現永久的數據存貯,後者要在程序的外部實現組件更新,那麼就要用到用戶控制項了。總之,不要以為這是一件容易的事。雖然我在這兒講得很簡單,但是對一個完整的用戶控制項的設計,編寫,以及測試和調試所作的工作,絕對不會比一個一般的VB應用程序來的少。
㈡ VB6.0編程軟體簡介
VB 就是 Visual Basic 的意思,是一種常用的編程開發工具。它的基礎是編程語言Basic ,Visual Basic 簡單點來說就是微軟為了更好的讓人們學習編程,應用上 Basic 開發語言的一套工具,簡稱就是 VB。VB 的面世使原本極其復雜困難的編程、軟體開發的工作變得簡單。最初的編程工作都是依靠全套的代碼去進行的,工程量極大。Microsoft 就是看準了這個人們渴求快速發展軟體開發行業的商機,利用自己的技術實力研發出 VB 這么一套完善的編程工具。VB 把過往的純代碼編程過度到可視化編程,將一些經常要使用到的功能以一個個的控制項的形式出現,例如 Label(標簽)、TextBox(文本框)等等的。他們在以前的編程工作中需要在使用時重復多次的輸入同樣的代碼去實現這個功能,而這些代碼去不是小工程,耗費了很大的人力物力和很多的時間。所以有了 VB 之後,編程的工作也就可以普及啦,可以免去了機械的重復的代碼的輸入,又可以一面編輯核心功能一面進行界面優化美化,一勞多得啊。[1]
VB 是 Basic 語言軟體開發者的首選編譯器,是學習 Basic 語言編程必須要接觸而且是經常接觸的一款整合型技術編譯器。編輯本段語言特性VB的中心思想就是要便於程序員使用,無論是新手或者專家。VB使用了可以簡單建立應用程序的GUI系統,但是又可以開發相當復雜的程序。VB的程序是一種基於窗體的可視化組件安排的聯合,並且增加代碼來指定組建的屬性和方法。因為默認的屬性和方法已經有一部分定義在了組件內,所以程序員不用寫多少代碼就可以完成一個簡單的程序。過去的版本裡面VB程序的性能問題一直被放在了桌面上,但是隨著計算機速度的飛速增加,關於性能的爭論已經越來越少。窗體控制項的增加和改變可以用拖放技術實現。一個排列滿控制項的工具箱用來顯示可用控制項(比如文本框或者按鈕)。每個控制項都有自己的屬性和事件。默認的屬性值會在控制項創建的時候提供,但是程序員也可以進行更改。很多的屬性值可以在運行時候隨著用戶的動作和修改進行改動,這樣就形成了一個動態的程序。舉個例子來說:窗體的大小改變事件中加入了可以改變控制項位置的代碼,在運行時候每當用戶更改窗口大小,控制項也會隨之改變位置。在文本框中的文字改變事件中加入相應的代碼,程序就能夠在文字輸入的時候自動翻譯或者阻止某些字元的輸入。VB的程序可以包含一個或多個窗體,或者是一個主窗體和多個子窗體,類似於操作系統的樣子。有很少功能的對話框窗口(比如沒有最大化和最小化按鈕的窗體)可以用來提供彈出功能。VB的組件既可以擁有用戶界面,也可以沒有。這樣一來伺服器端程序就可以處理增加的模塊。VB使用引用計數的方法來進行垃圾收集,這個方法中包含有大量的對象,提供基本的面向對象支持。因為越來越多組建的出現,程序員可以選用自己需要的擴展庫。和有些語言不一樣,VB對大小寫不敏感,但是能自動轉換關鍵詞到標準的大小寫狀態,以及強制使得符號表入口的實體的變數名稱遵循書寫規則。默認情況下字元串的比較是對大小寫敏感的,但是可以關閉這個功能。VB使得大量的外界控制項有了自己的生存空間。大量的第三方控制項針對VB提供。VB也提供了建立、使用和重用這些控制項的方法,但是由於語言問題,從一個應用程序創建另外一個並不簡單。編輯本段術語在討論 Visual Basic(不包含 .NET)時,經常可以聽到以下這些術語,因此掌握這些術語的基本理解對初學者十分有幫助。控制項:簡單的說,控制項就是構成或者說建造 Visual Basic 應用程序的圖形化工具,包括窗體、按鈕、復選框、列表框、數據控制項、表格控制項和圖片控制項等等……事件:由用戶或操作系統引發的動作,例如擊鍵、單擊滑鼠(Click)、雙擊滑鼠(DblClick)、一段時間的限制,或從埠接收數據。方法:嵌入在對象定義中的程序代碼,它定義對象怎樣處理信息並響應某事件。例如,資料庫對象有打開記錄集並從一個記錄移動到另一個記錄的方法程序的基本元素,它含有定義其特徵的屬性,定義其任務和識別它可以響應的事件的方法。控制項和窗體是Visual Basic中所有對象的示例。物件:一個控制項、窗體等都可被看作一個物件。過程:為完成某些特定的任務而編寫的代碼段,過程通常用於響應特定的事件,也可以當作應用程序的用戶自定義函數來使用。屬性:屬性是組成用戶界面的各對象的性質的具體描述。例如上述「物件」中所提到的尺寸、位置、顏色、寬度、高度等等都稱為控制項的屬性。屬性決定物件的外觀,有時也決定物件的行為。物件的屬性絕大部分是VB中已經事先定義好的,但也有的屬性是需要在應用過程中才去定義的。屬性即可為物件提供數據,也能從物件取回信息。·窗體的常用屬性現在,我列舉出了一些窗體的常用屬性,請你對它們先進行一下感性認識。
名稱是窗體的標識名,代碼中稱它為Name。BackColor:設置窗體背景顏色。BorderStyle:設置窗體的邊框風格。(見圖一)要請注意的是,屬性值為1 - Fixed Single 與 3 - Fixed Dialog 時,窗體外觀相同,但功能卻不同。當屬性為1 - Fixed Single 時,MaxButton與MinButton這兩個屬性可以起作用。MaxButton為True時窗體上具有了最大化按鈕。MinButton為True時最小化按鈕也有效了。而當屬性為3 - Fixed Dialog時,MaxButton與MinButton屬性不起作用。此時MaxButton與MinButton為True,但最大化、最小化按鈕均為出現。(圖一)Caption:設置窗體標題欄上的文字。ControlBox:設置窗體標題欄上是否具有控制菜單欄及按鈕。Enabled:決定運行時窗體是否響應用戶事件。在程序運行時可以看到改變 Enabled屬性的效果。此時Enabled已設為False,所以點擊按鈕不會有反應。Height:設置窗體的高度。Width:設置窗體的寬度。Left:設置程序運行時窗體的水平位置Top:設置程序運行時窗體的垂直位置Visible:設置程序運行時窗體是否可見。當Visible為False時,窗體是不可見的。將值改為為True。運行時窗體就是可見的了。WindowsState:設置程序運行中窗體的最小化、最大化和原形這三種狀態。程序運行時的最小化狀態。Icon:設置窗體標題欄上的圖標。Picture:給窗體配上漂亮的點陣圖。最後要說明的是:窗體的Name和Caption屬性,雖然預設值相同,都是Form1,但實際意義卻不一樣。Caption指的窗體標題欄上的文字,Name指這個窗體的對象名,千萬不能混淆。
㈢ 有哪些打包工具可以把VB里的控制項打包了,安裝時就自動注冊那些控制項呢
VB自帶的Package & Deployment 向導就相當不錯。
(當然你不能只裝一個VB簡化版)
路徑一般在VB98\Wizards\PDWizard中。
打包時全選就行了。
㈣ VB如何實現打開軟體最大化且控制項隨之變化
創建一個PictureBox,改變它的變數Align,然後在它的Resize事件里輸代碼就行!如果用Form_Resize,那麼最大化時Resiza並未觸發。
㈤ VB中怎樣編一個自動按鍵盤的軟體~
參考了前輩們的文章,得到了sendinput的一個小實例,先學習了:
這個是真正的模擬按鍵,跟sendkeys完全不同哦~~~注意在按下form中的按鈕後,迅速切換到自己的程序中測試。
'form中放一個command1和一個timer,為了方便演示,建議放一個text1在form中
Const VK_A = 65
Const KEYEVENTF_KEYUP = &H2
Const INPUT_MOUSE = 0
Const INPUT_KEYBOARD = 1
Const INPUT_HARDWARE = 2
Private Type MOUSEINPUT
dx As Long
dy As Long
mouseData As Long
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Private Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Private Type HARDWAREINPUT
uMsg As Long
wParamL As Integer
wParamH As Integer
End Type
Private Type GENERALINPUT
dwType As Long
xi(0 To 23) As Byte
End Type
Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Sub SendKey(bKey As Byte)
Dim GInput(0 To 1) As GENERALINPUT
Dim KInput As KEYBDINPUT
KInput.wVk = bKey 'the key we're going to press
KInput.dwFlags = 0 'press the key
' the structure into the input array's buffer.
GInput(0).dwType = INPUT_KEYBOARD ' keyboard input
CopyMemory GInput(0).xi(0), KInput, Len(KInput)
'do the same as above, but for releasing the key
KInput.wVk = bKey ' the key we're going to realease
KInput.dwFlags = KEYEVENTF_KEYUP ' release the key
GInput(1).dwType = INPUT_KEYBOARD ' keyboard input
CopyMemory GInput(1).xi(0), KInput, Len(KInput)
'send the input now
Call SendInput(2, GInput(0), Len(GInput(0)))
End Sub
Private Sub Command1_Click()
Timer1.Enabled = Not (Timer1.Enabled)
End Sub
Private Sub Form_Load()
Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer()
SendKey VK_A
End Sub
㈥ vb 表格控制項 詳解
表格控制項使用MSFlexGrid 控制項
控制項的添加
(1) 如圖。在vb左邊的工具欄上點右鍵選部件,在部件窗口中選擇flexgrid控制項,確定後就可以看到控制項圖標被添加到了工具欄。
(2)TextMatrix 屬性
返回或設置一個任意單元的文本內容。
語法:object.TextMatrix(rowindex, colindex) [=string]
示例:MSHFlexGrid1.TextMatrix(1, 2) =Rnd()
(3)MouseCol、MouseRow 屬性
按行和列坐標返回滑鼠的當前位置。
語法:object.MouseCol [=value] object.MouseRow [=value]
========MSFlexGrid 《方法》《方法》 =========
(1)AddItem 方法:將一個行添加到 MSHFlexGrid 控制項中。不支持命名參數。
語法:object.AddItem (string, index, number)
AddItem方法的語法包含以下部分:
部分 | 描述 |
object | 對象表達式,其值是「應用於」列表中的對象。 |
item | 字元串必需的。字元串表達式,它在新增行中顯示。可以用製表符(vbTab) 來分隔每個字元串,從而將多個字元串(行中的多個列)添加進去。 |
Index | 可選的。Long類型,它代表了控制項中放置新增行的位置。對於第一行來說,index= 0。如果省略index,那麼新增行將成為帶區中的最後一行。注意index是MSHFlexGrid中的BandColIndex。 |
number | 可選的。Long值,指出添加行的帶區號。 |
(2)RemoveItem 方法
運行時從 MSHFlexGrid 中刪除一行。這一屬性不支持命名的參數
語法:object.RemoveItem(index, number)
RemoveItem 方法的語法包含如下部分:
部分 描述
object 一個對象表達式。
index 一個整數,表示 MSHFlexGrid 中要刪除的行。對於第一行,index=0。
number 一個 Long值,指定要從中刪除行的帶區。
說明
這一方法刪除指定的整個行。要不刪除行來清除數據,使用 Clear 方法。
在包含子記錄的帶區內刪除一個行時,子記錄被自動地刪除。
示例
在該示例中,用 AddItem 方法將 100 項添加到 MSHFlexGrid 中。要試用此例,可以將代碼粘貼到窗體(該窗體帶有命名為 MSFlexGrid1 的 MSHFlexGrid 控制項)的聲明部分,然後按下 F5 鍵,並單擊該窗體。
Private Sub Form_Click ()
Dim Entry, i, Msg '聲明變數。
Msg = "Choose OK to add 100 items to your MSFlexGrid."
MsgBox Msg '顯示消息。
MSHFlexGrid1.Cols = 2 '每行有兩個字元串。
For i = 1 To 100 '從 1 計數到 100。
Entry = "Entry " & Chr(9) & I '創建項。
MSHFlexGrid1.AddItem Entry '添加項。
Next
Msg ="Choose OK to remove every other entry."
MsgBox Msg '顯示消息。
For i =1 To 50 '決定怎樣刪除
MSHFlexGrid1.RemoveItem i '其它每一項。
Next
Msg ="Choose OK to clear all items."
MsgBox Msg '顯示消息。
MSFlexGrid1.Clear '清除列表框。
End Sub
編輯花了很大力氣,望採納!
㈦ 請問VB怎麼自動注冊控制項
你可以在程序運行時執行以下語句注冊控制項:
Shell "REGSVR32 MSDATGRD.OCX /S",VBHIDE
Shell "REGSVR32 MSADODC.OCX /S",VBHIDE