Re[8]: Компонент в дизайне?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.05.04 13:00
Оценка: +1
Здравствуйте, Mr.Gremlin, Вы писали:

MG>Чтобы в PropertyGrid можно было подсунуть свой ServiceProvider, достаточно переопределить метод GetService у PropertyGrid.


Component.GetService:
protected virtual object GetService(Type service)
{
    ISite site1 = this.site;
    if (site1 != null)
    {
        return site1.GetService(service);
    }
    return null;
}


Так что никакой разницы, но имхо с Site более правильно.

P.S. — никаких глюков не обнаружено, все сервисы нормально гридом зовутся, даже те что в студии не используются.
... << RSDN@Home 1.1.4 beta 1 >>
AVK Blog
Re[9]: Компонент в дизайне?
От: Mr.Gremlin Украина  
Дата: 27.05.04 13:26
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Mr.Gremlin, Вы писали:


MG>>Чтобы в PropertyGrid можно было подсунуть свой ServiceProvider, достаточно переопределить метод GetService у PropertyGrid.


AVK>Component.GetService:

AVK>
AVK>protected virtual object GetService(Type service)
AVK>{
AVK>    ISite site1 = this.site;
AVK>    if (site1 != null)
AVK>    {
AVK>        return site1.GetService(service);
AVK>    }
AVK>    return null;
AVK>}
AVK>


AVK>Так что никакой разницы, но имхо с Site более правильно.


AVK>P.S. — никаких глюков не обнаружено, все сервисы нормально гридом зовутся, даже те что в студии не используются.


Прогнал, думал сайт у компонента, который броузится PropertyGrid-ом, подменять. А так это действительно тот-же результат. Но в случае если есть уже нормальный сайт, то с подменной возможны трудности. Хотя если есть сайт, то что-то подменять смысла нет. Вообщем трудно сказать что более правильно, я выбрал такой способ, кто-то другой, думаю еще есть варианты. Но имхо мой вариант более жизнеспособный .
Re[5]: Компонент в дизайне?
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.05.04 21:34
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Отлично! Может у тебя есть другой рецепт выяснения, находится ли форма в design-time?

iT>Или может "если это нужно знать, значит, ошибка в дизайне"?

Опиши проблему — найдем решение или укажем на ошибку.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Компонент в дизайне?
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.05.04 21:34
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>И что там написать


Зависит от задачи.

Еще раз говорю. Описывай задачу.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Компонент в дизайне?
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.05.04 21:34
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Help я прочитал, но так и не понял как его реализовать..

А>Вы не мудрите, вы пальцем покажите...
А>Обьясние если можно на пальцах и с маленьким примером.

Нда. Может проше книгу каку по языку прочесть или стандарт?

В краце: береш компонент в котором нужно делать пост-инициализационные действия. Встаешь в его список реализуемых интерфейсов... Пишеш "ISupportInitialize" и нажимаешь TAB. Студия докинывает пустышки метдов.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Компонент в дизайне?
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.05.04 23:19
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Чтобы в PropertyGrid можно было подсунуть в рантайме свой ServiceProvider. Сайт притом не самопальный, а вполне себе родной, фреймворковский.


PropertyGrid — это уже дизайнер.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Компонент в дизайне?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.05.04 06:27
Оценка:
Здравствуйте, VladD2, Вы писали:

AVK>>Чтобы в PropertyGrid можно было подсунуть в рантайме свой ServiceProvider. Сайт притом не самопальный, а вполне себе родной, фреймворковский.


VD>PropertyGrid — это уже дизайнер.


Ну это как сказать.
... << RSDN@Home 1.1.3 beta 2 (Win32NT 5.1.2600.0) >>
AVK Blog
Re[4]: Компонент в дизайне?
От: orangy Россия
Дата: 28.05.04 14:34
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>IDesignerHost вполне может обнаружится и в рантайме.

А это не означает, что компонент всё-таки в дизайне, несмотря на то, что система в рантайме?
... << RSDN@Home 1.1.4 beta 1 >>
"Develop with pleasure!"
Re[5]: Компонент в дизайне?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.05.04 15:21
Оценка:
Здравствуйте, orangy, Вы писали:

AVK>>IDesignerHost вполне может обнаружится и в рантайме.

O>А это не означает, что компонент всё-таки в дизайне, несмотря на то, что система в рантайме?

Не обязательно. Тут вопрос встает зачем вобще понадобилось обосабливать дизайнтайм.
... << RSDN@Home 1.1.3 beta 2 (Win32NT 5.1.2600.0) >>
AVK Blog
Re[6]: Компонент в дизайне?
От: orangy Россия
Дата: 28.05.04 15:34
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>>>IDesignerHost вполне может обнаружится и в рантайме.

O>>А это не означает, что компонент всё-таки в дизайне, несмотря на то, что система в рантайме?

AVK>Не обязательно. Тут вопрос встает зачем вобще понадобилось обосабливать дизайнтайм.

Бывает нужно. Теоретически можно всё решить кастомными дизайнерами, но ради того, чтобы несколько поиному отрисоваться городить дизайнер не хочется. У меня, например, LayoutPanel в дизайне подсвечивает зоны, чтобы видно было раскладку.
... << RSDN@Home 1.1.4 beta 1 >>
"Develop with pleasure!"
Re[7]: Компонент в дизайне?
От: Igor Trofimov  
Дата: 28.05.04 18:27
Оценка:
VD>Еще раз говорю. Описывай задачу.

Задача все та же — точно определить, находится ли форма в DesignTime или в RunTime. Из любого метода/конструктора. Предположим, что в самой проге (RunTime) — никаких дизайнерских штучек нет. То есть речь идет о вариантах VisualStudio / Application
Re[6]: Компонент в дизайне?
От: Igor Trofimov  
Дата: 28.05.04 18:29
Оценка:
VD>Опиши проблему — найдем решение или укажем на ошибку.

Повторяю.
Задача все та же — точно определить, находится ли форма в DesignTime или в RunTime. Из любого метода/конструктора. Предположим, что в самой проге (RunTime) — никаких дизайнерских штучек нет. То есть речь идет о вариантах VisualStudio / Application

Повторяю. Проверка свойства ISite на null — недостаточна. Как я написал выше, там может быть null и когда форма создается в дизайнере студии, поскольку дизайнер студии устанавливает это свойство довольно поздно (впрочем, он и не может раньше).
Re[7]: Компонент в дизайне?
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.04 18:48
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Задача все та же — точно определить, находится ли форма в DesignTime или в RunTime. Из любого метода/конструктора.


Так не надо делать в конструкторе вещи которые там делать не надо. Сайт назначается после создания объекта, т.п. после того как конструктор уже отработал. Процес же конструирования еще идет. Перенеси нужный тебе код в место где сайт уже точно есть.

iT>Предположим, что в самой проге (RunTime) — никаких дизайнерских штучек нет. То есть речь идет о вариантах VisualStudio / Application


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

iT>Повторяю. Проверка свойства ISite на null — недостаточна. Как я написал выше, там может быть null и когда форма создается в дизайнере студии, поскольку дизайнер студии устанавливает это свойство довольно поздно (впрочем, он и не может раньше).


Почему поздно? Очень даже вовремя. Просто ты строишь дизайн своего кода неверно. Только и всего. У МС тонна контролов и ни одих не занимается подобной еруной.

ЗЫ

Ты не высасывай пробему из пальца. Ты лучше опиши случай в котором ты не видишь иного выхода.
... << RSDN@Home 1.1.4 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Компонент в дизайне?
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.04 18:48
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

VD>>Еще раз говорю. Описывай задачу.


