AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.06.2010, 13:04   #1  
xyligan is offline
xyligan
Участник
 
19 / 10 (1) +
Регистрация: 12.05.2010
Привет, нужно вставить грид - внешнее приложение в форму навижена.
Грид написан на C#. Компилю приложение как DLL. На форме навижена создаю переменную типа Automation.
Что делать дальше?

Нужно не просто вставить DLL, а потом отслеживать строку с номером заказа внутри компонента, и соответственно передавать его в навижн.
Если кто-то сталкивался с подобным, поделитесь опытом.
Спасибо.

P.S. Ищу на mibuso.
Старый 17.06.2010, 17:16   #2  
del_negrozzz is offline
del_negrozzz
Участник
 
35 / 10 (1) +
Регистрация: 11.07.2007
Насколько я знаю, nav, во всяком случае до версии 5, не поддерживает визуальные контролы реализованные в виде ActiveX.
Старый 17.06.2010, 17:19   #3  
xyligan is offline
xyligan
Участник
 
19 / 10 (1) +
Регистрация: 12.05.2010
Цитата:
Сообщение от del_negrozzz Посмотреть сообщение
Насколько я знаю, nav, во всяком случае до версии 5, не поддерживает визуальные контролы реализованные в виде ActiveX.
В 5-ой версии поддерживаются.

Получилось вставить на форму, НО
нужно что бы часть формы содержала навиковские элементы, а часть - контрол.
Сделал сабформу, на её инициализации пишу
CREATE(aa);
aa.Show;

сабформа серая(
Старый 18.06.2010, 10:43   #4  
del_negrozzz is offline
del_negrozzz
Участник
 
35 / 10 (1) +
Регистрация: 11.07.2007
я в шоке!

Можете показать скриншоты?

Вы уверены, что вызов aa.Show не показывает диалогового окна как это, например, делается при отображении диаграммы гантта или CommonDlg?

или же навовская форма действительно служит контейнером для Вашего грида?
Старый 18.06.2010, 10:58   #5  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Смотрите примеры:

http://www.mibuso.com/dlinfo.asp?FileID=530
http://www.mibuso.com/dlinfo.asp?FileID=499

С Ув.
__________________
---------------------------------------------------------------------------------------------
"Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица
Старый 18.06.2010, 11:00   #6  
xyligan is offline
xyligan
Участник
 
19 / 10 (1) +
Регистрация: 12.05.2010
Цитата:
Сообщение от del_negrozzz Посмотреть сообщение
я в шоке!

Можете показать скриншоты?

Вы уверены, что вызов aa.Show не показывает диалогового окна как это, например, делается при отображении диаграммы гантта или CommonDlg?

или же навовская форма действительно служит контейнером для Вашего грида?
Туплю)
Вы правы, поверх формы вызывается программа.
Старый 18.06.2010, 11:11   #7  
xyligan is offline
xyligan
Участник
 
19 / 10 (1) +
Регистрация: 12.05.2010
Цитата:
Сообщение от captain Посмотреть сообщение
Спасибо за примеры.
Сейчас сложность в том, как из C# (на котором грид) написать функцию для получения хендла окна из которого вызывается, и в нем нарисовать.
Старый 18.06.2010, 12:14   #8  
del_negrozzz is offline
del_negrozzz
Участник
 
35 / 10 (1) +
Регистрация: 11.07.2007
Я думаю, что Вы взялись за невероятно сложную задачу, не имея определенных знаний.

хендл окна можно получить с помощью функций WinAPI FindWindow и FindWindowEx.
Иными словами,
Вам нужно передавать в функцию Show некий параметр например (например название текущего окна) по которому можно с помощью выше указанных функций определить хендл окна вызвавшего метод Show грида. Далее тоже непростое дело - внедрить контрол в чужое окно, но и это можно сделать. Однако самое сложное, как мне кажется, будет дальше, когда Вам нужно будет управлять набором данных и в гриде и так чтобы клиент нава был в курсе ваших манипуляций.
Ну например, вы в гриде удалили строку, надо чтобы не просто она удалилась а еще и отработал триггер OnDelete. Т.е. нужно хорошо разбираться в во внутренних функциях клиента нава, это как минимум дизассемблирование или отладка в SoftIce.

Т.е. вы должны знать и уметь:
1. WinApi (технологии перехвата сообщений, субклассирование и тд)
2. Понимать как работает клиент NAV.
2. Уметь пользоваться отладчиками и дизасемблерами
3. ASM
Старый 18.06.2010, 12:18   #9  
del_negrozzz is offline
del_negrozzz
Участник
 
35 / 10 (1) +
Регистрация: 11.07.2007
Цитата:
Сообщение от del_negrozzz Посмотреть сообщение
Я думаю, что Вы взялись за невероятно сложную задачу, не имея определенных знаний.

