Управление формой Delphi 7 из приложения .NET 4 WinForm - PullRequest
2 голосов
/ 10 марта 2011

У меня есть приложение .NET 4 WinForm, которое отображает формы из Delphi 7 .dll. У меня вчера было несколько вопросов о том, как заставить форму Delphi вести себя правильно, когда она отображается модально. Ответили здесь .

Я экспортирую метод из Delphi .dll, который создает экземпляр формы Delphi, возвращая указатель на эту форму в .NET. Я также экспортирую метод для отображения формы Delphi. У метода Show два параметра: владелец типа integer; и форма типа указатель.

Я вызываю метод CreateForm, который создает форму Delphi, передавая объект приложения Delphi конструктору формы. Я храню возвращенный указатель в .NET. Затем я вызываю метод Show, передавая дескриптор из основной формы приложения .NET и указатель на форму Delphi.

Затем я назначаю этот дескриптор свойству Delphi Application.Handle.

Это решило мою первоначальную проблему.

Теперь у меня есть некоторые другие проблемы:

  • В форме Delphi отображается кнопка на панели задач Windows. Единственный способ, который я нашел для подавления кнопки панели задач, - это создать форму Delphi как окно инструментов (либо установив BorderStyle := bsToolWindow формы, либо присвоив WS_EX_TOOLWINDOW стилю формы). Мне нужно, чтобы форма Delphi была обычной формой стиля, но я не хочу, чтобы кнопка панели инструментов показывала, подобно тому, как ведут себя дочерние формы в нативном приложении Delphi или .NET. И под родным я имею в виду, где все приложение написано на данном языке.

  • Форма Delphi не минимизирует время сверки приложения .NET. Мне нужны формы Delphi, чтобы свести к минимуму, когда основная форма приложения .NET свернута, подобно тому, как ведут себя дочерние формы в собственном приложении Delphi или .NET.

Я не уверен, но это похоже на проблему собственности. Похоже, что формы Delphi не «знают», что они являются частью приложения .NET.

Итак, мой основной вопрос: как заставить формы Delphi вести себя так, как если бы они были нативными формами приложения?

Дополнительные соображения: я занимаюсь разработкой под Windows 7, но приложение должно вести себя одинаково на XP и Vista.

Ответы [ 3 ]

1 голос
/ 10 марта 2011

После просмотра моего кода я понял, что то, что я первоначально разместил, не было на 100% правильным.Я отредактировал свой вопрос, чтобы дать более точное описание последовательности событий при создании формы Delphi и назначении Delphi's Application.Handle.

Я решил проблему, выполнив следующие действия:

Я изменил метод CreateForm так, чтобы он принимал параметр "owner" вместо его передачи через метод Show.

В методе CreateForm я теперь назначаю сначала свойство Delphi Application.Handle, , а затем создайте форму, передав объект Application в конструктор формы.

Теперь форма приложения и дочерние формы ведут себя так, как я хочу.Нет кнопок на панели задач для форм Delphi, и формы Delphi исчезают при сворачивании основной формы приложения .NET и появляются снова при восстановлении основной формы.

1 голос
/ 10 марта 2011

Вы можете попробовать это:

public const int GWL_EXSTYLE = -20;

public const int WS_EX_APPWINDOW = 0x00040000L;

SetWindowLong (hWnd, GWL_EXSTYLE, GetWindowLong (hWnd, GWL_EXSTYLE) | ~ WS_EX_APPWINDOW);

Вы можете найти определения C # p / invoke для SetWindowLong и GetWindowLong в http://pinvoke.net/

Надеюсь, это поможет.

1 голос
/ 10 марта 2011

Я думаю, что есть много ваших проблем, которые можно решить, установив владельца форм Delphi.

Вам придется сделать это через p / invoke:

Вам также нужно знать дескриптор окна ваших Delphi-окон.

Кроме того, я думаю, что вы могли бы удалить кнопку, о которой говорите, другими, более сложными методами p / invoke. Существуют методы для обхода дочерних окон окна, после чего вы можете отсоединить родительское окно от кнопки и уничтожить его. Однако это довольно хакерская вещь, и было бы трудно понять, как правильно.

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