Аннотация :
Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
Здравствуйте, Андрей Корявченко, Вы писали:
АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
А почему не использовались уже сушествующие механизмы конфигурации ?
Здравствуйте, Mikhail_T, Вы писали:
M_T>Здравствуйте, Андрей Корявченко, Вы писали:
АК>>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
M_T>А почему не использовались уже сушествующие механизмы конфигурации ?
Здравствуйте, Андрей Корявченко, Вы писали: АК>Конфигурирование .NET-приложений АК>Аннотация : АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
Классная статья.
Но есть несколько мелких шероховатостей
Почему бы вместо Singleton не использовать Double-Checked Locking
и не сделать все методы в классе Config статическими.
Ну и в
public static Config GetClone()
{
return (Config)instance.MemberwiseClone();
}
заменить instance на Instance?
Побольше таких статей.
Ну а может "задача работы в многопоточном режиме" сначала рассматривалась, а потом перестала рассматриваться, чтобы не "загромождать код ненужными наворотами"? Статья — бомба, идея — супер! Где тут можно получить распечатанную копию с автографом автора? Шутки-шутками, а статья — действительно очень нужная и полезная, побольше бы таких.
Здравствуйте, Андрей Корявченко, Вы писали:
АК>Статья :
АК>Авторы : АК>Андрей Корявченко
АК>Аннотация : АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
вот захотелось мне передать эти настройки в PropertyGrid через Remoting.
и вываливается exception, дескать, AttributeCollection is not marked as serializable (это при реализации ICustomTypeDescriptor, т.к. без него вообще не захотело).
Здравствуйте, фонарь, Вы писали:
Ф>вот захотелось мне передать эти настройки в PropertyGrid через Remoting. Ф>и вываливается exception, дескать, AttributeCollection is not marked as serializable (это при реализации ICustomTypeDescriptor, т.к. без него вообще не захотело).
Ну наверное можно отнаследоваться от AttributeCollection и таки пометить ее как serializable. Но вобще то идея передавать я так понимаю по ссылке не очень хорошая. Лучше передавать сам конфиг по значению и все обертки делать уже на клиентской стороне.
Здравствуйте, AndrewVK, Вы писали:
AVK>Ну наверное можно отнаследоваться от AttributeCollection и таки пометить ее как serializable.
//да, я собственно так и делал
[Serializable]
public class MyAttrCollection : AttributeCollection
{
public MyAttrCollection() : base(null) {}
}
//а потом в реализации ICustomTypeDescriptor
AttributeCollection ICustomTypeDescriptor.GetAttributes()
{
return new MyAttrCollection();
}
оно все равно ругается, что not marked as serializable.
AVK>Но вобще то идея передавать я так понимаю по ссылке не очень хорошая. Лучше передавать сам конфиг по значению и все обертки делать уже на клиентской стороне.
Здравствуйте, Yuri, Вы писали:
Y>Вопрос: почему в свойстве IsReadOnly класса MyPropDesc возвращается false? По-моему правильнее было бы воазвращать _PropDesc.IsReadOnly.
Ну для конкретного проекта это не критично, а так вобще конечно ты прав.
Извините, туплю, а хочется побыстрее (в тч оттупиться).
Не работает, что-то подстановка имен в классе конфигурации со вложенными классами для свойств вложенных классов.
public class config
protected mobjA As new AClass
protected mobjB As new BClass
protected mstrDescription as New String
' работает
Public Property Description As string
' работает
Public Readonly Property A As AClass
....
end class
Public Class AClass
protected mstrName as new string
' не работает
Public Property Name As String
...
end class
Здравствуйте, olegbs, Вы писали:
O>Извините, туплю, а хочется побыстрее (в тч оттупиться). O>Не работает, что-то подстановка имен в классе конфигурации со вложенными классами для свойств вложенных классов.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, olegbs, Вы писали:
O>>Извините, туплю, а хочется побыстрее (в тч оттупиться). O>>Не работает, что-то подстановка имен в классе конфигурации со вложенными классами для свойств вложенных классов.
AVK>Что значит вложенных?
Я попробовал в сообщении это раскрыть, но видно, действительно, туплю :<
А имел я ввиду, что класс Config имеет в своем составе члена, который сам является классом и у него имеются свойства (вот для этих свойств хотелось бы увидеть русские названия)
Примерный текст класса ниже. Могу на С#, но только завтра набью, чтобы не было синтаксических ошибок.
public class Config
protected mobjA As new AClass
protected mstrDescription as New String' работаетPublic Property Description() As String
Get
Return mstrDescription
End Get
Set(ByVal Value As String)
mstrDescription = Value
End Set
End Property' работаетPublic Readonly Property A As AClass
Get
Return mobjA
End Get
End Property
end class
Public Class AClass
protected mstrName as new string' не работаетPublic Property Name As String
Get
Return mstrName
End Get
Set(ByVal Value As String)
mstrName = Value
End Set
End Property
...
end class
Здравствуйте, olegbs, Вы писали:
O>А имел я ввиду, что класс Config имеет в своем составе члена, который сам является классом и у него имеются свойства (вот для этих свойств хотелось бы увидеть русские названия)
А как ты их в гриде сможешь увидеть, он тебе для класса просто его имя выведет?
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, olegbs, Вы писали:
O>>А имел я ввиду, что класс Config имеет в своем составе члена, который сам является классом и у него имеются свойства (вот для этих свойств хотелось бы увидеть русские названия)
AVK>А как ты их в гриде сможешь увидеть, он тебе для класса просто его имя выведет?
<TypeConverter(GetType(MyStatusConverter))> _
Public Class AClass
...
End Class
Здравствуйте, olegbs, Вы писали:
AVK>>А как ты их в гриде сможешь увидеть, он тебе для класса просто его имя выведет?
O><TypeConverter(GetType(MyStatusConverter))> _ O>Public Class AClass O>... O>End Class
Не, ну что из тебя все клещами вытягивать приходится? В конвертере видимо реализован GetProperties? Тогда все понятно. Та версия что в журнале очень старая уже, в дальнейшем этот класс был сильно переработан. Свежая версия отрабатывает DisplayName и в таких случаях, и в enum и еще много чего интересного умеет. Брать как обычно, в CVS януса. Можно еще попробовать дернуть через subversion, адрес репозитория svn://rsdn.ru/Janus.
Спасибо, Андрей !
Моя тупость окончилась. А клещами тащить не надо, не хотел загружать форум тривиальными вещами ))
Задача разовая, поэтому не стал оборачивать класс, а сделал наследование от обертки, как для класса конфигурации, так и для вложенных. Часа два делал, потому что сам дурак, делал изменения, а в propertygrid показывал инстанцию первоначального класса.
Бывает
Удачи