2011-02-28 51 views
1

我正在使用的软件最初是用Delphi编写的,而且任何最新的软件补充都已在C#中完成。我想从基本的Delphi表单中派生出一些C#表单。除了当我尝试在Visual Studio 2008中打开C#表单的设计视图时,我设法使其大部分工作正常,但出现错误。错误消息如下所示:“找不到typebase类中的构造函数”。从基德尔福表格导出C#表格

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

我编译并运行的代码完全是我需要的,但是我将需要能够在将来向C#表单添加新组件。任何人有任何想法,我怎样才能让Visual Studio设计视图工作?

这里是什么,我有一个非常简单的版本:

Delphi代码:

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(); 
    } 
} 

在此先感谢

+0

什么版本的Delphi? – 2011-02-28 14:28:26

+0

我正在使用CodeGear RAD Studio 2007 – Stuart 2011-02-28 14:35:06

+3

您使用的是VCL.Net吗? AFAIK这是基于WinForms的**而非**,所以您可能无法将它用于WinForms设计器。 – 2011-02-28 17:04:29

回答

4

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

+0

我认为你是对的,昨天我花了大部分时间试图解决这个问题,但没有取得任何成功。这是一个耻辱,它不工作,会更容易,所以这是值得一试。谢谢大家的帮助 – Stuart 2011-03-01 08:35:47

1

设计师需要一个公共无参数构造函数在基类上工作。

取决于您的基类的实施,这可能会或可能不会成为一个阻碍。您可以通过添加如下内容来解决问题: -

public MyCSharpForm() : base (null) 
{ 
} 

到您的c#表单。但你需要确保基类在设计时正确的行为(即,渲染逻辑可以与空,或任何你提供发件人静态值应对。

+0

不幸的是,这并没有解决问题,我开始怀疑这个问题可能是一个显示瓶塞,因为你有建议 – Stuart 2011-02-28 14:58:34

0

我想补充一点,从继承的碱基C#类TMyDelphiForm,并把所有的Delphi/C#映射代码在那里,万一我需要从德尔福形式获得不止一个C#的形式,像:

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

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

+0

只是给了这个尝试,但当我加载设计视图它给出的对象引用未设置为对象异常。我猜这是与原始错误有关,但我需要研究它 – Stuart 2011-02-28 15:00:29

+0

尝试':base(this){}'而不是':base(null){}' – SWeko 2011-02-28 15:06:20

+0

试过但'this'关键字不能使用这里。你的错误“关键字,这是不是在目前情况下可用”试图编译 – Stuart 2011-02-28 15:13:41

0

做哟你有delphi类的源代码吗?你能看到它对对象/ Component Sender参数做了什么吗?

如果你能实例化的东西,将很容易satisify德尔福类,那么你也许可以得到设计师的支持,调用该基地这样一个中间类: -

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

然后还要满足各种设计形式继承MyIntermediateClass

+0

我有Delphi的源代码,我不认为这会造成任何问题。然而,当我实现这一点,打开设计视图我得到另一个新的错误“设计师加载程序未提供根组件,但没有指出原因” – Stuart 2011-02-28 15:50:33

+0

我关了一夜,希望我有一些新鲜的想法是早上。感谢您的帮助@ slippyr4和@SWeko – Stuart 2011-02-28 15:58:35