3

我们有一个大型遗留数据库驱动的 VCL 应用程序,它由 300 多种不同的形式组成。我们希望提供一个练习(虚拟)数据库以及我们的软件,该数据库与他们的生产数据库一起安装 - 能够在它们之间切换(用于培训/练习等)。

问题是,当用户使用练习模式时,我们必须非常清楚地让他们脱颖而出,以便他们知道他们正在练习模式下工作。最理想的解决方案是在每个表单的内边缘周围放置一个红色边框。但是表格太多了,我不想一一修改。

如何从一个全局位置沿应用程序的每个表单的边缘添加这样的框架(在 Windows 边界内,而不是在外部)?

我不能使用 VCL 样式,否则我会从那里实现它。我正在寻找可以迭代每种形式并绘制此边界的全局级别的东西。但这也意味着捕获每个表单的调整大小消息并重新绘制此边框。

我能看到的最简单的方法是创建一个具有此功能的基本表单,并从这个基本表单继承系统中的每个表单。但这仍然意味着确保每种形式都基于此。过去我们在修改现有表单的基本表单(另一个主题)时遇到过其他问题,所以如果有其他更简单的解决方案,我想避免使用该解决方案。

4

3 回答 3

4

您需要在其中插入一个基类。TMyBorderForm 继承自 TForm,具有边框行为。然后让你的所有表单都继承自 TMyBorderForm,而不是直接继承自 TForm。

于 2013-08-30T21:18:46.757 回答
4

有一些方法可以连接到表单流系统,例如通过覆盖TComponent.ReadState表单以添加事件处理程序来TReader处理流,但它们需要您实际更改相关表单类中的代码。似乎没有任何方法可以全局修改TReader整个程序的行为。因此,如果您的应用程序中的所有表单没有实际的基本表单类,就没有简单的方法可以做到这一点。

即使尝试TComponent.ReadState在内存中打补丁也很难做到正确,因为它是一种虚拟方法,并且没有对 TCustomForm 的覆盖,因此您所做的任何更改都可能影响所有组件,而不仅仅是表单。

老实说,处理这个问题的最好方法可能就是咬紧牙关,在你的代码库上运行全局搜索,class(TForm并将它们全部更改为某个自定义表单类的子类,以展示你正在寻找的行为。理论上可能有其他方法可以实现它,但它们需要一些非常麻烦的运行时技巧,这些技巧可能会产生不可预测的副作用。

于 2013-08-30T21:38:23.103 回答
0

假设您将 DFM 存储为文本,则 Chris 的答案有所不同。

  1. 定义一个您的表单都继承自的表单。
  2. 您在文本编辑器中加载所有 PAS 文件并将 Class(TForm) 替换为 class(TMyBaseForm)
  3. IIRC,您还必须编辑所有 DFM 文件 - 有一个字符串 'object' 可以更改为 'inherited'。首先用一个测试应用程序试试这个,因为我是根据我过去所做的来写这个的,我不确定这个答案是否 100% 完整。
  4. 您将边框功能(开/关)添加到 TMyBaseForm

严格来说,这需要您“浏览所有表格”,但“打开选定的文件”和“替换所有打开的文件”并不是什么大问题;-)

唯一的缺点是,如果您还没有将 DFM 存储为文本,则必须先进行更改。

[从你自己的“基本形式”继承对于大型项目来说通常是一件好事。例如,我们将它用于没有我们想要的默认属性的第三方组件——如果开发人员忘记更改默认属性,基本表单中的运行时代码将更新它]。

于 2013-08-31T14:45:41.983 回答