Форма CommonForm (из пространства имен Ultima.Client) является общим предком для всех экранных форм клиентского приложения. В ней реализовано сохранение координат и размеров формы, сохранение и загрузка ее настроек, отображение статуса формы. Также с помощью свойства формы AutoSetTabOrder можно задать порядок обхода по клавише Tab размещенных на ней элементов управления: |
•в значении true (используется по умолчанию) порядок обхода будет задаваться автоматически (сверху-вниз, слева-направо);
•в значении false будет использован порядок обхода, заданный прикладным разработчиком.
Базовый функционал CommonForm также включает свойство ReadOnly. Режим только для чтения автоматически включается во время выполнения фоновых операций: DisplayFormStatus(Strings.Loading) или BaseEditForm.SaveAndLoadRecord.
Установка флага ReadOnly = true приводит к рекурсивному обходу дерева элементов формы. Сброс флага ReadOnly = false возвращает все в исходное состояние (при этом если элемент управления изначально был в режиме ReadOnly, он не будет неожиданно разблокирован).
Поскольку в элементах WinForms нет стандартного свойства ReadOnly, подобного флагу Enabled, поддержка режима реализована с помощью набора классов-адаптеров. Базовый набор поддерживает наиболее распространенные элементы управления: TextEdit, MemoEdit, UltimaTextEdit, CheckEdit, RadioGroup, GridControl, всевозможные элементы-контейнеры.
Чтобы добавить поддержку нового элемента управления, достаточно описать в прикладном клиентском модуле класс-адаптер, поддерживающий этот элемент:
using System; using System.Windows.Forms; using DevExpress.XtraEditors;
namespace Ultima.Client.Controls.ReadOnly { [PartCreationPolicy(CreationPolicy.NonShared)] internal class ReadOnlyAdapterCheckEdit : ReadOnlyAdapterBase { public override bool Supports(Control control) { return control is CheckEdit; }
public override bool IsReadOnly(Control control) { return (control as CheckEdit).Properties.ReadOnly; }
protected override void SetReadOnly(Control control, bool readOnly) { (control as CheckEdit).Properties.ReadOnly = readOnly; } } } |
Адаптер будет автоматически распознан каталогами MEF и использован при необходимости. Для этого достаточно, чтобы класс был унаследован от ReadOnlyAdapterBase, либо явным образом экспортировал реализацию интерфейса IReadOnlyAdapter. Кроме того, для класса должна быть задана политика создания NonShared.
При наследовании от формы CommonForm прикладному разработчику могут оказаться полезны следующие методы и свойства ее класса:
•ShowChildAsync() – асинхронный вариант метода ShowChild. Показывает форму как MDI-потомок главной формы и дожидается загрузки ее настроек;
•AfterLoadSettings – событие, которое происходит после загрузки настроек формы;
•AfterSaveSettings – событие, которое происходит после сохранения настроек формы;
•ResetSettings – событие, которое происходит после сброса настроек формы.
Также можно переопределить следующие методы и свойства класса формы CommonForm:
•ShowChild() – показывает форму как MDI-потомок главной формы;
•OnLoadAsync(EventArgs args) – асинхронный вариант метода OnLoad. Если в прикладном коде при загрузке формы необходимо сделать какие-либо серверные вызовы, например, загрузить запись или прочитать константу, их следует делать в этом методе;
•FormSettingsKey типа string – возвращает ключ, по которому будут сохраняться настройки формы. Обычно это просто имя класса, но может содержать и какие-то дополнительные символы;
•DisplayFormStatus(string text) – показывает панель с указанным сообщением (например, "Загрузка..."):
▪text – текст сообщения;
•ClearSettingsBeforeSaving типа bool – возвращает true, если перед сохранением настроек формы необходимо эту коллекцию очистить;
•RestoreWindowBounds типа bool – возвращает true, если форма должна восстанавливать размеры окна;
•SaveSettings() – сохраняет настройки формы в коллекцию FormSettings;
•LoadSettings() – загружает настройки формы из коллекции FormSettings.