在VB6中,是否可以在不将控件放在表单上的情况下使用控件?

3

我对这个问题的答案非常确定,但是我正在尝试各种方法来使一个非常顽固的项目能够工作。其中一个想法是尝试通过控件运行代码而不在表单中定义它。

因此,例如,我的原始代码看起来像这样:

frmProcess.MyViewer.MaxPageSize = 100
frmProcess.MyViewer.ResetPages
frmProcess.MyViewer.AddPageToView "C:\TestPage1.txt"

我已将它更改为:
Dim objViewer As MyViewer
objViewer.MaxPageSize = 100
objViewer.ResetPages
objViewer.AddPageToView "C:\TestPage1.txt"

我收到一个错误窗口,显示"Run-time error '91': Object variable or With block variable not set",但似乎没有办法“设置”这个控件。这是不可能的吗?还是有其他的方法可以解决这个问题而不需要一个表单?编辑:最终我放弃了这条路,因为找到了一种替代方案,避免了这个表格冻结的问题。我不想删除这个问题,以防其他人从答案中受益,这些答案可能会有用。

所示代码等同于 Dim objViewer As MyViewer = Nothing。没有创建任何控件。 - user2864740
2
如果您的项目中已经引用了MyViewer,请尝试使用Set objViewer = New MyViewer,否则请尝试使用CreateObject。 - jac
定义“在表单上定义它”。因为如果你的意思是创建它,那么不行。你怎么能在不存在的东西上运行代码呢?这是不可行的。你必须创建一个对象,无论是通过IDE还是像jac建议的那样通过代码创建。 - George
@jac 是的,我应该明确说明这就是我所说的无法设置控件的意思。如果我使用 new,我会得到编译时错误“new 关键字的使用无效”。我有一个对控件的 ActiveX dll 的引用,所以我不确定还需要做什么才能使其工作,除非是引用 oca 与 dll 的问题,这一点我不是很清楚。使用 CreateObject,我在运行时得到“运行时错误 '429':ActiveX 组件无法创建对象”。 - Joe M
3个回答

1
尝试在表单中使用这个。
Dim objViewer As MyViewer

Set objViewer = Controls.Add("MyViewer", "MyViewer1")
objViewer.MaxPageSize = 100
objViewer.ResetPages
objViewer.AddPageToView "C:\TestPage1.txt"

我真的很想在没有表单的情况下完成这个任务。尝试这段代码给了我两个结果:要么它抱怨控件已经存在(因为我已经在表单上放置了一个具有该名称的控件),要么它说无法使用新名称添加它。 - Joe M

1

我过去也遇到过类似的情况。如果其他方法都失败了,你可以采用一些简单粗暴的办法:

1)设置控件的.Left属性为负数(如-10000),这样该控件就不会出现在表单上,用户也看不到它。

2)将整个表单设为不可见。


我可能应该在这方面提供更多的背景信息。 这个应用程序最初是作为不可见表单呈现的。问题在于控件会冻结,我正在挣扎着想找出一种方法,在不发生这种情况的情况下运行它。但如果仅需要隐藏它,您的建议是可行的。 - Joe M

0

ActiveX控件通常期望从其容器中获得许多服务,例如持久性。它们还以“打包和标记”的方式进行了设置,以设置它们支持的实例化类型。

请参见ActiveX控件介绍

虽然完全有可能创建一个控件,使得许多可用服务是可选的,但大多数控件都是从需要其中一些服务的模板代码创建的。而且大多数在运行时“可见”的控件都需要容器服务。

但是这并不意味着控件不能被设计为支持无容器实例化。一个众所周知的支持这种控件的例子是Microsoft Script Control 1.0(MSScriptControl.ScriptControl),它可以两种方式使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接