Шаг 173 - Меню и классы дальше

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

//СSharp DotNet Sample Code
// ......
// будем рисовать линию
private void MenuDrawLine_Click(Object sender, EventArgs e)
{
	menuEdit.Enabled=false;
	testDraw=true;
	Cursor=Cursors.Cross;
}
	
// будем рисовать полигон
private void MenuDrawPoligon_Click(Object sender,EventArgs e)
{
	menuEdit.Enabled=false;
	testDraw=true;
	Cursor=Cursors.Cross;
}
	
// будем рисовать точку
private void MenuDrawPoint_Click(Object sender,EventArgs e)
{
	menuEdit.Enabled=false;
	testDraw=true;
	Cursor=Cursors.Cross;
}
// ......

Можно запутаться. Конечно, функция нужна, ну давайте ее сделаем. Будет называться StartEdit.

//СSharp DotNet Sample Code
// будем рисовать линию
private void MenuDrawLine_Click(Object sender, EventArgs e)
{
	StartEdit();
}
	
void StartEdit()
{
	menuEdit.Enabled=false;
	testDraw=true;
	Cursor=Cursors.Cross;
}
	
// будем рисовать полигон
private void MenuDrawPoligon_Click(Object sender,EventArgs e)
{
	StartEdit();
}
	
// будем рисовать точку
private void MenuDrawPoint_Click(Object sender,EventArgs e)
{
	StartEdit();
}

Теперь лучше исправления всего в одном месте. Думаете таким способом можно идти дальше? Нет, он тупиковый. Мы знаем, что начилось рисование, но не знаем какой тип рисуем. Ведь площадь должна замкнуться, точка и линия разное дело, нарисовать точку это щелкнуть в одном месте, а линия много точек. Значит нам придется завести еще три переменные которые будет говорить о том какой пункт меню выбран. А если типов будет больше например точку можно рассматривать как символ или как окружность что делать ? Заводить 25 переменных типа bool? И в каждой процедуру обработки писать длинный Swith? И не забыть и не перепутать ? Мне кажется это проблематично. Нужен другой выход. Кроме того, мы знаем, что у этих всех процедур рисования есть что-то общее. Это общее механизм рисования.

Начать
Продолжить
Отменить
Зафиксировать

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

//СSharp DotNet Sample Code
// ......

abstract class IMenuDraw
{
	public IMenuDraw(MenuItem menuAccosiate, Form frm)
	{
		MenuForm=frm;
		MenuForm.Cursor=Cursors.Cross;
		menu=menuAccosiate;
		menu.Enabled=false;
	}
		
	abstract public  void Start();	// первая точка
	abstract public void Next();	// следующая
	abstract public void Back();	// отменить последнею
		
	virtual  public void Finish()	// завершить
	{
		CanselEdit();
	}
		
	private void CanselEdit()
	{
		menu.Enabled=true;
		MenuForm.Cursor=Cursors.Default;
	}
	Form MenuForm;
	MenuItem menu;
}

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

//СSharp DotNet Sample Code
// ......

class DrawPoligon : IMenuDraw
{
	public DrawPoligon(MenuItem menuAccosiate,Form frm):base(menuAccosiate,frm)
	{}
	
	override public void Start()
	{}
	 
	public void Break()
	{}
	 
	override public void Back()
	{}
	 
	override public void Finish()
	{
		base.Finish();
	}
	 
	override public void Next()
	{}
}
	
class DrawLines : IMenuDraw 
{
		
	public DrawLines(MenuItem menuAccosiate,Form frm):base(menuAccosiate,frm)
	{}

	override public void Start()
	{}

	public void Break()
	{}

	override public void Finish()
	{
		base.Finish();
	}

	override public void Next()
	{}

	override public void Back()
	{}
}
	
class DrawPoints : IMenuDraw 
{
	public DrawPoints(MenuItem menuAccosiate,Form frm):base(menuAccosiate,frm)
	{}

	override public void Start()
	{}

	public void Break()
	{}

	override public void Finish()
	{
		base.Finish();
	}

	override public void Next()
	{}

	override public void Back()
	{}
}

Ну и что ? Продолжение следует. Полный код в проекте.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 31.10.2001