VB6:与不可见的形式交互

时间:2008-11-06 22:16:59

标签: user-interface forms vb6

所以,我在VB中有一个表单是可见的,除非程序以静默方式启动,在这种情况下表单仍然被加载但是交互是以编程方式完成的。但是,在极少数情况下,我希望在隐形表单中创建的表单是可见的。实现这一目标的最佳方法是什么,最好不要创建新表单。我想出了一些但我真的不喜欢的想法:

  • 创建一个新表单,传递该表单的hwnd,以便它托管任何适用的窗口。真的很容易做,可能非常灵活。还是很难看。
  • 手动调用可见表单,拉出值,将用户填写的数据传递给不可见的表单。这个解决方案可能是最简单的,但它也是一个黑客。如果它被用于超过极少数的形式,这是一个糟糕的解决方案,但它可能会。
  • 创建一个新类,重构要由事件触发的表单。
  • 将主窗体设置为可见,但会隐藏其加载功能,以便它实际上不会显示任何内容。
  • 根本不使用隐形表单,重构代码以更好地将表单功能与使用区分开来。事实上,这基本上已经是正确的,但是我没有看到完全做到这一点的方法,没有重复使用类的方式,因为我最终需要拥有包含相同功能的不同类。可能是理想主义的解决方案。

  • 我实际上最终做了什么:在受影响的地方坚持一个shell执行调用,启动一个用不同标志编译的程序副本的新实例。这听起来并不像听起来那么糟糕。使用任何其他解决方案的部分问题是,任何时候我想在我的代码上使用不同的UI,我需要创建一个新的控制器类,以不同的方式处理相关的事件。该程序的大多数接口已经与其实现保持分离,但是创建一个新UI需要我添加额外的事件处理程序以及诸如此类的东西。不可否认,它可能只需要大约3个事件处理程序来处理事件被触发时提示用户输入。

编辑:在某种程度上,我误解了我的问题:问题是我想要回收部分现有用户界面,但不是全部。因此,制作我不希望用户看到的部分是不可见的,但使菜单看起来可见。解耦各个UI组件可能最终会给程序增加额外的复杂性。

2 个答案:

答案 0 :(得分:1)

最后一个选项更可取;重构后应该没有冗余代码

摆弄隐形表格是一个很好的迹象表明需要重构!

答案 1 :(得分:0)

我也推荐最后一个选项。如果用最少量的更改安全地实现,我将采取以下措施:

进行备份或将所有内容检查到源代码管理中并进行分支。

制作一个新的ActiveX DLL项目。我会将它命名为UI_Controller的一些变体

注意:新项目将强制您识别EXE中隐藏的依赖项。

让它引用EXE现在的所有内容。

让EXE Project引用UI_Controller。

为应用程序中的每个主要表单创建一个类。

将次要对话框复制到UI_Controller DLL中。

对于每个表单,在UI_Controller DLL中创建一个接口类(表单将是 实施这个)

示例如果你有六个主要形式,那么你有六个表单接口和六个控制器类

浏览每个过程和事件的表单将过程复制到UI Controller Class并公开。

确保每个控制器类都有一个Init过程。

但是有一个例外,那就是代码只处理其他控件和表单。例如Resize事件重新排列代码。这样做的原因是特定于该形式的逻辑。使用控制器类的不同表单或UI将具有不同的调整大小算法,因此将代码移动是没有意义的。你必须用你最好的判断力。

返回Controller类。许多程序需要引用特定表单上的元素或表单上的事件。在表单接口类中编写子例程标头或函数,以允许发生该事件或检索所需信息。 请注意,如果您发现组合在一起的相同操作或检索到的同一系列信息只考虑一个子例程而不是多个。

将对表单的任何直接引用更改为接口上的调用。

让您的主要表单实现每个接口。在UI控制器DLL中创建一个GlobalMultiUse类,允许EXE使用它的控制器注册每个表单。寄存器子例程应该只接受表单接口的对象。在您的应用程序中,初始化已经将每个主要表单传递给正确的注册函数,然后再执行其他操作。

运行您的项目并更正任何错误。请注意,您的软件的实际功能应该与您只应复制和实施的功能保持一致。

软件运行时没有错误。将其检入源代码管理或进行备份。

通过调用控制器表单的相应方法,开始替换其中一个主要表单的每个过程。如果任何其他表单调用表单上的某些内容,则表示您正在调用控制器的开关。

完成后,请确保在应用程序初始化部分中调用控制器表单初始化。您需要切换到使用Sub Main才能工作。

当这在其他表单上正常工作时。继续这样做,直到所有表格都被转换。

清理任何未使用的东西。

测试,如果通过,你就完成了。

您现在拥有的是一个应用程序,您可以在其中删除当前UI并替换为实现表单接口的任何内容。所以你可以拥有一个不可见的EXE,一个单元测试EXE和你的常规EXE。

您必须根据应用程序的复杂程度决定最适合您的方法。您可以进行部分转换,只需将一个或两个表单作为控制器类。