كيفية تنفيذ 'التراجع' العملية .صافي ويندوز التطبيق ؟

StackOverflow https://stackoverflow.com/questions/800940

  •  03-07-2019
  •  | 
  •  

سؤال

نفترض أن فوز شكل بعض حقول الإدخال و يدخل المستخدم/إعادة يدخل بعض البيانات.

كيفية الاحتفاظ البيانات المدخلة سابقا من قبل 'التراجع' العملية ؟

فقط أريد أن أعرف أفضل طريقة لتحقيق ذلك.

هل كانت مفيدة؟

المحلول

وهناك عدد قليل من الخيارات.الشيء المهم هو أن تبدأ في تصميم ذلك في وقت مبكر من المشروع.أحاول إضافة إلى المشاريع القائمة يمكن جدا مكلفة إذا لم تكن مصممة مع هذه القدرة في الاعتبار.

هناك عدد قليل الأساسية الأنماط التي سوف ترغب في الاستفادة من:

  1. MVC أو المراقب نمط.المفتاح الأول ليس كثيرا الدينية أو نمط متعصب تنفيذ رفيع المستوى العمارة.ما هو المهم هو أن البرنامج يتعرف على الفرق بين الوضع الحالي و عرض الدولة و فصل مناسب.يجب أن يكون هناك المشتركة المحددة بوضوح اقتران بين visual الدولة و تطبيق الدولة.هذا يوفر لك المشتركة العمارة تحتاج إلى إنشاء قيادة (انظر رقم 2).

  2. على الأمر نمط.يمكنك الحصول على الكثير من الجودة مع نمط القيادة (على الرغم من أنه يمكن أن يأتي على حساب بعض التعليمات البرمجية التي يبدو أنه يجب أن يكون المعالج من إنشاء).معين تسلكه القيادة ونمط قد تختلف (فئة واحدة في القيادة مع تنفيذ طريق يتجاوز مقابل فئة واحدة في العديد من أوامر التنفيذ عبر معالجات الأحداث, مثلا), ولكن الأوامر هي "العمل" فئة @رالف اقترح هيكلة كومة حولها.

    هذا يمكن أن تكون صعبة بعض الشيء ، ولكن النهج العام سيكون الاستماع لهذا الحدث الذي سيكون "ارتكاب" البيانات من visual الدولة إلى التطبيق الدولة.على Validated الحدث قد يكون جيد خطاف Textbox.على Click الحدث سيكون من المنطقي أكثر عن Button.عندما ترتكب يحدث ، يمكنك إنشاء الأوامر المرتبطة التي تتحكم في محاولة تنفيذ الأمر ، إضافة الأوامر إلى التراجع عن كومة إذا كان الأمر بنجاح.أنت الآن تتبع بالضبط ما يحدث بالضبط البيانات يحدث مع.

  3. على تذكار نمط.@JP انسحبت آخر قطعة من اللغز.يمكنك استخدام تذكار على حفظ الأوامر لتخزين ما المتضررة السيطرة على الدولة من قبل قيادة تنفيذها.هذا جنبا إلى جنب مع UnExecute() عضو في الأمر الخاص بك واجهة ، ينبغي أن يكون آخر قطعة أساسية في التصميم تحتاج إلى تنفيذ المهمة الخاصة بك.

الشيء الجميل حول نهج منظم مثل هذا هو أن لديك الآن امتداد طبيعي نقطة إضافية السلوك الذي يجب أن يحدث على أمر أساس.المعاملات تناسب طبيعية ، على سبيل المثال.في المشروع الحالي, أنا باستخدام WPF ICommand واجهة (في winforms المشروع) إلى تقديم ملاحظات حول ما إذا كان الأمر CanExecute() في أي وقت من الأوقات.هذا يتيح لي تمكين و تعطيل واجهة المستخدم الحاجيات بشكل مناسب في بحتة القيادة-تعتمد الطريقة.:)

الشيء المؤسف هو أن ليس هناك الكثير من الدعم لهذا الهيكل المدمج في Winforms (بقدر ما أعرف) ، لذلك سوف تحتاج إلى بناء من نقطة الصفر.لا قطعة واحدة معقدة بشكل خاص ، ولكن يمكنك أن تجد نفسك توليد كمية لا بأس بها من الغالب-رمز المتداول عن كل أمر.كما انها منتشرة تصميم تقنية.من أجل أن تكون فعالة ، يجب أن تستخدم باستمرار في جميع أنحاء المناسبة أجزاء من التطبيق.وهذا يجعل من التعديل التحديثي وظيفة مكلفة جدا ، خاصة إذا كان رمز الأصلي هو متداخل و incohesive.

نصائح أخرى