iT>Задача все та же — точно определить, находится ли форма в DesignTime или в RunTime. Из любого метода/конструктора. Предположим, что в самой проге (RunTime) — никаких дизайнерских штучек нет. То есть речь идет о вариантах VisualStudio / Application


Это не задача. Это уже ее решение. У тебя вообще паталогическое стремление решать задачи одним, зачастую неверным, способом.

Опиши конкретный пример.
... << RSDN@Home 1.1.4 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Компонент в дизайне?
От: Igor Trofimov  
Дата: 28.05.04 19:10
Оценка:
VD>Это не задача. Это уже ее решение. У тебя вообще паталогическое стремление решать задачи одним, зачастую неверным, способом.

Какое же это решение? А.. ну я так и знал, определять DesignTime/Runtime — порочная практика

Ну ладно, придумаю более конкретно — форма должна загружать свой размер из некоторого хранилища настроек. Но только в RunTime (думаю, это достаточно очевидно).
Re[8]: Компонент в дизайне?
От: Igor Trofimov  
Дата: 28.05.04 19:14
Оценка:
VD>Так не надо делать в конструкторе вещи которые там делать не надо. Сайт назначается после создания объекта, т.п. после того как конструктор уже отработал. Процес же конструирования еще идет. Перенеси нужный тебе код в место где сайт уже точно есть.

А вот тут начинается совсем интересно. Потому чито последовательность вызова всех стандартных событий — OnLoad, BeginInit/EndInit, вызовов конструкторов и назначения ISite и проч. — достаточно неопределенная вещь.
По крайней мере в развитой иерархии наследования форм/контролов. И такого места как "конструирование закончено" — еще поискать надо.

VD>Почему поздно? Очень даже вовремя. Просто ты строишь дизайн своего кода неверно. Только и всего. У МС тонна контролов и ни одих не занимается подобной еруной.


Да, да, конено Если проблема не решается в текущей версии — значит, у вас проблема в дизайне. Плавали, знаем. Generic'ов уже дождались, поглядим, что будет дальше.
Re[9]: Компонент в дизайне?
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.04 20:07
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>А вот тут начинается совсем интересно. Потому чито последовательность вызова всех стандартных событий — OnLoad, BeginInit/EndInit, вызовов конструкторов и назначения ISite и проч. — достаточно неопределенная вещь.

iT>По крайней мере в развитой иерархии наследования форм/контролов. И такого места как "конструирование закончено" — еще поискать надо.

Все четко определено. Последовательность следущая:
Вариант 1. Контрол появляется в первый раз:
1. Создается класс (вызывается его конструтор).
2. Назначается сайт.
Варинт 2. Класс загружается дизайнером из состояния сериализованного в код:
1. Создается класс (вызывается его конструтор).
2. Назначается сайт.
3. Вызывается BeginInit.
4. Вызывается EndInit.

VD>>Почему поздно? Очень даже вовремя. Просто ты строишь дизайн своего кода неверно. Только и всего. У МС тонна контролов и ни одих не занимается подобной еруной.


iT>Да, да, конено Если проблема не решается в текущей версии — значит, у вас проблема в дизайне. Плавали, знаем. Generic'ов уже дождались, поглядим, что будет дальше.


Причем тут дженерики?

Возможно. Что-то в данном случае не очевидно. И что-то можно было бы сделать лучше (в самой компонентной модели), но какое это имеет отношение к откровенному и ненужному хаку?

Или в отсуствии дженериков ты внутри кода занимаешся его декомпиляцией чтобы работать с элементами кллекций? (если уж прбегать к аналогиям)
... << RSDN@Home 1.1.4 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Компонент в дизайне?
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.04 20:07
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>Ну ладно, придумаю более конкретно — форма должна загружать свой размер из некоторого хранилища настроек. Но только в RunTime (думаю, это достаточно очевидно).


О, блин! И из-за этой фигни надо было стэк-фрэйм изучить? Я фигею, дарагая редакция...