хендл окна можно получить с помощью функций WinAPI FindWindow и FindWindowEx.
Иными словами,
Вам нужно передавать в функцию Show некий параметр например (например название текущего окна) по которому можно с помощью выше указанных функций определить хендл окна вызвавшего метод Show грида. Далее тоже непростое дело - внедрить контрол в чужое окно, но и это можно сделать. Однако самое сложное, как мне кажется, будет дальше, когда Вам нужно будет управлять набором данных и в гриде и так чтобы клиент нава был в курсе ваших манипуляций.
Ну например, вы в гриде удалили строку, надо чтобы не просто она удалилась а еще и отработал триггер OnDelete. Т.е. нужно хорошо разбираться в во внутренних функциях клиента нава, это как минимум дизассемблирование или отладка в SoftIce.

Т.е. вы должны знать и уметь:
1. WinApi (технологии перехвата сообщений, субклассирование и тд)
2. Понимать как работает клиент NAV.
2. Уметь пользоваться отладчиками и дизасемблерами
3. ASM
Да, кстати, Spy++ может подкинуть идею об получении хедла окна
Старый 18.06.2010, 18:25   #10  
xyligan is offline
xyligan
Участник
 
19 / 10 (1) +
Регистрация: 12.05.2010
Получилось вставить на форму.
В C#, в конструкторе формы должен быть написан следующий код:
hFocus = GetFocus(); // API-шная функция
_ParentHwnd = hFocus;

След. задача, как обрабатывать события из компонента в навижн.
Старый 21.06.2010, 11:43   #11  
.Quattro. is offline
.Quattro.
Участник
Лучший по профессии 2009
 
194 / 22 (1) +++
Регистрация: 22.05.2006
СOM Объект должен поддерживать "WithEvents", тогда не надо ничего придумывать с хендлами окон.
Изменение значения на форме Com-объекта вызывает событие в Nav, где уже его обрабатываем.

http://www.mibuso.com/dlinfo.asp?FileID=582
Старый 21.06.2010, 11:51   #12  
xyligan is offline
xyligan
Участник
 
19 / 10 (1) +
Регистрация: 12.05.2010
Цитата:
Сообщение от .Quattro. Посмотреть сообщение
СOM Объект должен поддерживать "WithEvents", тогда не надо ничего придумывать с хендлами окон.
Изменение значения на форме Com-объекта вызывает событие в Nav, где уже его обрабатываем.

http://www.mibuso.com/dlinfo.asp?FileID=582
Спасибо, сейчас почитаю..

тут другая проблема возникла,
через несколько секунд после первой загрузки dll, теряется фокус, и я не могу ввести или изменить информацию в гриде(
в другом клиентском приложении, на C#, фокус не пропадает.
Старый 23.06.2010, 20:16   #13  
xyligan is offline
xyligan
Участник
 
19 / 10 (1) +
Регистрация: 12.05.2010
Разбираю пример из 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  
.Quattro. is offline
.Quattro.
Участник
Лучший по профессии 2009
 
194 / 22 (1) +++
Регистрация: 22.05.2006
А в свойствах переменной Automation установлен признак WithEvents?
Старый 23.06.2010, 22:13   #15  
xyligan is offline
xyligan
Участник
 
19 / 10 (1) +
Регистрация: 12.05.2010
Цитата:
Сообщение от .Quattro. Посмотреть сообщение
А в свойствах переменной Automation установлен признак WithEvents?
Это в навике??

вот я тупоой..

Спасибо большое, завтра на работе проверю)
Старый 24.06.2010, 11:24   #16  
xyligan is offline
xyligan
Участник
 
19 / 10 (1) +
Регистрация: 12.05.2010
При включенной опции событие видно, но при его вызове слетает нав.
Старый 24.06.2010, 12:06   #17  
xyligan is offline
xyligan
Участник
 
19 / 10 (1) +
Регистрация: 12.05.2010
Что бы окно отображалось в форме нав я использую такой код
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  
.Quattro. is offline
.Quattro.
Участник
Лучший по профессии 2009
 
194 / 22 (1) +++
Регистрация: 22.05.2006
Значит где-то в Com-объекте не так.
Можно сделать тестовый проект на .Net, который бы подключался к COM-объекту - тут есть варинт, что покажет описание ошибки.
Старый 24.06.2010, 13:09   #19  
xyligan is offline
xyligan
Участник
 
19 / 10 (1) +
Регистрация: 12.05.2010
Цитата:
Сообщение от .Quattro. Посмотреть сообщение
Значит где-то в Com-объекте не так.
Можно сделать тестовый проект на .Net, который бы подключался к COM-объекту - тут есть варинт, что покажет описание ошибки.
Получилось!!!

дело было в 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  
dmites is offline
dmites
Участник
Аватар для dmites
 
221 / 14 (1) ++
Регистрация: 10.08.2005
Цитата:
Сообщение от xyl!gan Посмотреть сообщение
Цитата:
Сообщение от .Quattro. Посмотреть сообщение
Значит где-то в Com-объекте не так.
Можно сделать тестовый проект на .Net, который бы подключался к COM-объекту - тут есть варинт, что покажет описание ошибки.
Получилось!!!
Я правильно понял, что
в форме показываете собственный grid и передаете в Nav определенные параметры из него ?
А в Grid из NAv передать можно для полноценной двух сторонней связи ?
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:15.