Re: .Net – классы, компоненты и контролы
От: Ракот  
Дата: 08.07.05 13:49
Оценка:
Здравствуйте, Владислав Чистяков, Вы писали:

А продолжение будет? В .NET 2.0 появились Smart Tags (http://msdn.microsoft.com/msdnmag/issues/05/07/DesignerActions/default.aspx), можно было бы что-нибудь написать про них
Re[2]: .Net – классы, компоненты и контролы
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.05 18:25
Оценка:
Здравствуйте, Ракот, Вы писали:

Р>Здравствуйте, Владислав Чистяков, Вы писали:


Р>А продолжение будет? В .NET 2.0 появились Smart Tags (http://msdn.microsoft.com/msdnmag/issues/05/07/DesignerActions/default.aspx), можно было бы что-нибудь написать про них


Дык написал бы.

Если серьезно, то со временем сейчас плохо. Может быть ближе к выходу студии...
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: .Net – классы, компоненты и контролы
От: Jenyay http://jenyay.net
Дата: 11.07.05 09:35
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Если серьезно, то со временем сейчас плохо. Может быть ближе к выходу студии...


А там не слышно когда это будет? И будет ли еще 3-я бета?
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Софт, исходники и фото
Re[4]: .Net – классы, компоненты и контролы
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.07.05 21:02
Оценка:
Здравствуйте, Jenyay, Вы писали:

J>А там не слышно когда это будет? И будет ли еще 3-я бета?


Приходи на следующую .Net UG и сможешь задать этот вопрос лично. Я чесно говря как-то не задавался этим вопросом. До нового года выйдет и ладно. Оно уже сейчас вполне приемлемо. Мне ведь релизов не выпускать.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: .Net – классы, компоненты и контролы
От: Аноним  
Дата: 07.03.07 10:23
Оценка:
Здравствуйте, Владислав Чистяков, Вы писали:

ВЧ>Статья:

ВЧ>.Net – классы, компоненты и контролы
Автор(ы): Владислав Чистяков
Дата: 09.05.2003
Создание ПО из компонентов подразумевает, что компоненты будут добавляться к проекту во время разработки. При этом будет производиться их начальная настройка. Компоненты как таковые не подразумевают (вернее сказать, не обязаны иметь) пользовательского интерфейса (ни для программиста, ни для конечного пользователя). В этом качестве выступают части IDE и дополнительные программные дизайнеры. Первой компонентной средой был продукт, купленный Microsoft на заре своего существования. Впоследствии на его базе родился VB. Далее была Delphi… в общем, к концу двадцатого века компоненты стали поддерживаться почти везде (даже в Visual C++, хотя он и по сей день не очень-то визуальный).


ВЧ>Авторы:

ВЧ> Владислав Чистяков

ВЧ>Аннотация:

ВЧ>Создание ПО из компонентов подразумевает, что компоненты будут добавляться к проекту во время разработки. При этом будет производиться их начальная настройка. Компоненты как таковые не подразумевают (вернее сказать, не обязаны иметь) пользовательского интерфейса (ни для программиста, ни для конечного пользователя). В этом качестве выступают части IDE и дополнительные программные дизайнеры. Первой компонентной средой был продукт, купленный Microsoft на заре своего существования. Впоследствии на его базе родился VB. Далее была Delphi… в общем, к концу двадцатого века компоненты стали поддерживаться почти везде (даже в Visual C++, хотя он и по сей день не очень-то визуальный).

"ComVisible(true)]
bool DesignMode {get;}



DesignMode – говорит, находится ли компонент в режиме разработки, то есть, загружен компонент в дизайнере типа VS.NET, или что компонент создан кодом приложения. В принципе, совершенно бесполезное свойство, так как когда компонент находится в рантайме, ему попросту не подключают site. А стало быть, проверить данное свойство совершенно невозможно."

Неверно. Проверять можно в

Protected Overrides Sub OnLayout(ByVal levent As System.Windows.Forms.LayoutEventArgs)

Отлично работает!
Re: .Net – классы, компоненты и контролы
От: Аноним  
Дата: 12.05.09 20:49
Оценка:
Интересно, жива ли тема?

После включения для контрола (UserControl) дизайнера контрол "упал" вниз. Т.е. на форме он отображается, и при запуске приложения с ним можно работать. Но выделить его на форме не могу (например, чтобы поменять положение и/или размер). Он "падает" в нижний контейнер, где обычно лежат OpenFileDialog и т.д. И тут я уже могу с ним работать (смотреть/менять свойства и тд.).

Дизайнер почти полностью взят из статьи. Он замещает реальное свойство типа Type на виртуальное типа String. Также к виртуальному свойству прикручивается рукописный Editor.

Как можно это поправить?
Re[2]: .Net – классы, компоненты и контролы
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.05.09 20:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как можно это поправить?


Скорее всего был заменен базовый класс. А вообще надо смотреть код.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: .Net – классы, компоненты и контролы
От: notacat  
Дата: 12.05.09 20:56
Оценка: +1
А>Дизайнер почти полностью взят из статьи.
Там он унаследован от ComponentDesigner, поменяйте базовый класс на ControlDesigner
Re[2]: .Net – классы, компоненты и контролы
От: Аноним  
Дата: 13.05.09 05:25
Оценка:
Отлично. Спасибо, господа.
Re[3]: .Net – классы, компоненты и контролы
От: Аноним  
Дата: 14.05.09 06:44
Оценка:
Господа, снова нужна помощь. Сделал так, как понял, но не все работает.

Как я писал выше, имеется юзер контрол.
В нем есть свойство:
public Type BindForm
        {
            get
            {
                return bFormValue;
            }
            set
            {
                try
                {
                    if (value.BaseType != typeof(Form) && value != typeof(Form))
                    {
                        throw new InvalidCastException("Должна быть форма.");
                    }
                    bFormValue = value;
                }
                catch (InvalidCastException ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }


Хочу редактировать это свойство особым образом. Смысл в том, чтобы разработчик выбирал, какую форму он хочет открыть (при нажатии кнопки на контроле).

Для этого "подменяю" реальное свойство виртуальным типа string:

        protected override void PreFilterProperties(
          System.Collections.IDictionary properties)
        {
            base.PreFilterProperties(properties);
            //const string sPropName = "Тестовое свойство";
            const string sPropName = "BindForm";
            // Добавляем виртуальное свойство, доступное только во время разработки.
            properties[sPropName] = new BindFormPropertyDescriptor(this,
              TypeDescriptor.CreateProperty(
                Component.GetType(),
                sPropName,
                typeof(String),
                new Attribute[] 
                    {
                      // Задаем категорию, в которой будет отображаться новое свойство.
                      CategoryAttribute.Data
                      // Говорим VS.NET, что при изменении этого свойства нужно 
                      // перечитать значение остальных свойств.
                      , RefreshPropertiesAttribute.All
                      //Назначим свой редактор для свойства
                      , new EditorAttribute(typeof(BindFormEditor), typeof(System.Drawing.Design.UITypeEditor))
                    }));
        }


Далее, реализую Editor для установки значения для этого виртуального свойства. Код приводить не будет, он большой.

Короче, до этого момента все работает замечательно.

Теперь хочу сделанные изменения сеарилизовать в код, чтобы он (она — Студия) записывал значение реального поля в Designer.cs

Для этого реализовал TypeConverter, чтобы строку переводить в нужный тип. Пример взят частично из MSDN, частично отсюда.

    public class FromTypeConverter : TypeConverter
    {
        // Overrides the CanConvertFrom method of TypeConverter.
        // The ITypeDescriptorContext interface provides the context for the
        // conversion. Typically, this interface is used at design time to 
        // provide information about the design-time container.
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            MessageBox.Show("FromTypeConverter.CanConvertFrom");
            if (sourceType == typeof(string))
            {
                return true;
            }
            return base.CanConvertFrom(context, sourceType);
        }
        // Overrides the ConvertFrom method of TypeConverter.
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            try
            {
                MessageBox.Show("FromTypeConverter.ConvertFrom");
                if (value is string)
                {
                    //string[] v = ((string)value).Split(new char[] { ',' });
                    //return new Point(int.Parse(v[0]), int.Parse(v[1]));
                    if (value.ToString() == "")
                    {
                        return null;
                    }
                    else
                    {
                        return Type.GetType(value.ToString());
                    }
                }
                return base.ConvertFrom(context, culture, value);
            }
            catch (System.IO.FileNotFoundException ex)
            {
                MessageBox.Show(ex.Message);
                return base.ConvertFrom(context, culture, value);
            }
        }
        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            MessageBox.Show("FromTypeConverter.CanConvertTo");
            if (destinationType == typeof(InstanceDescriptor))
                return true;
            // Всегда вызываем базовый класс если не можем 
            // совершить преобразование сами.
            return base.CanConvertTo(context, destinationType);
        }
        // Overrides the ConvertTo method of TypeConverter.
        public override object ConvertTo(ITypeDescriptorContext context,
           CultureInfo culture, object value, Type destinationType)
        {
            MessageBox.Show("FromTypeConverter.ConvertTo");
            if (destinationType == typeof(string))
            {
                //return ((Point)value).X + "," + ((Point)value).Y;
                return ((Type)value).AssemblyQualifiedName;
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }


Ну и теперь включаю непосредственно сериализацию (или думаю, что включаю):

    [TypeConverter(typeof(FromTypeConverter))] //Вот тут
    [Designer(typeof(BindFormComponentDesigner)), DesignerCategory("Default")] //А это дизайнер для виртуального создания свойства
    public partial class UserControl1 : UserControl


Так вот ничего не происходит. Полученное значение не записывает в исходный код. В самом поле я его вижу, могу даже поменять и т.д. А как его в исходник загнать?

Что я делаю не так?

Спасибо.
Re[4]: .Net – классы, компоненты и контролы
От: VIPrules  
Дата: 15.05.09 08:42
Оценка:
А>Так вот ничего не происходит. Полученное значение не записывает в исходный код. В самом поле я его вижу, могу даже поменять и т.д. А как его в исходник загнать?

А>Что я делаю не так?


А>Спасибо.


Народ, разобрался.
Мож кому понадобится.

Был неправильно реализован Conveter

Вместо:

        // Overrides the ConvertTo method of TypeConverter.
        public override object ConvertTo(ITypeDescriptorContext context,
           CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                //Если тип назначения  - строка, то вернем полное имя сборки
                return ((Type)value).AssemblyQualifiedName;
            }
            //Все другие типы пусть конвертирует базовый класс
            return base.ConvertTo(context, culture, value, destinationType);
        }


Нужно было просто написать:

        public override object ConvertTo(ITypeDescriptorContext context,
           CultureInfo culture, object value, Type destinationType)
        {
            //Вернем значение поля, к. редактируем
            return ((UserControl1)value).BindForm;
        }


Т.е. не нужно было передавать право преобразования в базовый класс. А просто вернуть значение свойства.

Так же полностью отказался от использования виртуальных свойств. Дизайнером для класса назначил стандартный. Вот полный заголовок:

    //Теперь первый аттрибут можно и не указывать
    //[Designer(typeof(/*BindFormComponentDesigner*/ControlDesigner)), DesignerCategory("Default")]
    [TypeConverter(typeof(FormTypeConverter))]
    [Serializable]
    public partial class UserControl1 : UserControl
    {...}


А Editor использовал для свойства напрямую:
 [Editor(typeof(BindFormEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public Type BindForm
        { get; set; }


В результате пропала возможность править значение прямо в поле свойства. Но это даже и к лучшему (защита от дурака). А саму строку для извлечения типа формирую в самописной форме, к. вызывается при нажатии кнопки с троеточием.

После этих манипуляций все получилось.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.