Добавь вот этот код в форму и полючуйся на результат:
        protected override void OnCreateControl()
        {
            base.OnCreateControl ();

            ISite site = Site;
            if (site == null || !site.DesignMode)
            {
                MessageBox.Show("Мы в рантайме. Выставляем размры в 200 на 50.");
                this.Size = new Size(200, 50);
            }
            else
                MessageBox.Show("Мы в дизайнере");
        }
... << RSDN@Home 1.1.4 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Компонент в дизайне?
От: Igor Trofimov  
Дата: 29.05.04 12:43
Оценка:
VD>О, блин! И из-за этой фигни надо было стэк-фрэйм изучить? Я фигею, дарагая редакция...

Ладно, согласен, конкретно это можно и на позднем этапе сделать.

Но скажи мне — ты разве никогда не производишь каких-то действий именно в конструкторе формы? Да и не только в конструкторе — огромная куча методов будет ошибаться в определении DesignTime'а твоим способом. Это и конструктор, и CreateParams и всякие OnPaint,OnResize, и все конструкторы контролов, которые лежат на форме, и их BeginInit/EndInit и set'теры всех их свойств, сериализованных в код.

Все они будут говорить "Мы в RunTime!" и это будет неправдой.

Разве никогда не добавляешь на форму динамически какие-то контролы? Где это правильнее всего делать? Часто — именно в конструкторе, рядышком с InitializeControl, правильно? Вот у тебя будет радости, когда это все в DesignTime добавится...

В общем, я считаю, что лучше один раз написать абсолютно надежную проверку и сохранить результат в статическом поле каком-нибудь, чем пользоваться этим ненадежным, зато на 100% стандартным способом, который привел ты и потом гадать — где этот способ сработает, а где нет. А то и глюки еще ловить — ах, отчего дизайнер слетел, ах, это потому что не смогли понять, что в дизайнере находимся.
Re[10]: Компонент в дизайне?
От: Igor Trofimov  
Дата: 29.05.04 12:56
Оценка:
VD>Вариант 1. Контрол появляется в первый раз:
VD>1. Создается класс (вызывается его конструтор).
VD>2. Назначается сайт.
VD>Варинт 2. Класс загружается дизайнером из состояния сериализованного в код:
VD>1. Создается класс (вызывается его конструтор).
VD>2. Назначается сайт.
VD>3. Вызывается BeginInit.
VD>4. Вызывается EndInit.

Ой, как все просто и адназначна! А в курсе, что у контрола может несколько раз меняться имя? Что BeginInit/EndInit может вызываться несколько раз? Что может вызваться EndInit/OnLoad тогда, когда у контрола, например, уже есть родитель (панель какая-нибудь), а у нее самой — нету, появится позже. Что OnLoad может произойти до того, как контрол получит имя, а может — после.

То есть это все тоже вполне четко определено. И совершенно понятно, отчего это происходит. Но легче от этого не становится.

Все очень просто, пока мы берем голую форму и одну кнопку на ней.


VD>Причем тут дженерики?

При том, что когда-то тоже многие говорили, что то не нужно, это не нужно... А потом оказывалось, что очень даже нужно.

VD>И что-то можно было бы сделать лучше (в самой компонентной модели), но какое это имеет отношение к откровенному и ненужному хаку?


Увы, нужному. И почему хаку? Давайте тогда и CAS хаком назовем, раз стек трейсит, и Serialization, раз к приватным членам доступ имеет. Вопрос терминологии. Суть в том, что этот самый "хак" — работает надежно и всегда, в отличие от проверки ISite.

VD>Или в отсуствии дженериков ты внутри кода занимаешся его декомпиляцией чтобы работать с элементами кллекций? (если уж прбегать к аналогиям)


В отсуствии дженериков кое-кто и код генерит (я не говорю про те случаи, когда это не заменяется generic'ами), что однозначно более плохое решение. А кто-то — с тормозныими и нетипизированными коллекциями работает, что тоже не очень здорово.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.