আমি কীভাবে কমান্ড অবজেক্টসকে সঠিক রিসিভারের সাথে যুক্ত করব?


9

আমি আমার প্রকল্পে পূর্বাবস্থায় ফিরিয়ে আনার জন্য কমান্ড প্যাটার্ন ব্যবহার করার চেষ্টা করেছি

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";
    }
 }
...

The Undoএবং Redostacks মধ্যে সংরক্ষণ করা হয় 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বস্তুটি পুরানো ফর্মটির জন্য একটি রেফারেন্স সঞ্চয় করে এবং এর ফলে দুর্ব্যবহার ঘটে।

অতএব, আমি মনে করি যে কমান্ডগুলির মূল ফর্ম বা ওয়েব ব্রাউজার নিয়ন্ত্রণের জন্য আমার অবশ্যই একটি ধারাবাহিক রিসিভার খুঁজে পেতে হবে, যার কমান্ডগুলি নিজের মতো করে একই সময়ের সাথে জীবনযাপন করবে। তবে তবুও আমার কাছে কমান্ড সম্পর্কিত কিছু নিয়ন্ত্রণে অ্যাক্সেস থাকা উচিত।

Commandবস্তু গ্রহণের জন্য কমান্ড কার্যকারিতা কার্যকর করার সেরা স্থানটি কোথায় ? অথবা স্ট্যাক থেকে পপড কমান্ডের সাথে নতুন ফর্ম সংযুক্ত করার অন্য কোনও উপায়।


আমি মনে করি এই সিদ্ধান্ত আপনার উপর আছে। আমরা আপনাকে সহায়তা করতে পারি না কারণ আমরা আপনার আবেদনের নির্দিষ্টকরণ বা কার্যকরী প্রয়োজনীয়তাগুলি জানি না।
ইউফোরিক

8
আমি বিশ্বাস করি কমান্ড অবজেক্টগুলিতে কেবল সিরিয়ালাইজযোগ্য ডেটা থাকা উচিত (যেমন, অন্যান্য বস্তুর কোনও রেফারেন্স নেই) যেহেতু তাদের সাধারণ ব্যবহারের ফলে নেটওয়ার্কগুলিতে তাদের সিরিয়ালযুক্ত ফর্মগুলি প্রেরণ করা, তাদের পরে কোনও ফাইলে সংরক্ষণ করা, বা অন্য কোনও রিসিভারে পুনরায় খেলানো অন্তর্ভুক্ত রয়েছে (যদি আপনি চান) আপনার পরিবর্তনগুলি রিয়েল টাইমে আমার স্ক্রিনে প্রদর্শিত হবে)) এর অর্থ হতে পারে আপনি প্রতিটি কমান্ড পদ্ধতিতে রিসিভারে পাস করতে চান, বা রিসিভার এক্সিকিউটকম্যান্ড () / UndoCommand () পদ্ধতিগুলি দিতে পারেন যা এটি নিজের মধ্যে প্রবেশ করতে পারে, অথবা সম্ভবত আদেশের পরিবর্তে কোডের পরিবর্তে পদ্ধতি নাম / আর্গুমেন্ট ধারণ করে এমন কমান্ড অবজেক্ট ব্যবহার করে ।
Ixrec


@ ইক্সেরেক আপনার পরামর্শের জন্য আপনাকে ধন্যবাদ, তারপরে আপনার অর্থ হ'ল আমার Receiverপ্রতিটি কমান্ডের অবজেক্টের সেট করতে সক্ষম হওয়া উচিত , আমি এটি করতে যাচ্ছি।
আহমাদ

পরিবর্তে স্মৃতিসৌধটি ব্যবহার করার বিষয়টি বিবেচনা করুন।
পি। রো

উত্তর:


1

কমান্ড প্যাটার্ন আবেদন করতে হবে মডেল , এবং UI 'তে। আপনার ক্ষেত্রে, এটি তৈরি করুন

protected HtmlDocument Receiver { set; get; }
protected HtmlElement Element { set; get; }

ইউআই আপডেট করতে, পর্যবেক্ষক প্যাটার্নটি ব্যবহার করুন , সুতরাং সমস্ত উন্মুক্ত ফর্ম এবং তাদের নিয়ন্ত্রণগুলি অন্তর্নিহিত মডেলটিতে পরিবর্তিত হতে পারে।

আপনার কোডটি আরও স্পষ্ট হয়ে উঠবে এবং আরও ডিউপলড হবে কারণ কমান্ড কেবলমাত্র দস্তাবেজ পরিবর্তন করার বিষয়ে যত্ন নিতে পারে এবং ইউআই এর পর্যবেক্ষকরা ঠিক কী পরিবর্তিত হয়েছে তা বিবেচনা না করেই নিয়ন্ত্রণগুলি আপডেট করতে হয়।

যখন কোনও ফর্ম বন্ধ হয়ে যায়, তখন এটি নিজেকে পর্যবেক্ষক হিসাবে নিবন্ধভুক্ত করবে এবং এর কোনও রেফারেন্স রাখা হবে না।

একটি নতুন ফর্ম নথিতে একটি পরিবর্তনের পর খোলা হয় তাহলে, এটি একটি পর জানানো হবে পূর্বাবস্থা এমনকি যদি এটা বর্তমান যখন মূল পরিবর্তনটি করা হয়েছিল ছিল না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.