Добавление формы в плагин на c# (на основе шаблона z-arthur'а)

Автор krupnovaa, 24.10.18, 10:01:13

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

krupnovaa

Здравствуйте. Не очень искушен в c# (а в других и того меньше). подскажите, а в проекте dll библиотеки возможно создать форму и открыть её экземпляр?

Chaa

Возможно, но есть много тонкостей.
Проще использовать Delphi, сейчас бесплатно дают (с некоторыми ограничениями) Delphi Community Edition.

.1 Если используете WinForms, то просто создаете форму, и задаете ей окно-владелец:

var form = new MyForm();
UnsafeNativeMethods.SetWindowLongPtr(form.Handle, GWL_HWNDPARENT, PluginCall.ClientHandle);
form.ShowDialog();

2. Если используете WPF, то создаете форму WinForms как в п.1, в ней System.Windows.Forms.Integration.ElementHost, а в нем уже окно WPF.
+ Благодарностей: 1

once

Нет проблем создания и использования windows forms в проете dll. Просто добавьте ссылку в проект на System.Windows.Forms и будет счастье. WPF в Лоцмане не работает, проверено.

Chaa

Цитата: once от 30.10.18, 19:12:05
WPF в Лоцмане не работает, проверено.
Рантайм Delphi и C# требует разных настроек в регистре управления FPU.
Так как в WPF все координаты представлены числами с плавающей точкой, то при неправильной настройке FPU все ломается.
Поэтому при входе в функцию плагина нужно писать в этот регистр значение для C#, при выходе для Delphi, и все будет хорошо.
+ Благодарностей: 1

once

Не уверен, будет ли все хорошо, ведь плагин может работать и не в модальном режиме, то есть параллельно с Лоцманом.

Chaa

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

Но в версии 2018 в SDK есть описание того, как сделать свой фрейм для клиента Лоцмана.

once

У меня есть немодальный плагин на c# под Лоцман, но не WPF. Работает без сбоев. Если нужно, могу залить проект.

Chaa


once

Проект на C# немодального плагина под Лоцман во вложении.

krupnovaa

Уважаемый once  :)!

Подскажите пожалуйста, возможно ли на основе Вашего проекта реализовать
1. Прямое взаимодействие между клиентом Лоцмана (например, при выборе в клиенте объекта его Idversion передается в открытое немодальное окно)
2. Обратную связь плагина и клиента (например, создать новый объект из немодального плагина и открыть его в клиенте)

и дайте совет, где посмотреть/разобраться с применением dllexport (не понимаю смысла событий после сборки в проекте)

Chaa

Можно пойти двумя путями:
1. Создать свой фрейм для клиента Лоцмана. Там свой API. Создание фреймов описано в LoodsmanClientApi.chm в SDK от версии 2018.
2. Обычный плагин может периодически вызывать RunMethod('CGetTreeSelectedIDs') для получения выделения в дереве.
С помощью отправки сообщения WM_OPENOBJECTSINNEWWINDOW можно открыть объекты в новом окне.

krupnovaa

Спасибо. Интересно, а как в плане политики лицензирования (sdk 2-18 версии, а информация я так понимаю в части фреймов применима и в отношении предыдущих версий). У нас 2014 версия )))

krupnovaa

Цитата: Chaa от 29.11.18, 13:24:40
2. Обычный плагин может периодически вызывать RunMethod('CGetTreeSelectedIDs') для получения выделения в дереве.

Насколько я понял,
IPluginCall pc = (IPluginCall)Marshal.GetTypedObjectForIUnknown(IPC, typeof(IPluginCall));
запоминает, какой объект выделен в клиенте.
Далее у меня
Form1 f = new Form1(pc);
Application.Run(f);

Я должен периодически выполнять
IPluginCall pc = (IPluginCall)Marshal.GetTypedObjectForIUnknown(IPC, typeof(IPluginCall));
?
Но как я получу IPC?


Black_Walker

Цитата: once от 30.10.18, 19:12:05WPF в Лоцмане не работает, проверено.

Я вот так решил вопрос:
Создал UserControl WPF (назвал его класс MainWindow). А затем при вызове плагина из меню:
using System.Windows;
...
private void Command(INetPluginCall obj)
    {
        Window mainWindow = new Window();
        mainWindow.Content = new MainWindow();
        mainWindow.Show();       
    }