【问题标题】:Deriving C# form from base Delphi form从基本 Delphi 形式派生 C# 形式
【发布时间】:2011-07-05 19:41:57
【问题描述】:

我正在开发的软件最初是用 Delphi 编写的,最近对该软件的任何添加都是用 C# 完成的。我想从基本的 Delphi 表单派生一些 C# 表单。我已经设法让它大部分工作,除了当我尝试在 Visual Studio 2008 中打开 C# 表单的设计视图时出现错误。错误信息如下“未找到类型'基类'上的构造函数。”

我已经进行了一些搜索,显然这是由于 Delphi 表单没有采用零参数的默认构造函数。 Delphi TForm 类没有采用零参数的默认构造函数,所以我不能只在我的 Delphi 表单中添加一个。

我的代码完全按照我的需要编译和运行,但是我需要能够在未来向 C# 表单添加新组件。有人对我如何让 Visual Studio 设计视图工作有任何想法吗?

这是我所拥有的非常简化的版本:

德尔福代码:

type
  TMyDelphiForm = class(TForm)

  private
    ...
  public
    constructor Create(Sender : TObject);
  end;

implementation

  Constructor TMyDelphiForm.Create(Sender : TObject);
  begin
    inherited;
  end;

C#代码:

public partial class MyCSharpForm : TMyDelhpiForm
{
  public MyCSharpForm(Component sender) : base(sender);
  {
    InitializeComponent();
  }
}

提前致谢

【问题讨论】:

  • 我正在使用 CodeGear RAD Studio 2007
  • 你在使用 VCL.Net 吗? AFAIK 这不是基于 WinForms,因此您可能无法将它与 WinForms 设计器一起使用。

标签: c# delphi forms constructor derived


【解决方案1】:

设计器需要基类上的公共无参数构造函数才能工作。

取决于您的基类的实现,这可能是也可能不是一个显示停止器。您可以通过添加以下内容来解决问题:-

public MyCSharpForm() : base (null)
{
}

到您的 c# 表单。但是您需要确保基类在设计时行为正常(即,呈现逻辑可以处理 null 或您为 Sender 提供的任何静态值。

【讨论】:

  • 不幸的是,这并没有解决问题,我开始怀疑这个问题可能是你所建议的表演障碍
【解决方案2】:

我会添加一个继承自TMyDelphiForm 的基 C# 类,并将我所有的 Delphi / C# 映射代码放在那里,以防我需要从 Delphi 表单派生多个 C# 表单,例如:

public class MyCSharpFormBase : TMyDelphiForm
{
    public MyCSharpFormBase() : base (null) { } 
}

然后从MyCSharpFormBase 继承您的表单。 没试过,但我认为它会满足设计师的需求。

【讨论】:

  • 刚刚试了一下,但是当我加载设计视图时,它给出了一个未设置为对象异常实例的对象引用。我猜它与原始错误有关,但我需要调查一下
  • 试试: base (this) { } 而不是: base (null) { }
  • 刚刚尝试过,但此处不能使用“this”关键字。尝试编译时收到错误“keyword this is not available in the current context”
  • 好吧,我的下一个猜测是创建一个静态 TComponent 对象,然后将其作为构造函数参数传递。
  • 确实,您不能将其作为参数传递给基本构造函数。
【解决方案3】:

你有delphi类的源代码吗?你能看到它对 object/Component Sender 参数的作用吗?

如果您可以轻松地实例化满足 delphi 类的东西,那么您可能可以通过调用基础的中间类获得设计人员的支持,如下所示:-

    public class MyIntermediateClass : MyDelphiForm
    {
      public MyIntermediateClass() : base(new Component())
      {
      }
    }

然后让你的可设计表单继承 MyIntermediateClass

【讨论】:

  • 我有 Delphi 源代码,我认为这不会造成任何问题。但是,当我实现它并打开设计视图时,我收到另一个新错误“设计器加载程序没有提供根组件,但没有说明原因”
  • 我今晚要休息了,希望我早上会有一些新的想法。感谢您的帮助@slippyr4 和 @SWeko
【解决方案4】:

您不能在同一个应用程序中混合和匹配 Win Forms 和 VCL Forms - 期间。它们是两个独立的 Windows 框架,不兼容。唯一的办法是在 Visual Studio 中重做 GUI,并链接到通过 Delphi.NET 编译器构建为程序集的非 GUI 组件。

【讨论】:

  • 我认为你是对的,我昨天大部分时间都在试图解决这个问题,但没有成功。可惜它不起作用,本来会容易得多,所以值得一试。谢谢大家的帮助
猜你喜欢
  • 2017-07-24
  • 2013-09-03
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多