5 место Перенос WinForms из VisualStudio в ZennoPoster

Discussion in 'Девятый конкурс статей' started by radv, May 11, 2018.

  1. radv

    radv Client

    Joined:
    May 11, 2015
    Messages:
    253
    Likes Received:
    129
    Всем привет, в этой статье, я опишу суть как можно формы (WinForms) созданные в VisualStudio адаптировать под работу в проектах ZennoPoster.

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

    Весь процесс будет через C#. Это моя первая конкурсная статья (участие в конкурсе шаблоном, я в расчет не принимаю), и в изучении C# я только оттачиваю свои навыки поэтому прошу принять это во внимание. Если Ваш уровень выше моего, и что то можно было сделать более оптимально буду рад Вашим комментариям.

    На форуме есть отличная статья про работу с WinForms, там описано как самому создавать форму с нужными компонентами, чтобы использовать ее в своем проекте ZennoPoster, но это все надо делать вручную и задавать все параметры, а это очень не удобно и занимает больше времени. Поэтому лучше создавать формы в VisualStudio и адаптировать их для использования в своих проектах, написав свой шаблон для их преобразования .

    Итак, начинаем. Все формы в проектах VisualStudio записываются в три файла. В именах этих файлов содержится название формы.

    Например: если форма называется FormForZenno, тогда в файле FormForZenno.cs будет код действий для этой формы при загрузке формы, нажатии на кнопки, выборе значений элементов и т.п., в файле FormForZenno.Designer.cs содержится код дизайна формы (все ее элементы и компоненты) и в файле FormForZenno.resx содержатся все значения для дизайна формы. Вот эти файлы и нужны для работы, скопируем их содержимое в переменные проекта ZennoPoster.

    01 файлы.png

    Перенесем код из этих файлов в строковые переменные проекта Zennoposter.

    В переменной strCodeActions будет код действий из файла FormForZenno.cs

    В переменной strFormDesign будет код дизайна формы из файла FormForZenno.Designer.cs

    В переменной strRESX будет код с ресурсами из файла FormForZenno.resx

    Шаг 1: Обработка действий

    В первую очередь обработаем код действий из файла FormForZenno.cs. Для того чтобы адаптировать код нужно для всех действий при клике заменить все "_Click" на ".Click+=delegate" или для действий при загрузке формы заменить "_Load" на ".Load+=delegate".

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

    Вот код этой обработки для кубика C#

    Code (Csharp):
    1.  
    2. // Паттерн регулярки для поиска
    3.  
    4. string strPattern = @"(?<=\ ).*?_Click";
    5.  
    6. // Цикл добавления комментария перед каждым действием на клик
    7.  
    8. foreach (Match rxMatch in Regex.Matches(strCodeActions, strPattern)) {
    9.  
    10.   // ищем  private void и т.п. для удаления перед _Click
    11.  
    12.   strPattern = @"\ .*\ ";
    13.  
    14.   //= Берем первое совпадение с регуляркой
    15.  
    16.   string strTempForReplace = new Regex(strPattern).Match(rxMatch.Value).Value.Trim();
    17.  
    18.   // Комментарий с уникальными символами, для вставки перед кодом действия
    19.  
    20.   string strHashTag= "//@@"";
    21.  
    22.  //Все совпадения
    23.  
    24.  strCodeActions = strCodeActions.Replace(strTempForReplace, strHashTag);
    25.  
    26.  project.Variables["sourceForm"].Value = strCodeActions;
    27.  
    28. }
    29.  
    30. // Для действий при клике
    31.  
    32. strCodeActions = strCodeActions.Replace("_Click", ".Click+=delegate");
    33.  
    34. // Для действий при загрузке формы
    35.  
    36. strCodeActions = strCodeActions.Replace("_Load", ".Load+=delegate");
    37.  
    После выполнения этого кода, каждый блок кода действий будет разделен комментарием уникальными символами, которые нигде в коде не могут встречаться. В данном случае, я взял символы "//@@". Такой же комментарий нужно добавить в конец переменной с кодом действий, тогда по регулярке можно будет выдергивать блок кода для нужного компонента (например кнопки) и вставлять в нужное место файла результата после обработки файлов с дизайном и ресурсами.

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


    Шаг 2: Обработка файла с дизайном формы

    При обработке файла FormForZenno.Designer.cs нужно получить названия всех компонентов, а так же сделать их инициализацию и подключение к форме. Название формы можно задать вручную (или получением из кода)

    Code (Csharp):
    1.  
    2.  
    3. // Создаем список куда записываем результат обработки
    4.  
    5. List<string> lstResult = new List<string>();
    6.  
    7. // Название формы FormName
    8.  
    9. string strFormName = "FormForZenno";
    10.  
    11. //потом формируем строку для Инициализации формы
    12.  
    13. string strInit = String.Format("System.Windows.Forms.Form {0} = new System.Windows.Forms.Form();", strFormName);
    14.  
    15. // Записываем ее в список
    16.  
    17. lstResult.Add(strInit);
    18.  
    19.  

    В коде с дизайном ищем все компоненты и разделяем их на Имя компонента и его Класс для правильной инициализации в коде кубика C#

    так строка strInit для формы будет иметь значение "System.Windows.Forms.Form FormForZenno = new System.Windows.Forms.Form(); что создаст новую форму без ошибок.

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

    02 код формы.png

    Между #region и #endregion код всех компонентов формы, который нужно будет обработать.

    Код обработки сбора названия и классов компонентов формы в список

    Code (Csharp):
    1.  
    2.  
    3. // Блок список компонентов в без параметров формы
    4.  
    5. strPattern = @"(?<=InitializeComponent)[\w\W]*?(?=//)";
    6.  
    7. //= Берем первое совпадение с регуляркой (все блоки с параметрами компонентов)
    8.  
    9. string strListComp = new Regex(strPattern).Match(strFormDesign).Value.Trim();
    10.  
    11. // Регулярка список компонентов в правильном порядке
    12.  
    13. strPattern = @"(?<=this\.).*?;";
    14.  
    15. // Создадим список компонентов
    16.  
    17. List<string> listCompName = new List<string>();
    18.  
    19. listCompName.Clear();
    20.  
    21. // части CompClassName и CompName
    22.  
    23. string strCompClassName = String.Empty;
    24.  
    25. string strCompName = String.Empty;
    26.  
    27. // Ищем все совпадения для сохранения в список компонентов
    28.  
    29. foreach (Match rxMatch in Regex.Matches(strListComp, strPattern)) {
    30.  
    31.   // удаляем все this, если они остались
    32.  
    33.   string strTemp = rxMatch.Value.Trim().Replace("this.", String.Empty);
    34.  
    35.   // Разделяем на Имя компонента и Класс
    36.  
    37.   string[] arrTemp = strTemp.Split('=');
    38.  
    39.   if (arrTemp.Length > 1) {
    40.  
    41.   // Все совпадения кладем в список
    42.  
    43.   strCompName = arrTemp[0].Trim();
    44.  
    45.   strCompClassName = arrTemp[1].Trim();
    46.  
    47.   string strTempPattern = @"(?<=\ System\.Windows\.Forms\.).*?(?=\()";
    48.  
    49.   //= Берем первое совпадение с регуляркой (все блоки с параметрами компонентов)
    50.  
    51.   strCompClassName = new Regex(strTempPattern).Match(strCompClassName).Value.Trim();
    52.  
    53.       if (strCompClassName != String.Empty) {
    54.  
    55.           strTemp = strCompClassName + "|" + strCompName;
    56.  
    57.          listCompName.Add(strTemp);
    58.  
    59.       }
    60.  
    61.   }
    62.  
    63. }
    64.  
    65. // Добавляем название формы для сбора ее параметров
    66.  
    67. listCompName.Add(String.Format(@"Form|{0}", strFormName));
    68.  
    69.  
    После выполнения этого кода получаем список компонентов формы для которых будем собирать их параметры. Список будет вида textBox1|TextBox (Название компонента и его Класса через разделитель | (вертикальная черта) )


    Параметры компонентов и самой формы разделены на блоки с названием компонента в комментарии.

    04 параметры компонета.png

    Параметры самой формы задаются после параметров всех компонентов.

    04 параметры формы.png

    Далее в цикле перебираем все компоненты по их именам из списка listCompName и в список listCompParam собираем все блоки с параметрами каждого компонента

    Код обработки

    Code (Csharp):
    1.  
    2.  
    3. // Регулярка Вырезаем блок с параметрами всех компонентов формы
    4.  
    5. strPattern = @"(?<=InitializeComponent)[\w\W]*(?=\#endregion)";
    6.  
    7. //= Берем первое совпадение с регуляркой (все блоки с прараметрами компонентов)
    8.  
    9. string strListParamComp = new Regex(strPattern).Match(strFormDesign).Value.Trim();
    10.  
    11. // Удаляем все this.
    12.  
    13. strListParamComp = strListParamComp.Replace("this.", String.Empty).Trim();
    14.  
    15. // Создадим список
    16.  
    17. List<string> listCompParam = new List<string>();
    18.  
    19. listCompParam.Clear();
    20.  
    21. while (listCompName.Count > 0) {
    22.  
    23.   //Берем из списка ListCompName первую строку с удалением
    24.  
    25.   string[] arrTemp = listCompName[0].Split('|');
    26.  
    27.   listCompName.RemoveAt(0);
    28.  
    29.   //Разделяем на части CompClassName и CompName
    30.  
    31.   strCompClassName = arrTemp[0];
    32.  
    33.   strCompName = arrTemp[1];
    34.  
    35.   if (strCompClassName != "Form") {// Пропускаем формирование инициализации формы (сделали его раньше)
    36.  
    37.   //формируем строки для Инициализации компонента из списка
    38.  
    39.   strInit = String.Format("System.Windows.Forms.{0} {1} = new System.Windows.Forms.{0}();", strCompClassName, strCompName);
    40.  
    41.   // Записываем в список
    42.  
    43.   lstResult.Add(strInit);
    44.  
    45.   }
    46.  
    47.   // Название след. компонента
    48.  
    49.   string strCompNameNext = String.Empty;
    50.  
    51.   if (listCompName.Count > 0) {
    52.  
    53.   //Берем из списка ListCompName первую строку с удалением
    54.  
    55.   arrTemp = listCompName[0].Split('|');
    56.  
    57.   //Разделяем на части CompClassNameNext и CompNameNext
    58.  
    59.   //CompClassNameNext = arrTemp[0];
    60.  
    61.   strCompNameNext = arrTemp[1];
    62.  
    63.   } else {
    64.  
    65.   // когда все названия компонентов закончились, собираем параметры для формы
    66.  
    67.   strCompNameNext = String.Empty;
    68.  
    69.   }
    70.  
    71.   // Разделяем на блоки отдельных компонентов между strCompName и strCompNameNext
    72.  
    73.   if (strCompName == strFormName){
    74.  
    75.   strPattern = String.Format(@"(?<=//\ {0})[\w\W]*", strCompName);
    76.  
    77.   } else {
    78.  
    79.   strPattern = String.Format(@"(?<=//\ {0})[\w\W]*?(?=//\ {1})", strCompName, strCompNameNext);
    80.  
    81.   }
    82.  
    83.   // Вырезаем параметры компонента CompName {1} в CompNameNext {3}
    84.  
    85.   string strCodeParamComp = new Regex(strPattern).Match(strListParamComp).Value.Trim();
    86.  
    87.  
    88.  
    89.   // удаляем лишние символы // по краям
    90.  
    91.   strCodeParamComp = strCodeParamComp.Replace("//", String.Empty).Trim();
    92.  
    93.   // задаем временную переменную для обработки параметров
    94.  
    95.   string strTemp = String.Empty;
    96.  
    97.   string strParamCompName = String.Empty;
    98.  
    99.   // Выбираем строку отдельного параметра компонента от начала строки до ;
    100.  
    101.   strPattern = @"([\w\W]*?;)";
    102.  
    103.   // Для перебора всеx параметров у этого компонента
    104.  
    105.   foreach (Match rxMatch in Regex.Matches(strCodeParamComp, strPattern)) {
    106.  
    107.   strTemp = rxMatch.Value.Trim();
    108.  
    109.   // Код цикла перебора значений для каждого компонента (будет описан ниже)
    110.  
    111.    }
    112.  
    113. }// закончили перебор всеx компонентов из списка listCompName
    114.  
    115.  
    В итоге получили список с параметрами для каждого компонента.

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

    Действия при клике выглядят так

    05 действия при клике.png

    Если есть ресурсы (в параметре содержится resources.ApplyResources или просто resources) делаем их обработку кода из переменной strRESX (код из файла FormForZenno.resx). Если форма простая, то значения в ресурсы могут и не записываться, все значения будут в параметрах компонента и их обработка не потребуется.

    Код обработки если есть действие при клике

    Code (Csharp):
    1.  
    2.  
    3. // Регулярка выбора кода действия для компонента по разделителю strHashTag (уникальные символы которые мы задали “//@@”
    4.  
    5. strPattern = String.Format(@"{0}[\w\W]*?(?={1})", strCompName, strHashTagComment);
    6.  
    7. //= Берем первое совпадение с регуляркой (все блоки с параметрами компонентов)
    8.  
    9. string strClickAction = new Regex(strPattern).Match(strCodeActions).Value.Trim();
    10.  
    11. // Комментарий для кода в файле
    12.  
    13. //разделитель элементов списка
    14.  
    15. string strDelimiter = Environment.NewLine;
    16.  
    17. strComment = String.Format("{1}// Действие при клике для {0} {1}// Проверьте синтаксис и количество закрывающих скобок  и ; {1}", strCompName, strDelimiter);
    18.  
    19. // Записываем в список
    20.  
    21. listCompParam.Add(strComment);
    22.  
    23. // Код действий при клике
    24.  
    25. strClickAction = strClickAction.Replace("DialogResult", "System.Windows.Forms.DialogResult") + ";" + strDelimiter;
    26.  
    27. // Добавляем название формы
    28.  
    29. strClickAction = strClickAction.Replace(@"Close()", String.Format(@"{0}.Close()", strFormName));
    30.  
    31. listCompParam.Add(strClickAction);
    32.  
    33.  
    Таким образом получили код нужного действия

    Для обработки действий при загрузке формы и остальных параметров (без использования ресурсов) используем такой код обработки

    Code (Csharp):
    1.  
    2.  
    3. //Обработка параметров формы и остальных параметров компонентов без ресурсов записываем в список параметров
    4.  
    5. if (strCompName == strFormName) {
    6.  
    7.   if (!strTemp.Contains("Layout") && !strTemp.Contains("Init")){
    8.  
    9.   // Для параметров формы
    10.  
    11.   if (strTemp.Contains("+=")){
    12.  
    13.   // Для действий при загрузке формы
    14.  
    15.   string strFormAction = new Regex(@"(?<=\().*(?=\))").Match(strTemp).Value.Trim();
    16.  
    17.   strFormAction = strFormAction.Replace("_",".");
    18.  
    19.    // Регулярка выбора кода действия для компонента
    20.  
    21.   strPattern = String.Format(@"{0}[\w\W]*?(?={1})", strFormAction, strHashTagComment);
    22.  
    23.   //= Берем первое совпадение с регуляркой (все блоки с прараметрами компонентов)
    24.  
    25.    string strClickAction = new Regex(strPattern).Match(strCodeActions).Value.Trim();
    26.  
    27.   // Комментарий для кода в файле
    28.  
    29.   strComment = String.Format("{1}// Действие при клике для {0} {1}// Проверьте синтаксис и количество закрывающих скобок и ; {1}", strFormAction, strDelimiter);
    30.  
    31.   // Код действий при клике
    32.  
    33.   strClickAction = strClickAction.Replace("DialogResult", "System.Windows.Forms.DialogResult") + ";" + strDelimiter;
    34.  
    35.   // Формируем нужный код
    36.  
    37.   strTemp = strComment + strClickAction;
    38.  
    39.   } else {
    40.  
    41.   strTemp = strFormName + "." + strTemp;
    42.  
    43.   }
    44.  
    45.   } else if (strTemp.Contains("Init")) {
    46.  
    47.   // Для остальных параметров
    48.  
    49.   strTemp = "// Пропуск параметра System.ComponentModel.ISupportInitialize";
    50.  
    51.   }
    52.  
    53. }
    54.  
    55. listCompParam.Add(strTemp);
    56.  
    57.  
    Таким кодом мы вместо строки с действием вставляем сам код действия адаптированный под выполнение в ZennoPoster и комментарий проверки синтаксиса и лишних символов.

    После цикла обработки всех параметров осталось все собрать в файл результатов и сохранить в файл

    Code (Csharp):
    1.  
    2.  
    3. // Переносим собранные параметры в список
    4.  
    5. lstResult.AddRange(listCompParam);
    6.  
    7. // Параметры для формы
    8.  
    9. strComment = strDelimiter + String.Format(@"// Добавьте {0}. к ResumeLayout и PerformLayout выше этого сообщения", strFormName);
    10.  
    11. lstResult.Add(strComment);
    12.  
    13. // Параметры для Диалога по умолчанию
    14.  
    15. //strComment = strDelimiter + String.Format(@"Добавьте {0}. к ResumeLayout и PerformLayout выше этого сообщения", strFormName);
    16.  
    17. //lstResult.Add(strComment);
    18.  
    19. // Параметры для формы по умолчанию
    20.  
    21. strComment = strDelimiter
    22.  
    23.   + "// Закомментируйте параметры формы по умолчанию, если они заданы в ее настройках"
    24.  
    25.   + strDelimiter
    26.  
    27.   + "// Название формы по умолчанию"
    28.  
    29.   + strDelimiter
    30.  
    31.   + String.Format(@"{0}.Text = ""Название Формы"";", strFormName)
    32.  
    33.   + strDelimiter
    34.  
    35.   + "// АвтоРазмер формы по умолчанию"
    36.  
    37.   + strDelimiter
    38.  
    39.   + String.Format(@"{0}.AutoSize =  true;", strFormName)
    40.  
    41.   + strDelimiter
    42.  
    43.   + "// Местоположение формы по умолчанию"
    44.  
    45.   + strDelimiter
    46.  
    47.   + String.Format(@"{0}.Location = new System.Drawing.Point(150,300);", strFormName)
    48.  
    49.   + strDelimiter
    50.  
    51.   + "// Запуск формы по центру экрана"
    52.  
    53.   + strDelimiter
    54.  
    55.   + String.Format(@"{0}.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;", strFormName)
    56.  
    57.   + strDelimiter
    58.  
    59.   + "// Размер формы по умолчанию"
    60.  
    61.   + strDelimiter
    62.  
    63.   + String.Format(@"{0}.Size = new System.Drawing.Size(300, 180);", strFormName)
    64.  
    65.   + strDelimiter;
    66.  
    67. lstResult.Add(strComment);
    68.  
    69. // Показываем эту форму
    70.  
    71. strComment = strDelimiter
    72.  
    73.   + "// Показываем нашу форму "
    74.  
    75.   + strDelimiter
    76.  
    77.   + String.Format(@"{0}.ShowDialog();", strFormName);
    78.  
    79. lstResult.Add(strComment);
    80.  
    81. //сохраняем список в файл с заменой содержимого файла (после сбора всех данных в список)
    82.  
    83. File.WriteAllText(strFilePathReslt, String.Join(strDelimiter, lstResult));
    84.  
    85. project.SendInfoToLog(String.Format(@"Все готово.  Результат в файле {0}", strFilePathReslt)
    86.  
    87. );
    88.  
    89.  
    В итоге получаем файл с результатами и комментариями. Код из этого файла можно вставить в кубик C# и проверить работу нашей формы.

    Шаг 3: Финальные правки

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

    Привожу два комментария на которые надо обратить внимание:

    Code (Csharp):
    1.  
    2.  
    3. // Проверьте синтаксис и количество закрывающих скобок  и ;
    4.  
    5. // Добавьте FormForZenno. к ResumeLayout и PerformLayout выше этого сообщения
    6.  
    7.  
    Просто делаете что написано в таких комментариях и все готово, форма работает.

    Подробности смотрите в видео к этой статье.


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

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

    Attached Files:

    Last edited: May 13, 2018
    goldfish, Nike59, pg2016 and 26 others like this.
  2. iBotovod

    iBotovod Client

    Joined:
    Jul 1, 2017
    Messages:
    52
    Likes Received:
    15
    канонiчные тру-програмеры молча, без тарахтения в каментах, голосуют, качают шаб и идут дальше :-)
    и в этой статье чувствуется "тлетворное" влияние Сиборры )
    спасибо за любопытную тему
     
  3. radv

    radv Client

    Joined:
    May 11, 2015
    Messages:
    253
    Likes Received:
    129
    скорее плодотворное влияние :ar:
     
  4. Moadip

    Moadip Client

    Joined:
    Sep 26, 2015
    Messages:
    432
    Likes Received:
    577
    Предлагаю как дополнение, ну или в виде отдельной статьи, написать как использовать wpf в зенке.
    Формы на winforms это конечно хорошо, но что то глобальное будет проблематично сделать. Плюс на wpf можно гораздо красивее UI сделать, или то что на winforms нереально.
    Проблема только в том, что при использовании wpf UI делают через xaml, можно конечно и через обычный C#, но это будет то еще извращение.
    В общем просто так xaml не запихать в зенку.))
    Я делал что UI в виде отдельной либы, чисто один интерфейс, потом подключал к шабу в зенке, и уже связывал контролы в интерфейсе с кодом в самой зенке.
    Думаю народу такую инфу будет интересно почитать, ну даже так, для общего развития.))

    @radv напиши что вообще подразумевается под "ресурсами", т.к. кто не в теме, тот вообще не поймет что это и нахрена.
    Ну и так, на заметку, смысл заморачиваться с обработкой ресурсов, если эти "ресурсы" можно напрямую добавить в зенку?
    Другими словами, мы сначала создали себе проблему, напихали "ресурсов" в resx, а потом решаем ее.:-)

    Маркетинг он такой маркетинг.:D

    В целом посмотрел подход, шабы не качал. Как то все сложно. Конечно хз, на вкус и цвет все фломастеры разные.:-)

    По факту надо перенести то что нагенерил дизайнер VS в зенку, ну и плюс привязать какую то логику.

    Делал так.
    В OwnCode делается класс, ну типа SomeClass1, в нем метод Loader(), он собственно создает форму и добавляет в нее все компоненты, плюс подключает обработчики к контролам.
    В этом же классе идут методы обработчики для кнопок или еще каких контролов на форме.
    Все.

    Создали объект класса SomeClass1, вызвали метод Loader(), он нам возвращает форму, показали эту форму, что то сделали. Если замысел был что "в обратку" получается какая то инфа, добавили или свойства в класс SomeClass1, или методы, которые возвращают нужную инфу.

    Звучит конечно монструозно, но по факту то ничего особо и не изменили по сравнению со студией.
    Т.е. в студии код дизайнера, который генерит код формы, и "наш" код разнесен по отдельным файлам. Мы это все собираем в один класс и пихаем в зенку с мин. изменениями.
     
    Lanidor, budora, LaGir and 3 others like this.
  5. radv

    radv Client

    Joined:
    May 11, 2015
    Messages:
    253
    Likes Received:
    129
    С WPF пока совсем не разбирался, а вот с дополнительными библиотеками на WinForms можно сделать очень даже красивые формы или интерфейсы, вплоть до ленты с кнопочками и вкладками как в MSOfifce или Зенке

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

    Так в видео и показано, что нагенерили без изысков форму в VS и через шаб перенесли, только убрать пару лишних скобок и добавить пару названий формы. Если будет выдавать ошибки, рядом в комментариях написано как исправить. В полной версии буду делать поддержку ресурсов и сторонних библиотек для красивых UI

    Чтобы в коде совсем не копаться, если кто то не очень его понимает, или совсем не понимает. все будет автоматом делаться. Нагенерил форму в VS, запустил шаб, получил код, вставил и все готово к использованию :-)

    Насчет остальных предложений и дополнений, как наберусь опыта, то поделюсь в отдельной статье или другим способом.
     
    Last edited: May 14, 2018
  6. Moadip

    Moadip Client

    Joined:
    Sep 26, 2015
    Messages:
    432
    Likes Received:
    577
    В курсе.

    Ну куда уже проще. Берем родные файлы cs из студии, обрабатываем их регулярками.:D

    Карочь не удержался, скачал. Посмотрел.
    Ок, способ имеет место быть, по сути делает то о чем и писал, соединяет код дизайнера и свой код, разница в том что предлагается добавить код не в owncode, а в кубик C# сразу. С этим бы поспорил.
    Вопрос. Не спотыкнутся ли регулярки если будут вложенные классы или еще что?
    А если несколько форм, что делать? Или если в "нашем" коде используем доп. классы которые сами сделали, что с ними делать?
    Я как бы не докапываюсь, а так, уточняю.:-)

    Мудрить, это как раз обрабатывать cs регулярками.
    Надо работать с кодом напрямую, без понимания того что делается рано или поздно возникнут вопросы. Что то не так спарсится, и код не будет компилиться в зенке.
    Еще раз повторюсь, способ имеет место быть. Как вариант для понимания что переносить из студии и как.
    Т.е. смотрим что в студии, смотрим что получилось на выходе, разбираем в чем разница.
    Но имхо, проще сделать копипаст из студии в зенку, и подправить что надо.

    PS:
    Предлагаю сделать upgrade.
    upload_2018-5-14_16-40-13.png
    Выбирать файлы ручками лениво. Лучше указываешь путь до папки проекта, а остальное пусть все шаб делает.
     
    Last edited: May 14, 2018
    Zymlex and LaGir like this.
  7. radv

    radv Client

    Joined:
    May 11, 2015
    Messages:
    253
    Likes Received:
    129
    Насколько я понял на данный момент, простые формы обрабатывает нормально, со вложенными классами надо пробовать на конкретном примере, пока не встречался с такими. Если имеешь виду родительские элементы у компонентов, например панель, а на нее складываются label, textbox и т.п. , то все это складывается в ресурсы и можно обработать. Регулярки не должны спотыкаться, так как там все однотипно и на сложные конструкции идет ссылка на файл с ресурсами, а в нем для конкретного элемента задаются нужные параметры.

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

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

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


    а ручками код править после копипаста не лениво? :-) Сейчас по умолчанию открывает папку проекта и если скопировать туда нужные файлы, то так надежнее, можно конечно и прописать обработку файлов в папке, но можно файлы в папку не копировать, а просто выбирать их из папки проекта VS. И как бы лень не было, а кнопочку на выполнение шаба, все равно придется нажать :-)
     
    Last edited: May 14, 2018
  8. ssXXXss

    ssXXXss Client

    Joined:
    Dec 23, 2014
    Messages:
    6,893
    Likes Received:
    1,745
    не замечал такого чтобы там много чего то править, в общем коде всё принимается нормально покрайней мере если с формой работать
     
  9. radv

    radv Client

    Joined:
    May 11, 2015
    Messages:
    253
    Likes Received:
    129
    Если ошибок в коде нет, то можно и в общий код вставить. в кубик вставлял для проверки на ошибки
     

Пользователи просматривающие тему (Пользователей: 0, Гостей: 0)