ولست متأكدا إذا WinForms عناصر / صافي ديه نوع من المدمج في تراجع الميزة التي يمكنك الاستفادة منها. ولكن ما كنت تبحث حقا لهو بنية بيانات المكدس لمساعدتك في إدارة قائمة من الإجراءات. سوف تحتاج إلى إنشاء نوع من "العمل" وجوه لتمثيل الإجراءات التي يمكن للمستخدم يمكن أن تفعله ولأنها تقدم من خلال تطبيق ستحتاج إلى دفع هذه الإجراءات على المكدس. عندما تضغط على زر التراجع، أو Ctrl-Z أو بأي طريقة بدء عمل التراجع عليك انصرف العمل الحالي واستعادة حالة الطلب إلى الإجراء السابق.

وهذه هي نظرة عامة أساسية جدا وعالية المستوى لكيفية هذا من شأنه أن يعمل ولكن أتصور أن تنفيذ مثل هذه الميزة يمكن الحصول معقدة للغاية. ولكم أن تتخيلوا كيف يحتاج إلى العمل لبرنامج مثل أدوبي فوتوشوب. : O

وهذا قد لا يكون أفضل طريقة للذهاب نحو ذلك اعتمادا على ما كنت تحاول إنجاز، ولكن هل يمكن استخدام richtextbox وندعو طريقة التراجع في صلب تلك السيطرة.

وعلى سبيل المثال:

richTextBox1.Undo();

هذا و <لأ href = "HTTP: // شبكة الاتصالات العالمية. dofactory.com/Patterns/PatternMemento.aspx "يختلط =" نوفولو noreferrer "> هذا قد يساعد.

وCTRL + Z يعمل على عناصر فردية.

إذا كنت تعمل مع البيانات وBindingSource، يمكنك "التراجع" التغييرات لا تزال قائمة لتسجيلة رقم (ق) عن طريق الدعوة في وظيفة CancelEdit أو بدلا من ذلك يمكنك تحميل البيانات لقاعدة البيانات.

واقتراحي هو لتحديد الاحتياجات التراجع محددة والفوائد العملية لها قبل البدء في التصميم والتنفيذ. لقد ورثت التطبيق WinForms عناصر التي استخدمت متتابعة عملية متعددة التراجع عبر كومة من "العمل" عام كائنات داخليا. ومع ذلك، تبين أن أيا من مستخدمي التطبيق تحدثت مع الاستخدام ولا طلب ميزة! والطريقة التي يعمل هذا التطبيق بشكل خاص، إذا كنت من مستخدمي التطبيق، أنا فقط لن أرى نفسي باستخدام ميزة سواء.

وظائف التراجع كان يمكن أن يكون أكثر فائدة في هذه الحالة إذا كان "انتقائية" تراجع. حيث يمكن للمستخدم تحديد أي عملية واحدة / تحرير العديد من التعديلات السابقة التي، قبل ارتكاب البيانات، واستعادة هذا تعديل واحد إلى حالته الأصلية، بدلا من أن تكون قادرة على التراجع عن العملية الأخيرة لأول مرة فقط، تليها الثانية إلى العملية الأخيرة وغيرها والتي هي كيفية تنفيذه.

في أي حال، فإن التطبيق وبالتالي يحتوي التعقيد لزوم لها والمراوغة، مما يجعل من الصعب وأبطأ في "جروك" وإجراء تغييرات وإدخال تحسينات على الوظائف الموجودة، في هذه الحالة عن القليل أو لا فائدة في العالم الحقيقي. وبما أنني ورثت هذا المشروع، لقد نفذت ميزات جديدة دون التراجع ولا أحد قد وجد أي شكاوى.

ويمكنك أيضا العثور على مكتبة ريفيرسي مفيدة، كما يبدو عدة أشخاص آخرين لديهم. انظر [ http://www.codeproject.com/KB/dotnet/ reversibleundoredo.aspx] [1] أو [هذا] [2]

[1]: http://www.codeproject.com/KB/dotnet /reversibleundoredo.aspx جعل التطبيق الخاص بك عكسية لدعم التراجع وإعادة

[2]: http://www.codeproject.com /script/Articles/Article.aspx؟aid=22502 تراجع الإعادة

<وأ href = "http://blogs.msdn.com/kirillosenkov/archive/2009/06/29/new-codeplex-project-a-simple-undo-redo-framework.aspx" يختلط = "نوفولو noreferrer "> http://blogs.msdn.com/kirillosenkov/archive/2009/06/29/new-codeplex-project-a-simple-undo-redo-framework.aspx

ويتوقف على مدى العديد من المستويات في التراجع، وكنت ترغب في أن يكون.

هل يمكن تخزين القيم قبل أن يكون "ملتزما" بمعنى ما إلى مجموعة مستوى نموذج لكل من الضوابط، والتي يمكن أن "استعادة" في نقرة زر واحدة للمستخدم أن أعود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top