Создание собственных компонентов в C#

Цель занятия

Целью настоящего практического занятия является изучение способов создания собственных компонентов в среде C#. Аналогом этого занятия является создание компонентов Java Beans. В качестве дополнительной литературы можно рекомендовать [3].

Краткие теоретические сведения

В C# можно создавать следующие компоненты:         СОМ

(см. Введение к этой книгеj, компоненты на основе визуальных классов и пользовательские компоненты. Компоненты СОМ могут использоваться в других средах программирования, например, в JavaScript. В этой работе мы их не рассматриваем. Компоненты на основе визуальных классов позволяют вам придать некоторую новую функциональность стандартным визуальным компонентам, например, на основе класса файлового диалога дополнительно предусмотреть выдачу информации о свойствах файла. Пользовательские компоненты позволяют вам создавать любые функциональности для своего класса. Наконец, в C# можно внедрить чужой элемент ActiveX, например, калевдарь.

Итак, начнем с компонентов, которые строятся на основе визуальных классов. Рассмотрим создание компонента, представляющего собой текстовое поле и полосу вертикальной прокрутки. При перемещении ползунка в текстовом поле буцет отображаться его положение.

Для создания такого компонента следует выполнить следующие действия.

1.             Создать новый проект на базе шаблона Windows Control Library (File | New Project | Windows Control Library).

2.             Присвоить имя создаваемому компоненту, например, MY-

SCROLL.

3.             Разместить на форме текстовое поле (задайте его свойство Readonly = true) и полосу вертикальной прокрутки из панели элементов Window Forms.

4.             Создать следующий код (листинг 4.10).

using System;

using System.Collections;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Windows.Forms;

namespace WindowsControlLibraryl

/// <summary>

/// Summary description for UserControll.

/// </summa ry>

public class MYSCROLL : System.Windows.Forms.UserControl

private int m_min=int.MinValue; private int m_max=int.MaxValue; private int m_current=O;

private System.Windows.Forms.TextBox textBoxl; private System.Windows.Forms.VScrollBar vScrollBarl;

/// <summary>

/// Required designer variable.

/ / / < / summa ry>

private System.ComponentModel.Container components = null; public int Min

get

{return m_min;} set

{ m_min=value;}

public int Max get

{return m_max;} set

{ m_max=value;}

public int Current {

get

{return m_current;} set {

if((value>m_max)||(value<m_min))

{

throw new ArgumentOutOfRangeException("Current");

}

m_current=value;

textBoxl.Text=m_current.ToString();

}

}

}

}

В классе MYSCROLL мы определили три свойства: Min, мах и Current, задающие максимальную позицию, минимальную позицию и текущую позицию ползунка. Эти свойства являются публикуемыми (published, отображаемыми в окне свойств). Это значит, что они будут доступны в окне свойств объекта класса MYSCROLL, размещенного на форме обычным образом. Обратите внимание, как для каждого из этих свойств задаются методы get и set, используемые для получения (get) и установки (set) значения данного свойства у объекта.

Теперь надо запрограммировать реакцию на перемещение ползунка. Дважды щелкните мышью на ползунке на форме и вставьте следующий код:

private void vScrollBarl_Scroll(object sender,

System.Windows.Forms.ScrollEventArgs e)

{

if (e.Type==ScrollEventType.Sma11Increment)

{

try

{ Current-=1; }

catch

U

}

else

if (e.Type==ScrollEventType.Sma11Decrement)

{

Current+=1;

}

}

Событие Sma 11 increment происходит при смещении ползунка вниз, событие smaiiDecrement — при смещении ползунка вверх. Эти события анализируются в методе vScroiiBarl_scroii(), одним из аргументов которого является переменная scroiiEventArgs e, которая дает доступ к типу события из оператора if: if (e.Type==ScrollEventType.Sma11Decrement)

Созданный файл следует сохранить, например, под именем example.es.

5.             Скомпилируйте данный файл (вспомните, как выполняется компиляция из командной строки). Однако теперь мы должны построить dll, а это делается так:

csc /out: newelement.dll /t:library example.es

Здесь предполагается, что исходный файл назван example.es. Обратим внимание, что у него нет метода Main(). В результате будет построен выходной библиотечный dll- файл с именем newelement.dll.

6.             Закройте проект.

Теперь выясним, как разместить созданный компонент на форме. Для этого создайте проект на основе шаблона Wmdows AppU- cation. Создайте далее в окне элементов новую закладку, для чего нажмите правую кнопку мыши на этом окне и выберите пункт Add Tab. Введите имя закладки: м Y с ом p oN EN т s. Выделите эту закладку щелчком мыши и нажмите снова правую кнопку мыши. Появится окно такого вида (рис. 4.6).

