如何在不修改每个表单代码的情况下为应用程序中的每个表单添加边框?

时间:2013-08-30 21:00:10

标签: delphi graphics delphi-xe2 vcl

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

问题在于,当用户使用练习模式时,我们必须做一些非常清楚的事情来突出他们,这样他们就知道他们在练习模式下工作。最理想的解决方案是在每个表单的内边缘周围放置一个红色边框。但是有很多表格我不想修改它们中的每一个。

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

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

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

3 个答案:

答案 0 :(得分:4)

您需要在其中插入基类。 TMyBorderForm继承自TForm,它具有边界行为。然后让所有表单继承自TMyBorderForm,而不是直接从TForm继承。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:0)

Chris的回答有一个变化,假设您将DFM存储为文本。

  1. 定义表单全部继承的表单。
  2. 您在文本编辑器中加载所有PAS文件并将类(TForm)替换为类(TMyBaseForm)
  3. IIRC您还必须编辑所有DFM文件 - 有一个字符串'对象'可以更改为'继承'。首先尝试使用测试应用程序,因为我是根据我过去所做的事情写的,我不确定这个答案是100%完成的。
  4. 您可以将边框功能(开/关)添加到TMyBaseForm
  5. 严格地说,这需要你“完成所有表格”,但“打开所选文件”和“替换所有打开的文件”并不是什么大不了的事情; - )

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

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