मैंने अपने प्रोजेक्ट में Undo और Redo को लागू करने के लिए कमांड पैटर्न का उपयोग करने की कोशिश की
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
उपयोगकर्ता Redo या पूर्ववत करें बटन पर क्लिक करता है, तो संबंधित फ़ंक्शन FormEdit
को निष्पादित किया जाता है, लेकिन जैसा कि मैंने जांचा था कि कमांड का यह रिसीवर वह रूप है जिसमें कमांड पहले बनाया गया था और अब इसका निपटान किया जा सकता है। मुझे उम्मीद है कि कार्यक्रम एक त्रुटि बढ़ाता है, लेकिन ऐसा लगता है कि Command
ऑब्जेक्ट पुराने रूप के संदर्भ को संग्रहीत करता है और इससे दुर्व्यवहार होता है।
इसलिए, मुझे लगता है कि मुझे कमांड के लिए एक सुसंगत रिसीवर खोजना होगा, या तो मुख्य रूप या वेबब्रोज़र नियंत्रण, जिसमें कमांड के रूप में एक ही जीवन समय हो। लेकिन फिर भी मुझे कमांड से संबंधित कुछ नियंत्रणों तक पहुंच होनी चाहिए।
Command
ऑब्जेक्ट के रिसीवर के रूप में कमांड फ़ंक्शन को लागू करने के लिए सबसे अच्छी जगह कहां है ? या नए फॉर्म को कमांड से जोड़ने के लिए किसी अन्य तरीके से स्टैक से पॉपअप किया जाता है।
Receiver
प्रत्येक कमांड ऑब्जेक्ट को सेट करने में सक्षम होना चाहिए , मैं यह करने जा रहा हूं।