С# программное создание форм по шаблону

da_hedgehog

Хочу сделать приложение которое создаёт формы по заданному шаблону(в моей голове). Куда копать \ смотреть ?

okis

А в чём проблема? Создаёшь форму, добавляешь нужные компоненты (выставляя у них св-во Parent).

lubanj

копать в сторону изучения кода, генерируемого дизайнером форм. студия их тоже создает программно форма и кнопки - это все тоже обычные элементы обычных классов

da_hedgehog

Я знаю что находится в коде дизайнера и могу написать его сам. Вопрос в другом - есть ли какие-нибудь цивилизованные средства для программной генерации кода? Пока что желаемый процесс представляется мне как построчное создание файла .cs на базе кучи условий. Что-то вроде
FileWriter.Write(@" using System \r\n
partial class MyForm {\r\n
.......
}");

okis

 Я знаю что находится в коде дизайнера и могу написать его сам. Вопрос в другом - есть ли какие-нибудь цивилизованные средства для программной генерации кода? Пока что желаемый процесс представляется мне как построчное создание файла .cs на базе кучи условий. Что-то вроде
 FileWriter.Write(@" using System \r\n
     partial class MyForm {\r\n
А зачем так извращаться? Есть же system.codedom.compiler, можно все такие тёмные дела в рантайме делать.
Тебя интересует процесс или результат? Что ты хочешь такого увидеть отличного от того, что даёт тебе дизайнер форм и почему это тебе не подходит?

da_hedgehog

Хочется чтобы я сказал программе "сделай 10 форм с такими-то параметрами", она создала формы и запихнула в проект.

Serab

По-моему самое время спросить: какую проблему ты пытаешься решить изначально?

da_hedgehog

Приходится делать шаблонные формы, вполне построимые алгоритмически. Хочу переложить эту работу на программу.

okis

> Хочу сделать приложение которое создаёт формы по заданному шаблону(в моей голове)
Мы не телепаты, поясни, что именно ты хочешь.
> Приходится делать шаблонные формы, вполне построимые алгоритмически. Хочу переложить эту работу на программу.
Так зачем для этого плодить формы в проекте?

da_hedgehog

Почитал мсдн и понял чего хочу : использовать System.Reflection.Emit для создания динамических классов и потом как-то получать их С# код. В возможности последнего не уверен, мсдн говорит только о инструкциях MSIL 8(

lubanj

а зачем тебе получать код генерации класса, если ты и так можешь получить сам класс сразу?
выходит, ты хочешь создать класс ,потом его как бы дизассемблировать, потом опять скомпилить? зачем?

Serab

Почитал мсдн и понял чего хочу : использовать System.Reflection.Emit
В цитаты, адназначна :grin:
Андрей, генерация кода, тем более в рантайме — это последнее дело. Займись программированием, я тебя умоляю :grin:

da_hedgehog

А что я положу в свн и в отчёт о проделанной работе ? Код генерации в котором никто ничего не поймёт ?

da_hedgehog

Почитал мсдн и понял чего хочу : использовать System.Reflection.Emit
В цитаты, адназначна
Андрей, генерация кода, тем более в рантайме — это последнее дело. Займись программированием, я тебя умоляю
Что в этом смешного? Обьясни. Эта область для меня нова, поэтому и спрашиваю совета здесь.

okis

А что я положу в свн и в отчёт о проделанной работе ? Код генерации в котором никто ничего не поймёт ?
Так тебе видимость деятельности создать надо? Так бы и сказал, а то пургу какую-то гонишь :crazy:
Быдлокод — зло. Не пиши его, пожалуйста, его потом кому-то придётся поддерживать.

Serab

Что в этом смешного? Обьясни. Эта область для меня нова, поэтому и спрашиваю совета здесь.
Предлагаю паттерн рефакторинга.
Name. Replace code generation with constructor parameter.

...
if( param == 12 )
Console.WriteLine( 'private void button1_onClick(...)\r\n { do_thing1; }' );
else
Console.WriteLine( 'private void button1_onClick(...)\r\n { do_thing2; }' );
...

Replace it with

public FormTemplate: Form {
public FormTemplate( int param ) { this.param = param; }
private readonly int param;
private void button1_onClick(...)
{
if( param == 12 )
do_thing1;
else
do_thing2;
}
}

lubanj

может у него зарплата от размера созданных исходников зависит?
тогда ты сильно подорвешь его бюджет
и не знаю почему, но мне че-то не нравится предложенный тобою вариант. Он как бы лучше чем авторский, но надо еще лучше делать (только не спрашивайте как)

Serab

Не, ну серьезно. Надо 10 форм, ну и создай 10... экземпляров класса вместо 10 классов. Все необходимые параметры передай через конструктор. Генерь компоненты сколько влезет вместо записи в файл.
using System.Telepathy;
Если проблема в обработчиках событий, у них там модный параметр sender есть.

okis

Он как бы лучше чем авторский, но надо еще лучше делать (только не спрашивайте как)
Автор так и не сказал, чего он хочет. Можно использовать и виртуальные методы, и абстрактные классы. Куча возможностей.

Serab

но надо еще лучше делать (только не спрашивайте как)
наследование — это level infty по сравнению с генерацией кода, ты прав. Тем более, что это следующий рефакторинг (причем в отличие от моего — дейсвительно существующий).

da_hedgehog

а что непонятного в том что хочется автоматом нагенерить код шаблонов? Его как раз легче поддерживать чем динамические классы.

Serab

а что непонятного в том что хочется автоматом нагенерить код шаблонов?
Нет, перед тобой именно такая задача стоит? Или тебе просто хочется?
Его как раз легче поддерживать чем динамические классы.
1) что такое динамические классы? Это эти, Emit'ированные что ли?
2) Легче поддерживать код без всей этой херни =)

