Получение C # формы из базовой формы Delphi - PullRequest
1 голос
/ 28 февраля 2011

Программное обеспечение, над которым я работаю, изначально было написано на Delphi, а все последние добавления к программному обеспечению были сделаны на C #. Я хотел бы получить некоторые формы C # из базовых форм Delphi. Мне удалось заставить большую часть этого работать, кроме того, когда я пытаюсь открыть представление Design формы C # в Visual Studio 2008, я получаю ошибку. Сообщение об ошибке выглядит следующим образом: «Конструктор базового класса не найден».

Я провел некоторый поиск, и, видимо, это связано с тем, что в форме Delphi отсутствует конструктор по умолчанию, который принимает нулевые аргументы. Класс Delphi TForm не имеет конструктора по умолчанию, который принимает нулевые аргументы, поэтому я не могу просто добавить его в форму Delphi.

Код, который у меня есть, компилируется и запускается именно так, как мне нужно, однако в будущем мне понадобится добавить новые компоненты в форму C #. Кто-нибудь получил какие-либо идеи о том, как я могу заставить работать дизайн-представление Visual Studio?

Вот очень упрощенная версия того, что у меня есть:

Delphi Code:

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 ]

4 голосов
/ 01 марта 2011

Вы не можете смешивать и сочетать формы Win и VCL в одном приложении - точка. Они представляют собой две отдельные платформы Windows и не совместимы. Единственный способ - повторить графический интерфейс в Visual Studio и связать его с компонентами, не созданными в графическом интерфейсе, созданными в виде сборок, через компилятор Delphi.NET.

1 голос
/ 28 февраля 2011

Для работы дизайнера необходим открытый конструктор без параметров в базовом классе.

В зависимости от реализации вашего базового класса, это может быть или не быть ограничителем показа.Вы можете решить эту проблему, добавив что-то вроде: -

public MyCSharpForm() : base (null)
{
}

в форму c #.Но вам нужно убедиться, что базовый класс ведет себя должным образом во время разработки (т. Е. Логика рендеринга может справиться с нулем или любым статическим значением, которое вы предоставляете для Sender.

0 голосов
/ 28 февраля 2011

Есть ли у вас исходный код для класса delphi?можете ли вы увидеть, что он делает с параметром object / Component Sender?

Если вы можете легко создать экземпляр того, что удовлетворит класс delphi, то вы, вероятно, можете получить поддержку дизайнера с помощью промежуточного класса, который называется base, как этот: -

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

А затем ваша разработанная форма наследует MyIntermediateClass

0 голосов
/ 28 февраля 2011

Я бы добавил базовый класс C #, который наследуется от TMyDelphiForm, и поместил туда весь мой код отображения Delphi / C #, на случай, если мне понадобится получить более одной формы C # из формы Delphi, что-то вроде:

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

, а затем унаследуйте вашу форму от MyCSharpFormBase. Еще не пробовал, но, думаю, это удовлетворит дизайнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...