【问题标题】:VB6: Interacting with an invisible formVB6:与不可见的形式交互
【发布时间】:2008-11-06 22:16:58
【问题描述】:

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

  • 创建一个新表单,传递该表单的 hwnd 以便它托管任何适用的窗口。真的很容易做到,可能相当灵活。还是很丑。
  • 手动调用可见表单,提取值,将用户填写的数据传递给不可见表单。这个解决方案可能是最简单的,但它也是一个 hack。如果它用于少数表单,这是一个糟糕的解决方案,但它可能会。
  • 创建一个新类,重构由事件触发的表单。
  • 将主窗体设置为可见,但扭曲其加载功能,使其实际上不显示任何内容。
  • 根本不使用不可见的表单,重构代码以更好地将表单的功能与使用分开。事实上,这在很大程度上已经是正确的,但我没有看到一种方法可以完全做到这一点,而不需要对类的使用方式进行一些重复,因为我最终需要使用包含相同功能的不同类。不过,这可能是理想主义的解决方案。

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

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

【问题讨论】:

    标签: user-interface forms vb6


    【解决方案1】:

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

    摆弄不可见的表单很好地表明了重构的必要性!

    【讨论】:

    • 最后一个选项肯定更好,但也可能是个坏主意。在发布产品之前,我不会考虑进行认真的重构。
    • @Brian:你打电话给那个;我个人至少会尝试一下,重构的代码可能会比你从它的声音中得到的更好! [并记得彻底测试]
    • 部分问题在于相关的 GUI 代码是通过使用事件来调用的,而在模块内完成时这不起作用。
    【解决方案2】:

    我也推荐最后一个选项。为了以最少的更改安全地实施,我会做的如下。

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

    创建一个新的 ActiveX DLL 项目。我将它命名为 UI_Controller 的一些变体

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

    让它引用当前 EXE 的所有内容。

    让 EXE 项目引用 UI_Controller。

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

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

    为每个表单在 UI_Controller DLL 中创建一个接口类(表单将是 实现这个)

    例如,如果您有六个主要表单,那么您就有六个表单接口和六个控制器类

    检查每个过程和事件的表单 将过程复制到 UI 控制器类并公开。

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

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

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

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

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

    运行您的项目并更正所有错误。请注意,您的软件的实际功能应该保持与您应该只是复制和实施的相同。

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

    开始用调用你的控制器表单的相应方法来替换你的一个主要表单的每个过程。如果任何其他表单调用了您正在处理的表单上的某些内容,则将该调用切换到控制器。

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

    当它正常工作时,可以在另一个表单上工作。继续这样做,直到所有表单都转换完毕。

    清理所有不用的东西。

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

    您现在拥有的是一个应用程序,您可以在其中撕掉当前的 UI 并替换为任何实现表单接口的东西。因此,您可以拥有一个不可见的 EXE、一个单元测试 EXE 和您的常规 EXE。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 2017-10-03
      • 2014-11-13
      相关资源
      最近更新 更多