Рис. 4.6. Окно для установки компонентов

Выберите закладку .NET Framework Components. Затем кнопку Browse. Найдите, где был сохранен ваш dll-файл. Он сохраняется в том месте, которое вы указали при открытии пустого проекта в каталоге … папка_с_проектамиДЗеЬ^Дйп/… . Когда вы отыщете ваш dll-файл, нажмите ОК. Ваш класс появится в списке, приведенном на рисунке выше. Выделите имя этого класса и нажмите ОК. Теперь класс будет размещен в окне элементов. С ним можно работать как с обычной кнопкой. То, что вы создали, иллюстрируется ниже (рис. 4.7).

Теперь рассмотрим, как создавать собственные невизуальные компоненты. Технология в целом почти такая же.

Итак, продолжаем с компонентов, которые строятся на основе собственных пользовательских классов. Рассмотрим создание

Рис. 4.7. Созданный компонент пользователя

компонента, представляющего собой закрашенный эллипс и имеющего редактируемое свойство Message.

Для создания такого компонента следует выполнить следующие

действия.

1.             Создайте новый проект на базе шаблона Windows Control Library (File | New Project | Windows Control Library).

2.             Присвойте имя создаваемому компоненту: например, MYCOMP.

3.             В окне Solution Explorer щелкните правой кнопкой мыши на узле userControii и удалите его из проекта.

4.             Щелкните правой кнопкой мыши в окне Solution Explorer на названии библиотеки и выберите команду Add | Add Inherited Control. Выберите шаблон Custom Control и присвойте файлу ИМЯ, например, WindowsControlLibrary2.es.

5.             Создайте, например, следующий код (листинг 4.11).

Листинг 4.11. Код компонента на основе собственного класса

using System;

using System.Collections;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Windows.Forms;

namespace WindowsControlLibrary2

/// <summary>

/// Summary description for CustomCTRLl.

/// </summary>

public class CustomCTRLl : System.Windows.Forms.Control {

private string m_mes; public string Message {

get

{return m_mes;} set

{m_mes=value;}

}

/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.Container components = null; public CustomCTRLl()

{

// This call is required by the Windows.Forms Form // Designer.

InitializeComponent();

ResizeRedraw =true;

m_mes=" TNTTTAT J .Y" ;

// TODO: Add any initialization after the InitComponent // call

}

/// <summary>

/// Clean up any resources being used.

/// </summary>

protected override void Dispose( bool disposing )

if( disposing )

if( components != null ) components.Dispose ();

}

base.Dispose( disposing );

}

#region Component Designer generated code /// <summary>

/// Required method for Designer support – do not modify /// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

components = new System.ComponentModel.Container();

}

#endregion

protected override void OnPaint(PaintEventArgs pe)

{

// TODO: Add custom paint code here // Calling the base class OnPaint SolidBrush b= new SolidBrush (Color.SteelBlue); pe.Graphics.FillEllipse(b,0,0,50,50); base.OnPaint(pe);

}

}

}

Прорисовку эллипса мы поместили в обработчик события

OnPaint() :

protected override void OnPaint(PaintEventArgs ре)

{

// TODO: Add custom paint code here // Calling the base class OnPaint SolidBrush b= new SolidBrush (Color.SteelBlue);

//Создает твердую кисть для заполнения цветом

pe.Graphics.FillEllipse(b,0,0,50,50);

// Рисует закрашенный эллипс; base.OnPaint(ре);

Объявление редактируемого свойства представлено следующим блоком:

private string m_mes; public string Message {

get

{return m_mes;} set

{m_mes=value;}

}

Теперь достаточно просто скомпилировать проект. При этом создается dll-файл, который вам нужно установить на палитру элементов так же, как и ранее созданный компонент на основе визуальных классов.

После этого можно работать с данным элементом, например, как с кнопкой.

Задание

Создайте собственный невизуальный элемент, который имеет два метода: один используется для получения головной части строки, второй — для получения хвостовой части. Например, первый метод объявлен как:

String Head(String str, String mask)

Этот метод получает исходную строку, например: "Heiio, friends" и строку-разделитель ",". Данный метод отыскивает в строке "Heiio, friends" первое вхождение строки-разделителя и возвращает часть исходной строки, стоящую до разделителя. Если же разделитель не встретится, то возвращается вся исходная строка.

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

П public int indexOf (string s) — возвращает номер позиции, где встречается первое вхождение строки s, например: String sl="Hello, Friends"; int i =sl.indexOf(",");

□ public String Substring(int il,int2) — выделяет ИЗ строки подстроку в диапазоне от il до il+i2.

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100