मैंने अपने प्रोजेक्ट में 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प्रत्येक कमांड ऑब्जेक्ट को सेट करने में सक्षम होना चाहिए , मैं यह करने जा रहा हूं।