vb動態建立控制元件
要證明你經過了合法的授權有下面幾種方法:
在窗體上放置一個控制元件。這也是最簡單的方法。你完全沒有必要將這個窗體顯示出來。
將相關的控制元件新增到工具箱中,然後在"工程屬性"對話方塊的"生成"標籤頁中取消選擇"刪除有關未使用的ActiveX控制元件的資訊"這一項。
向Licenses集合新增一個元素。例如:Debug.Print Licenses.Add("MSMask.MaskedEdBox")
僅僅建立了控制元件並不足夠
要建立一個數據驅動窗體,僅僅知道動態建立控制元件還不夠。例如:現在你要建立一個能根據資料庫中表的不同欄位自動生成控制元件的窗體。該窗體可能會建立單行文字框,其長度隨欄位長度不同而不同;也可能會建立單選按鈕或複選按鈕以顯示布林型欄位;甚至可能建立一個多行文字框顯示備註型欄位。
你需要解決的第一個問題是:文字框控制元件的Multiline屬性在執行時是隻讀的,只在設計時可用。幸好,微軟的Microsoft Windowless Controls 6.0可以解決這個問題。這組控制元件集包括了輕量級的TextBox,ComboBox,ListBox,CheckBox,OptionButton,CommandButton和兩個scrollbar控制元件。這些控制元件與VB內建的相應的控制元件最大的區別在於:這些控制元件的所有屬性在執行時是可讀寫的。在VB的安裝光碟中的Common\Tools\VB\WinLess資料夾中可以找到這個控制元件組。用下面的程式碼可以建立一個多行文字框:
Dim WithEvents txtEditor As MSWLess.WLText
Private Sub CreateEditor()
Set txtEditor = Controls.Add( "MSWLess.WLText", "txtEditor")
txtEditor.Move 0, 0, 4000, 4000
txtEditor.MultiLine = True
txtEditor.ScrollBars = wlBoth
txtEditor.Visible = True
End Sub
另外一個問題比較複雜:在事先不知道要建立多少個控制元件的情況下,如何給每個對新建立的控制元件的引用分配唯一的帶WithEvents關鍵字的變數。換句話說就是要對新建立的控制元件的事件進行程式設計,前提是你在設計時不知道程式會建立多少個控制元件。使用物件陣列顯然不行,因為不能用WithEvents關鍵字宣告一個物件陣列;更壞的情況是,資一個變數定義為As Control或As Object也不行,因為還是不能用WithEvents。
問題源自於我們無法在執行時捕獲一個物件陣列事件。所以我們只能採取曲線救國的辦法。所要的編寫的程式碼可能比你想象的多,不過這個解決方法很有趣,值得我們這樣去做。
我們需要兩個輔助類模組來捕獲事件,分別取名為ControlItems和ControlItem。ControlItems是一個集合類,其中儲存了ControlItem物件及其數量。該數量等於你所要對之程式設計的控制元件的數量。ControlItem類的每一份例項捕獲控制元件產生的事件,然後呼叫在其所屬的ControlItems集合類中的過程,最後由ControlItems在窗體中觸發事件並執行事件中的程式碼。整個過程如下圖所示:
捕獲多個控制元件的事件
為簡單起見,假設你要捕獲來自所有的動態新增到窗體上去的控制元件的Validate事件。為完成這個工作,ControlItems集合類必須向父窗體展示該事件,並隨時準備接收來自其子ControlItem類的通知以觸發事件。程式碼如下:
Event Validate(CtrlItem As ControlItem, Cancel As Boolean)
Private m_ControlItems As New Collection
' 向集合中新增一個新的ControlItem專案
Function Add(ctrl As Control) As ControlItem
Dim newItem As New ControlItem
newItem.Init ctrl, Me ' 新增到私有類
m_ControlItems.Add newItem ' 返回新專案給呼叫者
Set Add = newItem
End Function
Friend Sub Notify_Validate(Item As ControlItem, Cancel As Boolean)
RaiseEvent Validate(Item, Cancel)
End Sub
ControlItem類必須捕獲來自動態新增到窗體中的控制元件的事件,並通知其所屬的ControlItems集合類。很顯然,ControlItem類必須有一個用WithEvents關鍵字定義的變數來引用真正的控制元件。這意味著你不能將變數宣告為As Control或As Object。如果你決定在窗體中所動態新增的控制元件不使用VB內建的控制元件的話,這個問題的解決辦法相當的簡單。你只需要將變數宣告為VBControlExtender型別就行了。對於建立資料驅動窗體來講,不使用VB內建的控制元件並不是一件大不了的事。
將變數宣告為VBControlExtender,並加上WithEvents關鍵字,你就能直接捕獲Validate,GotFocus,LostFocus,DragDrop和DragOver這幾個事件了。如果要捕獲其它更多的事件,你可以使用ObjectEvent。下面是ControlItem類模組中的程式碼:
Public WithEvents Ctrl As VBControlExtender
' 所屬的ControlItems物件
Dim m_Parent As ControlItems
Sub Init(ctl As Object, parnt As ControlItems)
Set Ctrl = ctl
Set m_Parent = parnt
End Sub
Private Sub Ctrl_Validate(Cancel As Boolean)
' 通知所屬的ControlItems類
m_Parent.Notify_Validate Me, Cancel
End Sub
將下面的程式碼放入窗體中,就可以捕獲動態新增的控制元件所產生的事件了:
Dim WithEvents CtrlItems As New ControlItems
Private Sub cmdCreateControls_Click()
Dim ctrl As Control
' 建立兩個文字框並將它們新增到ControlItems集合?
相關推薦
vb動態建立控制元件
例如,當你要新增一個TreeView控制元件時,VB會要求你證明你已經得到了合法的授權來建立該控制元件的例項。換句話說,VB要證明這個控制元件是買來的,而不是從其它附有該控制元件的程式中借來的。 要證明你經過了合法的授權有下面幾種方法: 在窗體上放置一個控制元件。這也是最簡單的方法。你完全沒有
動態建立控制元件的序列化與反序列化
public Button Btn = new Button(); //序列化儲存 savedButton = XamlWriter.Save(Btn); //反序列化 還原 if (!string.IsNullOrEmpty(savedButton
excel動態建立控制元件
分配上單擊VBA函式到一個Excel的Userform中動態建立的按鈕 Sign InTop AuthorsTerms of ServiceContact UsBlog .htaccessAdmin Home English Language Content分配上單擊
動態建立控制元件佈局與自動大小跟隨
有人認為用寫的動態建立控制元件很高階,其實我更喜歡拖放控制元件進行各種屬性和事件設定很方便,而不是用寫的進行各種屬性和事件的設定,結合以前寫的例子,對各類設定做了歸類,比較方便集中寫作。 using System; using System.Collections.
MFC動態建立控制元件--CStatic
1.動態建立CStatic文字控制元件 建立方法:CStatic::Create BOOL Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, C
Qt動態建立控制元件並實現佈局
最近搞的一些需求有相關的設計,從網上找來一段程式碼,受到一些啟發,記下來備用。 有相關需求的可以參考 直接上程式碼: if(icreateControlNum<=display_num_Line) { rownum=1; display_num_Line=icr
MFC動態建立控制元件(按鈕)及新增訊息響應
動態控制元件是指在需要時由Create()建立的控制元件,這與預先在對話方塊中放置的控制元件是不同的。 一、建立動態控制元件: 為了對照,我們先來看一下靜態控制元件的建立。 放置靜態控制元件時必須先建立一個容器,一般是對話方塊,這時我們在對話方塊編輯視
在C++Builder中動態建立控制元件
當開發類似解釋程式或實現視覺化操作功能等一類的應用程式時,都需要動態地建立控制元件(物件),而且還要為這些控制元件新增適當的事件處理程式,下面將介紹在C++Builder中如何實現基本的實現框架。 動態建立控制元件的一般過程: TButton *btn = new TBu
ListView動態建立控制元件、新增資料(單個Activity)
因為專案需要這個功能,所以先寫了個Demo測試一下,Java學了半吊子然後直接上Android做專案,各位大神可以提出點意見,小弟虛心接納。這裡的刪除按鈕還沒實現功能,時間不夠了得回宿舍睡覺了,不想熬夜太難受。先上效果圖:下面說實現的大體思路:1、首先在 MainActivi
Delphi 動態建立控制元件,賦值,使用
uses 中定義: type TMyComponent = class(TComponent) public item1, item2, item3, item4, item5, item6: string; constructor Crea
C++ Builder 動態建立控制元件
當開發類似解釋程式或實現視覺化操作功能等一類的應用程式時,都需要動態地建立控制元件(物件),而且還要為這些控制元件新增適當的事件處理程式,下面將介紹在C++Builder中如何實現基本的實現框架。動態建立控制元件的一般過程: TButton *btn = new TButt
WPF 後臺動態建立控制元件
一、基本控制元件: 1、 Grid 2、 StackPanel 3、 Border 4、 Button 5、 CheckBox 6、 ComboBox 7、 DataGrid 8、 Image 9、 Label 10、
在VB中建立和使用動態陣列控制元件的方法總結
在VB中,MSHFEXGRID不支援文字框,為了解決這個問題,一般的方法就是通過一個文字框的顯示和隱藏,並獲得表格單元的座標,來實現向MSHFLEXGRID中錄入資料的,具體方法我記得在本博中有,就不說了,自己搜一下 今天要說的是在MSFLEXGRID中動態新增多個控制元件
動態生成控制元件-繫結事件(VB.NET/C#)
動態生成控制元件後繫結事件的語句: C#:TextBox tbb=new TextBox();tbb.ID="tb";tbb.Width=80;tbb.AutoPostBack=true;tbb.Tex
VB.NET實現動態載入控制元件陣列
vb.net中沒有控制元件陣列,它也不主張用控制元件陣列,因為它對記憶體的開銷非常大。控制元件陣列問題在.NET中完全有其它方法代替。如果一定要用 for i as integer to 20
關於在VB中動態載入控制元件的方法
動態載入控制元件,有諸多好處, 以前以為,只有在VC中才能動態載入控制元件,而在VB中,只能定義一個數組,然後採用Load方式載入。近日編碼,才發現,原來VB中也可以方便的動態載入。 舉例子總結一下,免得以後到處查: 1:動態載入VB固有的控制元件。 如:載入一個文字框
Delphi 程式碼建立控制元件與事件動態繫結
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TF
OFFICE 無法建立控制元件,因為它未經正確授權
近來在XP環境下執行excel,新增winsock控制元件時,提示“無法建立控制元件,因為它未經正確授權”,經過多方搜尋解決了此問題。 原來excel的部分控制元件執行需要相應的授權。那麼如何授權呢?發現安裝了VB6的系統可以正常新增 winsock控制元件,說明vb6會
vb中MSHFlexgrid控制元件小總結
MSHFlexgrid控制元件的屬性有很多,現在我就簡單寫一些關於現在咱們正需要用到的屬性,希望這些解釋可以加深大家的理解。 row :指表格的行 rows: 表格的總行數 rowsel:選中行數,可以為一個範圍多行
執行緒間操作無效: 從不是建立控制元件“XXX”的執行緒訪問它 [Winform]執行緒間操作無效,從不是建立控制元件的執行緒訪問它的幾個解決方案,async和await?
方法1 Invoke((MethodInvoker)(()=>{XXX.Text = message;})); 方法2 取消跨執行緒檢查 Control.CheckForIllegalCrossThreadCalls = false;