2016-07-28 67 views
3

在VB6中,UserControl可以編譯爲OCX,然後作爲引用組件包含在另一個項目中。或者,UserControl源本身(即CTL文件)可以直接包含在EXE或DLL項目中。VB6 UserControls:項目中OCX與包含之間的差異

這兩種方法之間有一個好奇的區別。當從OCX中使用時,Extender propertiesmore)的列表將無縫地與爲控件定義的任何自定義屬性合併。但是從CTL使用時,這似乎並不是這種情況。試圖在控件上使用Extender屬性會產生編譯器錯誤。

一個示例是.Tag屬性。當作爲OCX引用時,此屬性在Intellisense中可用並編譯成功。但是當使用CTL時,這個屬性的完全相同的用法會產生編譯時錯誤。

其他例子是.Left.Top,等我預料VB6治療Extender屬性一樣的,不管控制是如何包括在內。

爲什麼這種差異存在,是否有任何修復? (注意:作爲解決方法,當需要訪問Extender屬性時,我一直指代代碼中的控件類型爲Object,但理想情況下,我更願意使用實際類型來實現清晰性和編譯時安全性。)

+0

OCX是一個有趣的名字的DLL文件。您使用COM來訪問它。 VB6有它自己的內部COM用於內部的東西,有點快。也許這是不同之處。 – 2016-07-31 07:08:56

+0

@Noodles如果是這樣,它似乎是一個異常的區別。我知道的每一個其他案例,將代碼捆綁到EXE與編譯到單獨的DLL/OCX中沒有區別。 – DaveInCaz

+0

這是他們訪問的框架的區別。這只是一個假設。但它是CTL和DLL之間的區別 – 2016-08-01 00:57:26

回答

0

它在程序中根本沒有真正的差異。它被編譯到程序中,所以它與控制程序的差異鏈接在一起,也許你有一些錯誤的代碼,這些代碼在外部控制下不會被注意到或不是非法的。 但是,如果您使用控件運行某些程序,則會節省內存,導致爲該控件編寫的代碼僅加載一次。你也可以單獨改變控件,你只需要編譯一次(如果你爲其他人編寫程序,他們只需要更新改變的可改變的)。

0

如果您擁有駐留在項目中的控件的源代碼,那麼在與控件進行交互時(運行其代碼),您將在逐步調試中逐行看到它。

如果您正在逐步調試不在控件中的代碼,這會真的讓您放慢速度。因此,一旦您的控件運行穩定,就需要編譯它並使用OCX引用,直到需要更改控件爲止。

相關問題