Управление формой Delphi 7 из приложения .NET 4 WinForm

2

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

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

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

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

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

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

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

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

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

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

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

Теги:
interop

3 ответа

1
Лучший ответ

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

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

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

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

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

1

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

Вам нужно сделать это через p/invoke:

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

Кроме того, я думаю, вы могли бы удалить кнопку, о которой говорите, другими, более сложными методами p/invoke. Есть методы, чтобы петля через дочерние окна окна, тогда вы можете отсоединить родительское окно от кнопки и уничтожить ее. Это довольно немного взломать, и было бы трудно получить право, однако.

  • 2
    А? Почему это было отклонено без каких-либо комментариев? +1, чтобы компенсировать.
  • 0
    Да, без сомнения. Круто, что тебя зовут Wouter, для англоговорящего , это напоминает мне о WOOT !!!
1

Вы можете попробовать следующее:

public const int GWL_EXSTYLE = -20;

public const int WS_EX_APPWINDOW = 0x00040000L;

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

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

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

  • 1
    Интересно, почему кто-то здесь отрицает ответы, не оставляя комментариев?
  • 1
    Я получил твою спину +1, по моему мнению, неплохой ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню