Delphi 移动表单上的其他组件时更新自定义组件

Delphi 移动表单上的其他组件时更新自定义组件,delphi,Delphi,我正在考虑用Delphi的表单设计器替换旧的定制表单设计器。我们的应用程序使用自定义程序生成表单,这些表单可以由我们自己的报表编写器使用。维护旧的应用程序很困难,使用Delphi作为表单设计器似乎是一个不错的选择。使用此表单的应用程序也是用Delphi编写的,但这些表单实际上不会显示为真实的表单,我们只需迭代组件并生成报告 当前表单设计器的一个功能是“邻居列表”。“邻居”列表跟踪窗体上每个单元格的下一个顶部、底部、右侧和左侧单元格。在设计阶段保存表单时,旧设计器会更新此列表 我需要的所有其他东西

我正在考虑用Delphi的表单设计器替换旧的定制表单设计器。我们的应用程序使用自定义程序生成表单,这些表单可以由我们自己的报表编写器使用。维护旧的应用程序很困难,使用Delphi作为表单设计器似乎是一个不错的选择。使用此表单的应用程序也是用Delphi编写的,但这些表单实际上不会显示为真实的表单,我们只需迭代组件并生成报告

当前表单设计器的一个功能是“邻居列表”。“邻居”列表跟踪窗体上每个单元格的下一个顶部、底部、右侧和左侧单元格。在设计阶段保存表单时,旧设计器会更新此列表

我需要的所有其他东西都可以很容易地跟踪映射到典型控件属性(位置、高度、宽度等)。我不知道如何在dfm中生成和保存这种类型的邻居信息

表单上的组件在设计时有没有办法在表单上发生任何更改时触发事件?还是保存表单时的事件

我已经考虑过解决这个问题的两种方法 1) 将邻居信息保存在每个控件中。这将是一种工作方式,但是当表单上的其他控件被移动时,仍然会出现不同步的问题,除非我可以获得一个事件,让我知道何时更新

2) 有一个非可视组件,只跟踪列表。我可以添加一个自定义属性编辑器页面,该页面上有“更新”按钮,可以重新生成列表,但是我需要记住在保存最终版本之前单击该按钮。我可以看到这一步被错过了,我宁愿有一些只是工作

我还可以更改应用程序,以便在运行时动态查找邻居,但我希望能够找到一种方法,使其在设计时工作

任何版本的Delphi都可以使用解决方案

对于为什么这是一个总体上不好的主意的任何评论,我也将表示感谢,因为我没有100%地说服自己这是正确的方法。:-)

使用该方法。当插入或从其所有者中删除任何组件时,它将在具有公共所有者的所有组件上调用。您还可以调用以获取关于具有不同所有者的组件的通知

例如,当在按钮上设置了
PopupMenu
属性时,该按钮将调用菜单组件的
FreeNotification
方法。如果菜单稍后被删除,它将调用按钮上的
通知
,并且按钮将清除其
弹出菜单
属性,因为它不再引用有效对象


您可以覆盖
通知
以监视插入和删除。如果您需要知道某个组件何时移动,则更难的任务是监视该组件。组件添加时是您的左邻居并不意味着它将永远是您的左邻居。(事实上,位置在插入时可能是无效的。)在运行时,控件的位置可能不会改变,因此如果您有一种方法可以检测控件的相对位置,那么该方法就是一个很好的方法。读取DFM并设置所有组件的属性后,将调用该方法。

创建一个新的TForm子体,并覆盖
DefineProperties
函数以加载和保存列表,作为流处理的一部分。Marco Cantù介绍了在his中添加新设计时表单的详细信息,但您可能只需在注册过程中调用
RegisterCustomModule


或者,您可以创建一个
TApplicationEvents
对象(AppEvnts.pas),分配一个
OnMessage
处理程序,并监视任何
WM\u SIZE
消息。然后,您可以使用
FindControl
获取消息所针对的TWinControl,并检查它是否是表单的父控件。请确保您在这里执行的任何过滤都是快速的,因为OnMessage将看到整个IDE的每条消息。

很难说这是否是一个好主意,因为您还没有给出在第一个位置设置邻居列表的理由。告诉我们您为什么需要这样一个列表,然后我们可以告诉您尝试自动化维护是否是一个好主意。Rob问题的推论:为什么不坚持当前VCL表单对选项卡排序的支持,而忘记邻居列表?邻居列表是需要的,因为我需要的不仅仅是下一个和上一个-我还需要上下两个,左和右。目前,用户可以使用箭头键在表单中移动以输入数据。我们还将“下一个”和“上一个”概念映射到tab键。想想网格;每个单元格可以有顶部、底部、左侧和右侧,但tab键可能会将您带到下一列的顶部。“好主意”的问题实际上是关于一般使用Delphi表单设计器,而不是尝试更新当前的自定义构建设计器。覆盖DefineProperties函数听起来可能会奏效。今晚我来看看。RegisterCustomModule正是我要找的。你给出的链接对于Delphi7 forward来说有点过时了。我会问另一个问题,试图找到一些更新的信息。