Своя форма настроек + классы в пространстве проекта

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Нехватает возможности создавать свою форму настроек для проекта, и возможность создавать свои классы в пространстве имен проекта с временем жизни project т.к.:
1. для больших проектов, в стандартной форме получается неудобоваримая простыня, без возможности расставить нормально, контролы табы хоть частично помогают но не сильно.
2. Частичный перенос настроек из проекта в проект занятие очень "увлекательное", там скопировал туда вставил, и так по каждому контролу, по каждому параметру.
3. Все настройки пишутся в переменные, затем их из строкового состояния надо переводить в нужный тип, чтобы не делать постоянно конвертацию, можно использовать project.context, но его использование имеет свои сильные ограничения, например dynamic не работает с enum, а если присваивать ему свой класс, то получаем проблемы в отладке, т.к.при малейшей правке кода, клас надо пересоздавать.

Я вижу это так, делается вкладка наподобии общий код с интерфейсами: вызов формы настроек, сериализация(сохранение) и десереализация(чтение) настроек.

Как-то так:
C#:
public class Settings : IZennoSettings
{
    public class MySettingsClass
    {
        public string Path { get; set; }
        public int Count { get; set; }
        // и т.п.   
    }

    private void OpenSettingsForm(IZennoPosterProjectModel project)
    {

        // Загружаем настройки
        LoadSettings();
        // Строим свою форму
        // Сохраняем настройки
        if (formOk)
            SaveSettings();
    }

    // Сохраняем настройки в xml
    private void SaveSettings(IZennoPosterProjectModel project)
    {
        project.Settings.setXml(MySettingsClass.ToXml());
    }

    // Считываем настройки  xml
    private void LoadSettings(IZennoPosterProjectModel project)
    {
        MySettingsClass.FromXML(project.Settings.getXml());
    }
}

Итого у меня получается полная гибкость в управлении настройками:
1. Я могу создать любую форму настроек, сделать ее более удобной и информативной.
2. Перенос настроек выполняется в пару копипастов.
3. Я могу писать настройки как в project.Variables так и создать свой класс(ы) и держать настройки в них, и уйти от вечного конвертирования типов туда сюда.
4. Появится возможность создавать динамическиее классы которые будут нормально жить и в pojectMaker.
4. Упростится обращение к настройкам, появится возможность их группировать,
C#:
MySettings.Posts.Min
намного удобнее использовать чем
C#:
Convert.ToInt32(Toproject.Variables["MinPosts"].Value)
 
Последнее редактирование:

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
Если речь про входные настройки, то будет html версия настроек.
Собственно других входных не предполагается.

Свой класс с настройками можно и сейчас сделать
первым действием создаем экземпляр класса, который принимает проект и выпарсивает из переменных все, что ему нужно, конвертирует типы и т.д.
потом кладем его в project.Context
потом когда надо берем
таскать по сути надо только общий код и все.
в общий код же никто не запрещает писать нестатические методы и классы.
 
  • Спасибо
Реакции: Skrim

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Если речь про входные настройки, то будет html версия настроек.
Собственно других входных не предполагается.

Свой класс с настройками можно и сейчас сделать
первым действием создаем экземпляр класса, который принимает проект и выпарсивает из переменных все, что ему нужно, конвертирует типы и т.д.
потом кладем его в project.Context
потом когда надо берем
таскать по сути надо только общий код и все.
в общий код же никто не запрещает писать нестатические методы и классы.
C project.Context есть проблемы в PM, при любой правке кубиков, созданный и присвоеный ему класс слетает,вылетаем по ошибке.
Например кубик 1
Код:
var obj = new ZennoLab.OwnCode.MyClass();
project.Context["tst"] = obj;
Выполняем, создаем кубик 2
Код:
var s = project.Context["tst"] as ZennoLab.OwnCode.MyClass;
return s.var1;
Получаем ошибку: Ссылка на объект не указывает на экземпляр объекта.

Можно, обратиться к значениям полей без приведения к назад к типу, например
Код:
var s = project.Context["tst"];
return s.var1;
Но это работает только со простыми типами данных, string, bool и т.п., а вот если у меня есть Enum, то он для меня потерян.

Если решить эту проблему, то тоже вполне подходящий вариант будет.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
поняли в чем затык, попробуем исправить
но тут надо немного архитектуру будет поменять, если получится, то сделаем.
 
  • Спасибо
Реакции: Adigen

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)