• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

ActiveX Вертикали

Автор Fomenko75, 25.09.14, 14:28:49

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

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

Fomenko75

Добрый день

Подскажите кто сталкивался с программированием ActiveX закладок в Вертикали на C#.   Как прописать свойства и методы что бы закладка появилась в Вертикали..  Руководство читал. Как реализовать интерфейс  IConten?

Fomenko75

 Вот что смог пока сделать..  но закладка не появляется. Что ещё не хватает ?

   
    [Guid("F553CEB4-75EF-4842-8D35-B11929C9A13F")]
    public interface IContent
    {
        bool implVisible { get; set; }         
        int implOwner { get; set; }         
        void implCreate(Vertical.Application_ app);                 
        void implDestroy();                 
        void implUserClose();
    }
    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces(typeof(IContent))]
    [Guid("80B59B58-98EA-303C-BE83-D26E5D8D6794")]
    public partial class Form1: UserControl, IContent
    {
        public int Owner;
        public bool Visib = true;
        Vertical.Application_ VertApp;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        #region Properties
        public int implOwner
        {
            get
            {
                return Owner;
            }
            set
            {
                Owner = value;
            }
        }

        public bool implVisible
        {
            get
            {
                return Visib;
            }
            set
            {
                Visib = value;
            }
        }
        #endregion
        #region Methods
        public void implCreate(Vertical.Application_ App )
        {
            MessageBox.Show("ok");
            VertApp = App;
        }
        public void implDestroy()
        {
        }

        public void implUserClose()
        {
        }

Fomenko75

Необходимо вернуть S_OK если ActiveX форма поддерживает переданный ей интерфейс и выполнение метода implCreate прошло успешно, в противном случае будет вызван метод implDestroy и ActiveX форма будет разрушена.  (из документации)   .  Не понятно как вернуть S_OK в C#


chum

Попробуйте в public void implCreate
написать return S_OK.
По крайней мере, в папке с примером ActiveX закладки
ASCON\Vertical\SDK\VCustomFormX\
есть код на Delphi:
function TVCustomFormX.implCreate(const Owner: IDispatch): HResult;
// инциализация новой формы, по одному вызову на каждый активный документ при первом открытии
begin
  FCurObj := nil;
  FOwner := TDocumentObject.Create(nil);
  FOwner.OnChanged := ChangeEvent;
  FOwner.ConnectTo(Owner as IDocumentObject);
  InInitMode := false;
  // После успешной инициализации необходимо вернуть S_OK
  Result := S_OK;
end;

Fomenko75

В том то и дело  что в c# нет такой константы s_ok  в делфи всё работает

chum

28.09.14, 00:36:05 #5 Последнее редактирование: 28.09.14, 00:52:42 от chum
так эта константа равна нулю. А сам HResult - 32-разрядное целое. Если вместо void его возвращать?

Fomenko75

Всё заработало вкладка появилась. Кому интересно вот код

    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces(typeof(IContent))]
    public partial class Form1: UserControl,  IContent
    {
        private const int S_OK = 0;
        public object Owner;
        public bool Visib = true;
        Vertical.Application_ VertApp;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        #region Properties
        public object implOwner
        {
            get
            {
                return Owner;
            }
            set
            {
                Owner = value;
            }
        }

        public bool implVisible
        {
            get
            {
                return Visib;
            }
            set
            {
                Visib = value;
            }
        }
        #endregion
        #region Methods

        public int implCreate([In, MarshalAs(UnmanagedType.IDispatch)] object p_TPDoc)
        {
            IDocumentObject DocObj = (IDocumentObject)p_TPDoc;
            int c = DocObj.PageCount;
            MessageBox.Show("ok"  + c.ToString());
            return 0;
        }
        public void implDestroy()
        {
        }

        public void implUserClose(ref bool close)
        {
        }