프로젝트에서 실행 취소 및 다시 실행을 구현 하기 위해 명령 패턴 을 사용하려고했습니다.
public abstract class Command
{
protected Form Receiver { set; get; }
protected HtmlElement Element { set; get; }
abstract public void ReDo();
abstract public void UnDo();
public Command(Form receiver)
{
this.Receiver = receiver;
}
}
class AddElementCmd : Command
{
public AddElementCmd(HtmlElement elem, Form receiver)
: base(receiver)
{
Element = elem;
}
public override void ReDo()
{
((FormEdit)Receiver).AddElement(Element,false);
}
public override void UnDo()
{
((FormEdit)Receiver).DelElement(Element, false);
}
}
class DelElementCmd : Command
{
public DelElementCmd(HtmlElement elem, Form receiver)
: base(receiver)
{
Element = elem;
}
public override void ReDo()
{
((FormEdit)Receiver).DelElement(Element, false);
}
public override void UnDo()
{
((FormEdit)Receiver).AddElement(Element, false);
}
}
의 AddElement
명령 구현 FormEdit
.
public void AddElement(HtmlElement elem, bool isNew = true)
{
IHTMLElement2 dom = elem.DomElement as IHTMLElement2;
if (isNew)
{
Command cmd = new AddElementCmd(elem, this);
Undo.Push(cmd);
Redo.Clear();
}
// some codes here....
if (showAlltoolStripButton.Checked)
{
dom.runtimeStyle.visibility = "hidden";
}
else if (showSelectionToolStripButton.Checked)
{
dom.runtimeStyle.visibility = "visible";
}
}
...
Undo
및 Redo
스택은에 저장되어있는 FormMain
클래스와 편집 형태로 전달됩니다.
public Stack<Command> Undo = new Stack<Command>();
public Stack<Command> Redo = new Stack<Command>();
....
FormEdit editor = new FormEdit ();
editor.Browser = webBrowser1;
editor.addedElements = addedElements;
editor.restoreElements = restoreElements;
editor.Undo = Undo;
editor.Redo = Redo;
새로운 FormEdit
사용자가 다시 실행 또는 실행 취소 버튼을 클릭하면의 해당 기능 FormEdit
이 실행되지만이 명령 수신기를 확인하면 명령이 처음 생성되어 이제 폐기되었을 수 있습니다. 프로그램에서 오류가 발생할 것으로 예상되지만 Command
개체가 이전 형식에 대한 참조를 저장하는 것으로 보이며 이로 인해 오작동이 발생합니다.
따라서 명령 자체와 수명이 동일한 기본 양식 또는 webBrowser 컨트롤과 같은 명령에 대한 일관된 수신자를 찾아야한다고 생각합니다. 그러나 명령과 관련된 일부 컨트롤에 액세스해야합니다.
Command
객체 의 수신자로서 명령 기능을 구현하기에 가장 좋은 곳은 어디 입니까? 또는 스택에서 튀어 나온 명령에 새 양식을 연결하는 다른 방법.
Receiver
각 명령 객체 를 설정할 수 있어야합니다 .