从基础Delphi表单派生C#表单

时间:2011-02-28 14:27:24

标签: c# delphi forms constructor derived

我正在使用的软件最初是用Delphi编写的,最近软件的任何新增内容都是用C#完成的。我想从基础Delphi表单中派生出一些C#表单。我已经成功地完成了大部分工作,除非我尝试在Visual Studio 2008中打开C#表单的Design视图时出现错误。错误消息如下“未找到类型'基类的构造函数。”

我做了一些搜索,显然这是因为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();
  }
}

提前致谢

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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

public MyCSharpForm() : base (null)
{
}

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

答案 2 :(得分:0)

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

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

然后从MyCSharpFormBase继承您的表单。 没有尝试过,但我认为它会让设计师满意。

答案 3 :(得分:0)

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

如果你可以轻松地实例化一些能够满足delphi类的东西,那么你可以通过一个像这样调用基类的中间类来获得设计器支持: -

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

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