代码之家  ›  专栏  ›  技术社区  ›  Mark Elder

移动窗体上的其他组件时更新自定义组件

  •  1
  • Mark Elder  · 技术社区  · 14 年前

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

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

    所有其他我需要保持跟踪地图非常容易到您的典型控制属性(位置,高度,宽度等)。我不知道如何在dfm中生成和保存这种类型的邻居信息。

    窗体上的组件在设计时是否有任何方法在窗体上的任何内容发生更改时触发事件?或者保存表单时的事件?

    我想了两种方法来解决这个问题 1)将邻居信息保存在每个单独的控件中。这会起到一定的作用,但是当表单上的其他控件被移动时,仍然存在不同步的问题,除非我可以得到一个事件,让我知道何时更新。

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

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

    任何delphi版本的解决方案都可以工作。

    任何关于为什么这是一个坏主意的评论也会得到赞赏,因为我并没有百分之百地说服自己这是正确的方法。-)

    2 回复  |  直到 14 年前
        1
  •  3
  •   Zoë Peterson RRUZ    14 年前

    创建新的tform子体并重写 DefineProperties 函数加载列表并将其保存为流式处理的一部分。马可无法涵盖在他的 Delphi Developer's Handbook ,但你可以打个电话就走了 RegisterCustomModule 在你的注册程序中。

    或者您可以创建 TApplicationEvents 对象(appevnts.pas),分配 OnMessage 处理者,注意 WM_SIZE 信息。你可以用 FindControl 获取消息的twincontrol并检查它是否是窗体的父级。确保您在这里所做的任何过滤都是快速的,因为onMessage将看到整个IDE的所有消息。

        2
  •  0
  •   Rob Kennedy    14 年前

    使用 TComponent.Notification 方法。当任何一个组件被插入或从其所有者中移除时,它都会在具有共同所有者的所有组件上调用。你也可以打电话 FreeNotification 获取有关组件的通知 不同的 业主。

    例如,当 PopupMenu 属性设置在按钮上,该按钮调用菜单组件的 免费通知 方法。如果菜单稍后被删除,它将调用 Notification 在按钮上,按钮将清除 子菜单 属性,因为它不再引用有效对象。

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