Форма CommonForm (из пространства имен Ultima.Client) является общим предком для всех экранных форм клиентского приложения. В ней реализовано сохранение координат и размеров формы, сохранение и загрузка ее настроек, отображение статуса формы.

Также с помощью свойства формы AutoSetTabOrder можно задать порядок обхода по клавише Tab размещенных на ней элементов управления:

Control_CommonForm

в значении 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.

DevBookmark_Scripts При наследовании от формы 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.