Создание элемента управления ActiveX для SCADA Vijeo Citect с помощью Microsoft Visual C# 2012

Окончательный вариант пользовательского интерфейса должен выглядеть приблизительно как показано на рис. 6.

Приблизительный вид графический интерфейс элемента управления ActiveX

Рис. 6. Приблизительный вид пользовательского интерфейс элемента управления ActiveX

Как только все элементы пользовательского интерфейса добавлены, перейдите в режим просмотра кода, путем двойного щелчка на любом элементе на форме и добавьте следующие атрибуты в класс SampleUI:

  • [ComVisible(true)]
  • [Guid("BC97AC9D-4851-49CF-A5F8-F8C51B0753EF")]
  • [ClassInterface(ClassInterfaceType.None)]
  • [ComDefaultInterface(typeof(IMyFirstActiveX))]
  • [ComSourceInterface(typeof(IMyFirstActiveXEvents))]

Затем, в классе SampleUI необходимо реализовать интерфейс IMyFirstActiveX. Для этого необходимо имя интерфейса добавляется в определение класса как показано ниже.

public partial class SampleUI : UserControl, IMyFirstActiveX

Для использования выше указанных атрибутов в классе SampleUI, также необходмо подключить  пространство имен System.Runtime.InteropServices, как описывалось выше.

Реализация свойств и методов

Фактически реализация свойств и методов выглядит следующим образом:

  • При изменении значения свойства происходит следующее:
    • Обновление текстового поля графического интерфейса, которое отображает текущее значение соответствующего свойства
    • Инициирование события OnValueChanged. Это происходит через вызов метода ValueChanged
    • Добавление новой строки в ListView, информирующий об изменении значения свойства

Для всех методов, откуда бы они не вызывались, добавляется новая строка в ListView, включающая имя метода и аргументы, которые были переданы методу.

ListView обновляется через вызов метода UpdateListView. 

Свойство StrProperty

private string strProperty;
public string StrProperty
{
        get
        {
                UpdateListView("Значение свойства StrProperty было запрошено!");
                return strProperty;
        }
       
        set
        {
                if (strProperty != value)
                {
                        strProperty = value; txtStrProperty.Text = value;
                        ValueChanged("StrProperty");
                        UpdateListView("Значение свойства StrProperty было изменено на: " + value);
                }
        }
}

Свойство IntProperty

private int intProperty;
public int IntProperty
{
        get
        {
                UpdateListView("Значение свойства IntProperty было запрошен!");
                return intProperty;
        }
        set
        {
                if (intProperty != value)
                {
                intProperty = value;
                txtIntProperty.Text = value.ToString();
                ValueChanged("IntProperty");
                UpdateListView("Значение свойства IntProperty было изменено на: " + value.ToString());
                }
        }
}

Свойство FloatProperty

private float floatProperty;
public float FloatProperty
{
        get
        {
                UpdateListView("Значение свойства FloatProperty было запрошен!");
                return floatProperty;
        }
        set
        {
                if (floatProperty != value)
                {
                        floatProperty = value; txtFloatProperty.Text = value.ToString();
                        ValueChanged("FloatProperty");
                        UpdateListView("Значение свойства FloatProperty было изменено на: " + value.ToString());
                }
        }
}

Метод SampleMethod

public void SampleMethod()
{
        UpdateListView("Метод SampleMethod() выполнен!");
}

Метод SampleMethodWithArgs

public void SampleMethodWithArgs(string arg1)
{
        UpdateListView(string.Format("Метод SampleMethodWithArgs({0}) выполнен!", arg1));
}

Вспомогательные методы

private void ValueChanged(string propertyname)
{
        if (this.OnValueChanged != null)
        this.OnValueChanged(propertyname);
}

private void UpdateListView(string details)
{
        ListViewItem item = new ListViewItem(new string[] { DateTime.Now.ToString(), details });
        listView1.Items.Insert(0, item);
}

Реализация событий

События реализуются с помощью делегатов. Сигнатуры делегатов (т.е. возвращаемое значение и аргументы) должны совпадать с сигнатурами событий определенных в интерфейсе (в нашем случае в интерфейсе IMyFirstActiveXEvents). Имена событий также должны совпадать с именами делегатов.

Страницы

Теги: