С# программное создание форм по шаблону
А в чём проблема? Создаёшь форму, добавляешь нужные компоненты (выставляя у них св-во Parent).
копать в сторону изучения кода, генерируемого дизайнером форм. студия их тоже создает программно форма и кнопки - это все тоже обычные элементы обычных классов
FileWriter.Write(@" using System \r\n
partial class MyForm {\r\n
.......
}");
Я знаю что находится в коде дизайнера и могу написать его сам. Вопрос в другом - есть ли какие-нибудь цивилизованные средства для программной генерации кода? Пока что желаемый процесс представляется мне как построчное создание файла .cs на базе кучи условий. Что-то вродеА зачем так извращаться? Есть же system.codedom.compiler, можно все такие тёмные дела в рантайме делать.
FileWriter.Write(@" using System \r\n
partial class MyForm {\r\n
Тебя интересует процесс или результат? Что ты хочешь такого увидеть отличного от того, что даёт тебе дизайнер форм и почему это тебе не подходит?
Хочется чтобы я сказал программе "сделай 10 форм с такими-то параметрами", она создала формы и запихнула в проект.
По-моему самое время спросить: какую проблему ты пытаешься решить изначально?
Приходится делать шаблонные формы, вполне построимые алгоритмически. Хочу переложить эту работу на программу.
Мы не телепаты, поясни, что именно ты хочешь.
> Приходится делать шаблонные формы, вполне построимые алгоритмически. Хочу переложить эту работу на программу.
Так зачем для этого плодить формы в проекте?
Почитал мсдн и понял чего хочу : использовать System.Reflection.Emit для создания динамических классов и потом как-то получать их С# код. В возможности последнего не уверен, мсдн говорит только о инструкциях MSIL 8(
выходит, ты хочешь создать класс ,потом его как бы дизассемблировать, потом опять скомпилить? зачем?
Почитал мсдн и понял чего хочу : использовать System.Reflection.EmitВ цитаты, адназначна
Андрей, генерация кода, тем более в рантайме — это последнее дело. Займись программированием, я тебя умоляю
А что я положу в свн и в отчёт о проделанной работе ? Код генерации в котором никто ничего не поймёт ?
Почитал мсдн и понял чего хочу : использовать System.Reflection.EmitЧто в этом смешного? Обьясни. Эта область для меня нова, поэтому и спрашиваю совета здесь.
В цитаты, адназначна
Андрей, генерация кода, тем более в рантайме — это последнее дело. Займись программированием, я тебя умоляю
А что я положу в свн и в отчёт о проделанной работе ? Код генерации в котором никто ничего не поймёт ?Так тебе видимость деятельности создать надо? Так бы и сказал, а то пургу какую-то гонишь
Быдлокод — зло. Не пиши его, пожалуйста, его потом кому-то придётся поддерживать.
Что в этом смешного? Обьясни. Эта область для меня нова, поэтому и спрашиваю совета здесь.Предлагаю паттерн рефакторинга.
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;
}
}
тогда ты сильно подорвешь его бюджет
и не знаю почему, но мне че-то не нравится предложенный тобою вариант. Он как бы лучше чем авторский, но надо еще лучше делать (только не спрашивайте как)
using System.Telepathy;
Если проблема в обработчиках событий, у них там модный параметр sender есть.
Он как бы лучше чем авторский, но надо еще лучше делать (только не спрашивайте как)Автор так и не сказал, чего он хочет. Можно использовать и виртуальные методы, и абстрактные классы. Куча возможностей.
но надо еще лучше делать (только не спрашивайте как)наследование — это level infty по сравнению с генерацией кода, ты прав. Тем более, что это следующий рефакторинг (причем в отличие от моего — дейсвительно существующий).
а что непонятного в том что хочется автоматом нагенерить код шаблонов? Его как раз легче поддерживать чем динамические классы.
а что непонятного в том что хочется автоматом нагенерить код шаблонов?Нет, перед тобой именно такая задача стоит? Или тебе просто хочется?
Его как раз легче поддерживать чем динамические классы.1) что такое динамические классы? Это эти, Emit'ированные что ли?
2) Легче поддерживать код без всей этой херни =)
не понял смысла приведённого пример "рефакторинга". Я говорил об создании кода готовой формы - т.е. если я захочу форму с названием "formxxx" то я запущу нечто и передам параметр название_формы = "formxxx", получу цивильный код. А твой пример предлагает рефакторить статический код, что мне вовсе не нужно. Может я плохо обьясняю что мне нужно 8)
а что непонятного в том что хочется автоматом нагенерить код шаблонов?в том, что ты не должен этого хотеть. это все равно что ручками нагенерить код этих форм, используя копи-паст (кстати это в качестве идеи тебе )
в том, что ты не должен этого хотеть. это все равно что ручками нагенерить код этих форм, используя копи-паст (кстати это в качестве идеи тебе )вот реально, тоже об этом подумал. Ну либо попробовать отнаслееедоваться...
Вот что скажи, тебе надо, чтобы потом все эти 10 форм жили абсолютно независимой жизнью, или все-таки, скажем, в них всегда должно оставаться что-то общее? В общем, скажи, какую задачу ты собрался решать кодогенерацией.
рить код этих форм, используя копи-паст (кстати это в качестве идеи тебе )идея не катит так как код довольно сложный и зависит от многих условий.
http://msdn.microsoft.com/en-us/magazine/cc188697.aspx
Некоторую логику генерации они обеспечить в состоянии.
ты случайно не локализацией там занимаешься, при которой размеры кнопочек меняются в зависимости от длин надписей на них?
если я не угадал про локализацию, то такой вопрос:
у тебя эти все формы будут одновременно создавать и использоваться? то есть они все жить будут в один и тот же момент времени, или только какая-то одна из них ?
ну и ответь на вопрос ункулункулу - есть ли что то общее между формами? может они все содержат одни и те же компоненты, и отличаются лишь ихними парметрами?
названиями хранимых процедур. Очень томит создавать их каждый раз заново, даже на базовой форме. Всё равно уходит время на клики в дизайнере.
Поэтому и хочется создать нечто что может эти клики заменить. Соответственно для разных параметров хранимок клики по разным местам. Может в студии есть макросы подходящие ? 8 )
Блин надо было не тупить и сразу выложить исходную задачу - есть форма на C# связанная с Oracle через CoreLab. Форма дёргает хранимые процедуры, заполняя их параметры. Пример - простой справочник-грид. Потом эта форма клаВ похожей задаче, решение которой мне приходилось поддерживать, в базе была создана отдельная таблица, содержащая данные о формах и они конструировались исходя из содержания данной таблицы.
Почему ты не можешь использовать одну форму, если у тебя различаются только названия-параметры процедур? Сделай один грид и заполняй его разными данными, передавая их извне.
Блин надо было не тупить и сразу выложить исходную задачуименно, если бы кто-нибудь читал FAQ, надо было бы туда добавить этот совет =)
Конструктор формы принимает список структур, которые содержат: имена хранимых процедур, список типов параметров.
Форма же создает соответствующие контролы (надо научить ее создавать редактор для строк, апдаун для чисел и т.д. в обработчике правильно их пакует и отсылает куда надо. Это почти the only way.
А, и правда, я не спец по БД, но логичнее было бы эту информацию положить в нее же, да =)
По сути своей эти справочники отличаются толькоя не знаю что такое хранимые процедуры (не работал с БД вообще но на интуитивном уровне не понимаю, что мешает их создать скопом, а потом в зависимости от условий-параметров навешивать нужные на уже созданную одну-единственную форму? По типу как мы навешиваем произвольные обработчики событий
названиями хранимых процеду
Короче всем спасибо за критику - я всё придумал.
Андрей, генерация кода, тем более в рантайме — это последнее дело. Займись программированием, я тебя умоляю
Генерация кода в рантайме - вполне нормальная задача, фреймворки использующие Dependency Injection обычно так работают, насколько я понимаю.
Генерация кода в рантайме - вполне нормальная задача, фреймворки использующие Dependency Injection обычно так работают, насколько я понимаю.задача нормальная - если нет других возможных вариантов решения, в треде - не этот случай.
Согласен
Оставить комментарий
da_hedgehog
Хочу сделать приложение которое создаёт формы по заданному шаблону(в моей голове). Куда копать \ смотреть ?