我正在寻找用Delphi的表单设计器替换旧的自定义表单设计器。我们的应用程序使用自定义程序生成可以使用我们自己的报表编写器的表单。很难维护旧的应用程序,并且使用Delphi作为表单设计器似乎是一个不错的选择。使用此表单的应用程序也是用Delphi编写的,但这些表单实际上不会显示为真实表单,我们将遍历组件并生成报告。
当前表单设计器的一个功能是“邻居列表”。邻居列表跟踪表单上每个单元格的下一个顶部,底部,右侧和左侧单元格。在设计阶段保存表单时,旧设计器会更新此列表。
我需要的其他所有东西都可以很容易地跟踪地图的典型控制属性(位置,高度,宽度等)。我无法弄清楚如何在dfm中生成和保存这种类型的邻居信息。
表单上的组件在设计时是否有任何方法可以在表单上的任何内容发生更改时触发事件?或者表单保存时的事件?
我已经考虑过两种解决问题的方法 1)将邻居信息保存在每个单独的控件中。这会有点工作,但是当表格上的其他控件被移动时仍然会出现不同步的问题,除非我能得到一个让我知道何时更新的事件。
2)拥有一个只跟踪列表的非可视组件。我可以添加一个自定义属性编辑器页面,其上有“更新”按钮,可以重新生成列表,但是我需要记住在保存最终版本之前单击它。我可以看到这个步骤被遗漏了,宁可有一些可行的东西。
我还可以更改应用程序以在运行时动态查找邻居,但我希望我能找到一种方法让它在设计时工作。
任何版本的Delphi的解决方案都可以使用。
任何评论为什么这一般是一个坏主意也将受到赞赏,因为我没有说服自己100%这是正确的方法。 : - )
答案 0 :(得分:3)
创建一个新的TForm后代并覆盖DefineProperties
函数以加载并保存列表作为流式处理过程的一部分。 MarcoCantù介绍了在Delphi Developer's Handbook中添加新设计时间表的详细信息,但您可以通过在注册程序中调用RegisterCustomModule
来逃避。
或者,您可以创建一个TApplicationEvents
对象(AppEvnts.pas),分配一个OnMessage
处理程序,并监视任何WM_SIZE
个消息。然后,您可以使用FindControl
获取消息所针对的TWinControl,并检查它是否是您的表单的父级。确保您在此处执行的任何过滤都很快,因为OnMessage将查看整个IDE的每条消息。
答案 1 :(得分:0)
使用TComponent.Notification
方法。当所有组件都插入或从其所有者中删除时,它将与所有组件一起调用。您也可以致电FreeNotification
来获取有关不同所有者的组件的通知。
例如,当在按钮上设置PopupMenu
属性时,该按钮会调用菜单组件的FreeNotification
方法。如果以后菜单被删除,它将在按钮上调用Notification
,按钮将清除其PopupMenu
属性,因为它不再引用有效对象。
您可以覆盖Notification
来监控插入和删除。一个更难的任务是监视组件移动的时间,如果这是您需要知道的事情。仅仅因为组件是你的左邻居添加它并不意味着它将永远留在你的左邻居。 (事实上,无论如何,位置在插入时可能无效。)在运行时,控件的位置可能不会改变,所以如果你有办法检测控件的相对位置,Loaded
方法这是一个很好的去处。在读取DFM并设置了所有组件的属性后调用该方法。