Delphi 在设计时检测新组件的插入

Posted

技术标签:

【中文标题】Delphi 在设计时检测新组件的插入【英文标题】:Detecting insertion of new components at design-time in Delphi 【发布时间】:2012-10-23 23:18:42 【问题描述】:

我的 Delphi 组件如何在设计时检测是否有任何其他组件被拖放到表单上?

【问题讨论】:

-1 你有一个很好的答案,但在 cmets 中你施加了许多问题中没有的约束。这总是令人沮丧。我建议你提供更多细节。告诉我们最终目标,也许我们可以提供帮助。 -1。我同意@David。这是一个基于您添加到以下答案中的 cmets 的不完整问题。如果您有更具体的要求,它们属于问题本身,而不是 cmets 的答案。这个问题本身应该是完整的,而不是依赖于通过 cmets 来确定你实际问的是什么。 为什么您还没有编辑您的 q 以说明您的 cmets 中提到的附加要求? 【参考方案1】:

您应该覆盖组件的Notification 方法;类似的东西:

type
  TMyComponent = class(TComponent)
//..
  protected
    procedure Notification(AComponent: TComponent;
      Operation: TOperation); override;
  end;


procedure TMyComponent.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if (Operation = opInsert) and (csDesigning in ComponentState) then begin
// AComponent was dropped on the form
  end;
end;

【讨论】:

非常感谢,这很好用!但是,似乎此时(通知),插入的组件还不是表单的子项。 IE。插入的组件尚未包含在 TForm.ComponentCount 中。我的组件处理表单上的所有组件,因此在这种情况下,在我的处理中找不到插入的组件。 当表单调用Notification 调用时,我认为插入的组件应该已经在TForm.Components 列表中。 AComponent.HasParent 在通知中为假。 AComponent.Name 也是空的,并且 AComponent.DesignInfo 在通知中未初始化。因此,Notification 中的 AComponent 无能为力。我想我会使用一个定时器,它只在通知中启用一次来完成任务。还是有其他解决方案? 为什么要使用计时器? 没人知道你想做什么。阅读这个问题,看看你是否能找到任何关于育儿或初始化后处理插入组件属性的内容。我们无法读懂你的想法。把自己放在我们的位置上。【参考方案2】:

如果您的意思是放置控件而不是组件,并且如果您的意思是放置在组件上而不是放置在表单上,​​那么:

添加CM_CONTROLLISTCHANGE 消息处理程序以在控件插入之前跟踪它们,或者 添加CM_CONTROLCHANGE 消息处理程序以在控件插入后跟踪控件(WParam 指向控件), 在csLoading 不在ComponentState 之前不要执行此操作,以防止在 IDE 创建表单期间进行跟踪。

【讨论】:

感谢您的回答。我需要跟踪放置在表单(而不是我的组件)上的组件(不是控件)。我需要放置组件的属性来安排非可视组件的位置(这已经很好了)。我需要的是在用户在表单上放置一个新组件后立即进行处理(非可视组件的排列)。为此,我需要 AComponent 属性(在通知中不可用)。所以唯一的解决方案似乎是一个OnceTimer。【参考方案3】:

只是一个提示,如果有帮助的话……我也有类似的问题:

当我将非可视组件图标(对于我的 TMyLabel=class(Classes.TComponent) 组件)从 IDE 拖放到表单、面板等中时,我想隐藏它...

我已经超载:LoadedReadState 让这样的图标看不见(在设计时)...在 LoadedReadState 我把 DesignInfo 指向 (-100, -100),所以图标不显示

我已经超载:WriteState 以避免将 Left & Top 保存到 .dfm(在设计时)...在 WriteState 我把它指向 (0,0),所以它没有被保存在.dfm里面

注意:我使用相同的技术/技巧来不保存我不想要的属性等......我真的只让 Caption 保存在 .dfm 中

问题/提示是:

当我将一个新的“控件”(我的组件)放到表单中时,这样的图标就在我放置它的地方可见...如何隐藏它?

也许user1580348 正在尝试类似的东西......或者与自动对齐这些非视觉“控件”/“组件”相关的东西。

换句话说:

在窗体、面板等上放置新的(我们的组件)控件时,我们如何控制图标位置...

我知道我的问题要容易得多,但我还没有解决它...我只想隐藏 IDE 为非可视组件显示的图标(仅适用于我的组件的控件)...但也许知道怎么做也会有帮助user1580348

正如我所说,这只是一个提示/线索。

【讨论】:

以上是关于Delphi 在设计时检测新组件的插入的主要内容,如果未能解决你的问题,请参考以下文章

Delphi (CM_) 中的组件消息和自定义图形设计时组件

为 Delphi 制作可编辑的设计时组件

Delphi 自定义组件,拖动时无法在设计器中定位(顶部/左侧属性的自定义设置器)

如何设计delphi 窗体里面的组件居中

Delphi实现在数据库中存取图像

在单独的设计时包中覆盖组件创建构造函数