17.06.2010, 13:04 | #1 |
Участник
|
Привет, нужно вставить грид - внешнее приложение в форму навижена.
Грид написан на C#. Компилю приложение как DLL. На форме навижена создаю переменную типа Automation. Что делать дальше? Нужно не просто вставить DLL, а потом отслеживать строку с номером заказа внутри компонента, и соответственно передавать его в навижн. Если кто-то сталкивался с подобным, поделитесь опытом. Спасибо. P.S. Ищу на mibuso. |
|
17.06.2010, 17:16 | #2 |
Участник
|
Насколько я знаю, nav, во всяком случае до версии 5, не поддерживает визуальные контролы реализованные в виде ActiveX.
|
|
17.06.2010, 17:19 | #3 |
Участник
|
Цитата:
Получилось вставить на форму, НО нужно что бы часть формы содержала навиковские элементы, а часть - контрол. Сделал сабформу, на её инициализации пишу CREATE(aa); aa.Show; сабформа серая( |
|
18.06.2010, 10:43 | #4 |
Участник
|
я в шоке!
Можете показать скриншоты? Вы уверены, что вызов aa.Show не показывает диалогового окна как это, например, делается при отображении диаграммы гантта или CommonDlg? или же навовская форма действительно служит контейнером для Вашего грида? |
|
18.06.2010, 10:58 | #5 |
Участник
|
Смотрите примеры:
http://www.mibuso.com/dlinfo.asp?FileID=530 http://www.mibuso.com/dlinfo.asp?FileID=499 С Ув.
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
18.06.2010, 11:00 | #6 |
Участник
|
Цитата:
Вы правы, поверх формы вызывается программа. |
|
18.06.2010, 11:11 | #7 |
Участник
|
Цитата:
Сообщение от captain
Смотрите примеры:
http://www.mibuso.com/dlinfo.asp?FileID=530 http://www.mibuso.com/dlinfo.asp?FileID=499 С Ув. Сейчас сложность в том, как из C# (на котором грид) написать функцию для получения хендла окна из которого вызывается, и в нем нарисовать. |
|
18.06.2010, 12:14 | #8 |
Участник
|
Я думаю, что Вы взялись за невероятно сложную задачу, не имея определенных знаний.
хендл окна можно получить с помощью функций WinAPI FindWindow и FindWindowEx. Иными словами, Вам нужно передавать в функцию Show некий параметр например (например название текущего окна) по которому можно с помощью выше указанных функций определить хендл окна вызвавшего метод Show грида. Далее тоже непростое дело - внедрить контрол в чужое окно, но и это можно сделать. Однако самое сложное, как мне кажется, будет дальше, когда Вам нужно будет управлять набором данных и в гриде и так чтобы клиент нава был в курсе ваших манипуляций. Ну например, вы в гриде удалили строку, надо чтобы не просто она удалилась а еще и отработал триггер OnDelete. Т.е. нужно хорошо разбираться в во внутренних функциях клиента нава, это как минимум дизассемблирование или отладка в SoftIce. Т.е. вы должны знать и уметь: 1. WinApi (технологии перехвата сообщений, субклассирование и тд) 2. Понимать как работает клиент NAV. 2. Уметь пользоваться отладчиками и дизасемблерами 3. ASM |
|
18.06.2010, 12:18 | #9 |
Участник
|
Цитата:
Сообщение от del_negrozzz
Я думаю, что Вы взялись за невероятно сложную задачу, не имея определенных знаний.
хендл окна можно получить с помощью функций WinAPI FindWindow и FindWindowEx. Иными словами, Вам нужно передавать в функцию Show некий параметр например (например название текущего окна) по которому можно с помощью выше указанных функций определить хендл окна вызвавшего метод Show грида. Далее тоже непростое дело - внедрить контрол в чужое окно, но и это можно сделать. Однако самое сложное, как мне кажется, будет дальше, когда Вам нужно будет управлять набором данных и в гриде и так чтобы клиент нава был в курсе ваших манипуляций. Ну например, вы в гриде удалили строку, надо чтобы не просто она удалилась а еще и отработал триггер OnDelete. Т.е. нужно хорошо разбираться в во внутренних функциях клиента нава, это как минимум дизассемблирование или отладка в SoftIce. Т.е. вы должны знать и уметь: 1. WinApi (технологии перехвата сообщений, субклассирование и тд) 2. Понимать как работает клиент NAV. 2. Уметь пользоваться отладчиками и дизасемблерами 3. ASM |
|
18.06.2010, 18:25 | #10 |
Участник
|
Получилось вставить на форму.
В C#, в конструкторе формы должен быть написан следующий код: hFocus = GetFocus(); // API-шная функция _ParentHwnd = hFocus; След. задача, как обрабатывать события из компонента в навижн. |
|
21.06.2010, 11:43 | #11 |
Участник
|
СOM Объект должен поддерживать "WithEvents", тогда не надо ничего придумывать с хендлами окон.
Изменение значения на форме Com-объекта вызывает событие в Nav, где уже его обрабатываем. http://www.mibuso.com/dlinfo.asp?FileID=582 |
|
21.06.2010, 11:51 | #12 |
Участник
|
Цитата:
Сообщение от .Quattro.
СOM Объект должен поддерживать "WithEvents", тогда не надо ничего придумывать с хендлами окон.
Изменение значения на форме Com-объекта вызывает событие в Nav, где уже его обрабатываем. http://www.mibuso.com/dlinfo.asp?FileID=582 тут другая проблема возникла, через несколько секунд после первой загрузки dll, теряется фокус, и я не могу ввести или изменить информацию в гриде( в другом клиентском приложении, на C#, фокус не пропадает. |
|
23.06.2010, 20:16 | #13 |
Участник
|
Разбираю пример из Mibuso,
подключаеться обьект, видны и работают методы, но нет событий в Nav(( Код: Код: [assembly: ClassInterface(ClassInterfaceType.AutoDual)] namespace GridNewDB { [ComVisible(false)] public delegate void DataChangedEvent(string changedPrimaryKeyFrom); [Guid("A26E27C7-E2F8-4d10-9985-5AAEBCEA01B6")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] public interface GridMethod { void ShowGrid(); } [Guid("70BFA011-12EA-4cce-89DB-06755542E96B")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] public interface GridForm { void DataChanged(string changePrimaryKeyFrom); } [ProgId("GridNewDB")] [ClassInterface(ClassInterfaceType.None)] [ComSourceInterfaces("GridNewDB.GridForm, GridNewDB")] public partial class Form1 : Form, GridMethod {} //DataChanged("sd") |
|
23.06.2010, 22:08 | #14 |
Участник
|
А в свойствах переменной Automation установлен признак WithEvents?
|
|
23.06.2010, 22:13 | #15 |
Участник
|
|
|
24.06.2010, 11:24 | #16 |
Участник
|
При включенной опции событие видно, но при его вызове слетает нав.
|
|
24.06.2010, 12:06 | #17 |
Участник
|
Что бы окно отображалось в форме нав я использую такой код
void ShowForm() { IntPtr parentHwnd = GetFocus(); SetParent(this.Handle.ToInt32(), parentHwnd); SetWindowPos(this.Handle, new IntPtr(-2), 0, 0, 0, 0, TOPMOST_FLAGS); this.Visible = true; this.StartPosition = FormStartPosition.Manual; this.Location = new Point(0, 0); } И вызываю эту функцию по таймеру через 1 секунду после запуска формы, иначе окно рисуется в parent формы - в object exployer. Думаю, что проблема тут. |
|
24.06.2010, 12:45 | #18 |
Участник
|
Значит где-то в Com-объекте не так.
Можно сделать тестовый проект на .Net, который бы подключался к COM-объекту - тут есть варинт, что покажет описание ошибки. |
|
24.06.2010, 13:09 | #19 |
Участник
|
Цитата:
дело было в COM: в интерфейсе с событием нужно было указывать id атрибута [Guid("70BFA011-12EA-4cce-89DB-06755542E96B")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] public interface GridEvent { [DispIdAttribute(30)] void DataChanged(string str); } |
|
02.07.2010, 12:39 | #20 |
Участник
|
Цитата:
в форме показываете собственный grid и передаете в Nav определенные параметры из него ? А в Grid из NAv передать можно для полноценной двух сторонней связи ? |
|