0

我在 Delphi 项目中包含了一个可视化的 .NET 组件。在运行时使用这个组件可以正常工作,而 Delphi 设计器不能正常配合。在设计器中每次点击这个组件都会向组件本身发送一条消息(影响可见)。
但我想要的是在 IDE 设计器的对象检查器中查看此组件的已发布属性,以及调整大小并将组件拖放到表单上。

我考虑从 TWinControl.WndProc 方法继承并捕获 WM_MOUSEACTIVATE 和 WM_PARENTNOTIFY 消息(在设计器中单击组件时发送这些消息)并执行类似的操作...

procedure TMyComponent.WndProc(var Message: TMessage);
  case Message.Msg of
    WM_PARENTNOTIFY, WM_MOUSEACTIVATE:
    begin
      Self.SetFocus;
      Self.BorderWidth := 15;
    end;
  else
    inherited;
  end;
end;

在设计器中单击组件现在将其 BorderWidth 设置为 15。但它仍然没有集中在 IDE 的 Object Inspector 中。

该项目的附加信息:

我正在使用 Delphi XE7 和 Visual Studio 2013... 在 .NET 中,我正在为我的组件使用 ClassLibrary 项目。我从包含我的可视 c# 组件的UserControl继承了一个类。这个 ClassLibrary 被编译成我通过“regasm /tlb /codebase ClassLibrary.dll”注册的 DLL 文件。我还使用 tlibimp.exe 为 Delphi 生成 pas 文件。我编写了一个 Wrapperclass TDotNetControl,它派生自TOleControl,并覆盖/实现了 WndProc 过程。

从那个类TDotNetControl我派生了一个类TMyDotNetControl,它覆盖了 InitControlData 和 CreateInstance (来自TOleControl)。TMyDotNetControl被打包到我在 Delphi IDE 中构建和安装的包中。安装后,我可以从 Designer 的 ToolBox 中选择我的类TMyDotNetControl,然后我可以将它拖放到 WinForm 中。因为这是从 DLL 文件编译的类,所以组件在设计器中显示就像在运行时显示一样(如果我们不调用过程或设置属性)。

这就是事情变得混乱的时候。我只能拖动一次并调整它的大小。再次单击已编译的组件会在组件本身上触发 MouseEvent。这意味着,如果在 .NET 中实现了 mouseEvent 处理程序,则会调用并执行该处理程序方法(甚至在设计器中)。因此,我想要做的是捕捉 IDE 的点击消息,并使该方法在设计时将组件集中在对象检查器中进行编辑。(对象检查器显示TMyDotNetControl的已发布属性)

4

0 回答 0