da_hedgehog

не понял смысла приведённого пример "рефакторинга". Я говорил об создании кода готовой формы - т.е. если я захочу форму с названием "formxxx" то я запущу нечто и передам параметр название_формы = "formxxx", получу цивильный код. А твой пример предлагает рефакторить статический код, что мне вовсе не нужно. Может я плохо обьясняю что мне нужно 8)

lubanj

а что непонятного в том что хочется автоматом нагенерить код шаблонов?
в том, что ты не должен этого хотеть. это все равно что ручками нагенерить код этих форм, используя копи-паст (кстати это в качестве идеи тебе :grin: )

Serab

в том, что ты не должен этого хотеть. это все равно что ручками нагенерить код этих форм, используя копи-паст (кстати это в качестве идеи тебе :grin: )
вот реально, тоже об этом подумал. Ну либо попробовать отнаслееедоваться...

Serab

Вот что скажи, тебе надо, чтобы потом все эти 10 форм жили абсолютно независимой жизнью, или все-таки, скажем, в них всегда должно оставаться что-то общее? В общем, скажи, какую задачу ты собрался решать кодогенерацией.

da_hedgehog

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

okis

В visual studio есть code templates, про них пишут, например, здесь.
http://msdn.microsoft.com/en-us/magazine/cc188697.aspx
Некоторую логику генерации они обеспечить в состоянии.

lubanj

а откуда изначально пошла задача - нагенерить десяток похожих форм?
ты случайно не локализацией там занимаешься, при которой размеры кнопочек меняются в зависимости от длин надписей на них?
если я не угадал про локализацию, то такой вопрос:
у тебя эти все формы будут одновременно создавать и использоваться? то есть они все жить будут в один и тот же момент времени, или только какая-то одна из них ?

lubanj

ну и ответь на вопрос ункулункулу - есть ли что то общее между формами? может они все содержат одни и те же компоненты, и отличаются лишь ихними парметрами?

da_hedgehog

Блин надо было не тупить и сразу выложить исходную задачу - есть форма на C# связанная с Oracle через CoreLab. Форма дёргает хранимые процедуры, заполняя их параметры. Пример - простой справочник-грид. Потом эта форма кладётся в длл и вызывается через главное меню программы. Форма создаётся через Reflections. По сути своей эти справочники отличаются только
названиями хранимых процедур. Очень томит создавать их каждый раз заново, даже на базовой форме. Всё равно уходит время на клики в дизайнере.
Поэтому и хочется создать нечто что может эти клики заменить. Соответственно для разных параметров хранимок клики по разным местам. Может в студии есть макросы подходящие ? 8 )

okis

Блин надо было не тупить и сразу выложить исходную задачу - есть форма на C# связанная с Oracle через CoreLab. Форма дёргает хранимые процедуры, заполняя их параметры. Пример - простой справочник-грид. Потом эта форма кла
В похожей задаче, решение которой мне приходилось поддерживать, в базе была создана отдельная таблица, содержащая данные о формах и они конструировались исходя из содержания данной таблицы.
Почему ты не можешь использовать одну форму, если у тебя различаются только названия-параметры процедур? Сделай один грид и заполняй его разными данными, передавая их извне.

Serab

Блин надо было не тупить и сразу выложить исходную задачу
именно, если бы кто-нибудь читал FAQ, надо было бы туда добавить этот совет =)
Конструктор формы принимает список структур, которые содержат: имена хранимых процедур, список типов параметров.
Форма же создает соответствующие контролы (надо научить ее создавать редактор для строк, апдаун для чисел и т.д. в обработчике правильно их пакует и отсылает куда надо. Это почти the only way.

Serab

А, и правда, я не спец по БД, но логичнее было бы эту информацию положить в нее же, да =)

lubanj

По сути своей эти справочники отличаются только
названиями хранимых процеду
я не знаю что такое хранимые процедуры (не работал с БД вообще но на интуитивном уровне не понимаю, что мешает их создать скопом, а потом в зависимости от условий-параметров навешивать нужные на уже созданную одну-единственную форму? По типу как мы навешиваем произвольные обработчики событий

da_hedgehog

Короче всем спасибо за критику - я всё придумал.

asvsergey

Андрей, генерация кода, тем более в рантайме — это последнее дело. Займись программированием, я тебя умоляю :grin:

Генерация кода в рантайме - вполне нормальная задача, фреймворки использующие Dependency Injection обычно так работают, насколько я понимаю.

Dasar

Генерация кода в рантайме - вполне нормальная задача, фреймворки использующие Dependency Injection обычно так работают, насколько я понимаю.
задача нормальная - если нет других возможных вариантов решения, в треде - не этот случай.

asvsergey

Согласен :)
Оставить комментарий
Имя или ник:
Комментарий: