Здравствуйте, Андрей Корявченко, Вы писали:
АК>Статья :
АК>Авторы : АК>Андрей Корявченко
АК>Аннотация : АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
Хочется добавить:
1. Использовать при XML серилизации таки нужно XmlTextReader/XmlTextWriter иначе буду проблеммы с национальными символами.
2. Можно упомянуть как десериализуется тип, если он не найден (массив елементов XmlAttribute и XmlElement)
3. Можно упомянуть о XmlDeserializationEvents (так как это вообще в MSDN не описано)
АК>Авторы : АК>Андрей Корявченко
АК>Аннотация : АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
Спасибо за статью, все работет превосходно. Один вопрос. Я храню в свойстве путь к некоторой папке. Хотелось бы это значение в PropertyGrid ну руками, а с помощью FolderBrowserDialog писать. Как это можно устроить? Благодарю.
Здравствуйте, <Аноним>, Вы писали:
А>Спасибо за статью, все работет превосходно. Один вопрос. Я храню в свойстве путь к некоторой папке. Хотелось бы это значение в PropertyGrid ну руками, а с помощью FolderBrowserDialog писать. Как это можно устроить? Благодарю.
Если скачать исходники януса (http://rsdn.ru/projects/VcsStatus.aspx?project=janus), то там можно увидеть пример (свойство, которое содержит путь к звуковому файлу). Если лень разбираться, то смотреть классы EditorAttribute и UITypeEditor.
P.S. Скачать свежие исходники януса в любом случае стоит, поскольку PropertyGridCustomizer был существенно переделан с тех пор.
А>Спасибо за статью, все работет превосходно. Один вопрос. Я храню в свойстве путь к некоторой папке. Хотелось бы это значение в PropertyGrid ну руками, а с помощью FolderBrowserDialog писать. Как это можно устроить? Благодарю.
[Editor(typeof (FolderEditor), typeof (UITypeEditor))]
public string SomeFolder
{
get { return _someFolder; }
set { _someFolder = value; }
}
private class FolderEditor : FolderNameEditor
{
protected override void InitializeDialog(FolderBrowser fbd)
{
}
}
... << RSDN@Home 1.1.4 beta 7 rev. 457>>
Я бы изменил мир — но Бог не даёт исходников...
Re[3]: Конфигурирование .NET-приложений
От:
Аноним
Дата:
15.06.05 15:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, <Аноним>, Вы писали:
А>>Спасибо за статью, все работет превосходно. Один вопрос. Я храню в свойстве путь к некоторой папке. Хотелось бы это значение в PropertyGrid ну руками, а с помощью FolderBrowserDialog писать. Как это можно устроить? Благодарю.
AVK>Если скачать исходники януса (http://rsdn.ru/projects/VcsStatus.aspx?project=janus), то там можно увидеть пример (свойство, которое содержит путь к звуковому файлу). Если лень разбираться, то смотреть классы EditorAttribute и UITypeEditor.
AVK>P.S. Скачать свежие исходники януса в любом случае стоит, поскольку PropertyGridCustomizer был существенно переделан с тех пор.
Огромное спасибо, буду разбираться дальше.
Re[3]: Конфигурирование .NET-приложений
От:
Аноним
Дата:
15.06.05 17:59
Оценка:
Здравствуйте, Andre, Вы писали:
A>
A> [Editor(typeof (FolderEditor), typeof (UITypeEditor))]
A> public string SomeFolder
A> {
A> get { return _someFolder; }
A> set { _someFolder = value; }
A> }
A> private class FolderEditor : FolderNameEditor
A> {
A> protected override void InitializeDialog(FolderBrowser fbd)
A> {
A> }
A> }
A>
не могу понять. добавил:
using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
пишет:
The type or namespace name 'FolderNameEditor' could not be found (are you missing a using directive or an assembly reference?)
почему он не видит 'FolderNameEditor'? ведь этот класс находится в System.Windows.Forms.Design
А>почему он не видит 'FolderNameEditor'? ведь этот класс находится в System.Windows.Forms.Design
Добавь в проекте референс на System.Design
... << RSDN@Home 1.1.4 beta 7 rev. 0>> :: silent
Я бы изменил мир — но Бог не даёт исходников...
Re[5]: Конфигурирование .NET-приложений
От:
Аноним
Дата:
15.06.05 19:02
Оценка:
Здравствуйте, Andre, Вы писали:
А>>почему он не видит 'FolderNameEditor'? ведь этот класс находится в System.Windows.Forms.Design
A>Добавь в проекте референс на System.Design
АК>Авторы : АК>Андрей Корявченко
АК>Аннотация : АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
Нашли маленькую багу.
Всем, кто бездумно воспользовался кодом статьи, рекомендую почитать здесь
Пожалуйста, ответьте на тупой вопрос. Я прочитал статью несколько раз, но из-за некоторых ошибок в ДНК не могу разобраться самостоятельно. Как вообще правильно использовать этот синглтон-класс? Нельзя ли было в текст статьи добавить еще один короткий листинг?
Вот я добавляю свои атрибуты в тело класса, выше тэга [XmlIgnore], таким образом:
public static string pathToTTLibrary;
Код для инициализации этой переменной-члена я добавил сюда:
catch (Exception e)
{
//Если не удалось десериализовать то просто создаем новый экземпляр
instance = new Config();
pathToTTLibrary = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
}
Дальше я в определенном месте программы пытаюсь этот атрибут считать. Поскольку никаких конструкторов не указано, то у меня Config.pathToTTLibrary является null, независимо от того, вызываю я Config.Reload() перед этим, или нет. Что я должен был сделать, чтобы он не был null? Я не понимаю фразу "Для перезагрузки настроек достаточно обнулить поле instance. При следующем обращении настройки будут заново загружены с диска." Почему? Как именно нужно это "обращение" осуществить, чтобы чтение произошло?
Здравствуйте, Ник, Вы писали: Ник>Вот я добавляю свои атрибуты в тело класса, выше тэга [XmlIgnore], таким образом: Ник>public static string pathToTTLibrary;
Поля твоей конфигурации не должны быть статическими.
В коде можно использовать так:
string path = Config.Instance.pathToTTLibrary;
Ник>Дальше я в определенном месте программы пытаюсь этот атрибут считать. Поскольку никаких конструкторов не указано, то у меня Config.pathToTTLibrary является null, независимо от того, вызываю я Config.Reload() перед этим, или нет. Что я должен был сделать, чтобы он не был null? Я не понимаю фразу "Для перезагрузки настроек достаточно обнулить поле instance. При следующем обращении настройки будут заново загружены с диска." Почему? Как именно нужно это "обращение" осуществить, чтобы чтение произошло?
По моему ты не понял что такое Instance. Данный класс является синглтоном. Свойство Config.Instance при первом вызове создаёт и возвращает объект типа Config. В процессе создания он его десереализует из файла и сохраняет ссылку на него во внутреннем статическом поле instance. При последующих вызовах просто возвращает этот объект (design patern singlton). Таким образом если обнулить поле instance, то при следующем обращении к Config.Instance, объект будет заного создан (считан).
public static Config Instance
{
get
{
lock(lockFlag)
{
if(instance == null)
{
try
{
//Пытаемся загрузить файл с диска и десериализовать егоusing(FileStream fs =
new FileStream(LocalUser.GetDatabasePath()
+ "\\config.xml",FileMode.Open))
{
System.Xml.Serialization.XmlSerializer xs =
new System.Xml.Serialization.XmlSerializer(typeof(Config));
instance = (Config)xs.Deserialize(fs);
}
}
catch(Exception e)
{
//Если не удалось десериализовать то просто создаем новый экземпляр
instance = new Config();
}
}
}
return instance;
}
Здравствуйте, Ed.ward, Вы писали:
EW>У меня такой вопрос, был экземпляр класса сеарилизуемый в config.
EW>В след. версии программы в этом классе добавилась и убралась пара полей. EW>Как пройдет десериализация?
EW>Рухнет или новые поля просто инициируются значениями по умолчанию?
Если просто удалились/добавились, то да. Проблемы будут только с удалением/переименованием элементов enum и в смене типа свойст.
Здравствуйте, Ed.ward, Вы писали:
EW>Привет всем
EW>У меня такой вопрос, был экземпляр класса сеарилизуемый в config.
EW>В след. версии программы в этом классе добавилась и убралась пара полей. EW>Как пройдет десериализация?
EW>Рухнет или новые поля просто инициируются значениями по умолчанию?
Отсутствующие поля останутся инициализированы значениями по умолчанию.
Неизвестные ноды вызовут ошибку. Чтобы ее не было, можно в новой версии класса добавить специального мембера:
[XmlAnyElenent]
[Obsolete("Never access this member directly", true)]
public XmlElement[] Deprecated
{
get { return null;}
set { }
}
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.