Редактор генерит комментарии перед каждым блоком с параметрами элемента, можно от этого отталкиваться
// // button1 // this.button1.Location = new System.Drawing.Point(12, 121); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true;
Почему-то в скайпе, а не здесь, посоветовали обратить внимание на редактор https://glade.gnome.org , который генерит в формате XML, парсить который проще и есть стандартные тулзы. Ок, я не маньяк и не фанат VS, рассмотрю и этот вариант.
PS: Пишите сюда, зачем в скайп или личку-то?
- glade.gnome.org
Почему-то в скайпе, а не здесь, посоветовали обратить внимание на редактор https://glade.gnome.org , который генерит в формате XML, парсить который проще и есть стандартные тулзы. Ок, я не маньяк и не фанат VS, рассмотрю и этот вариант.
PS: Пишите сюда, зачем в скайп или личку-то?
Давно есть идея сделать на основе редактора Visual Studio генератор графического интерфейса для программ на MQL4/5. Чтобы не набивать весь GUI ручками, как в начале 90-х, а рисовать его в редакторе, а полученное конвертировать в код MQL.
Тем более, что сейчас Microsoft выпускает редактор отдельно от студии, естественно, бесплатно. Итак, небольшой пример панельки и код, который порождает редактор. Задача для начала - вытянуть в массивы все кнопки, чекбоксы и эдит. Формат на выходе для начала неважен, главное, как грамотно сделать такой парсинг? У меня в парсинге и регулярных выражения опыта мало, поэтому прошу совета.
И код, который генерит редактор
Зачем редактор? Я пользуюсь стандартной библиотекой + написал несколько классов - меню, таблицы и т.д. Раз сделал каркас и потом для разных роботов его использую, правда приходится руками классы фреймов в каркасе дополнять/убирать поля, дополнять пункты меню и т.д., но после генерации предложенным тобой вариантом, все равно придется лезть в код и писать обработчики тех же кнопок и полей...
Зачем редактор? Я пользуюсь стандартной библиотекой + написал несколько классов - меню, таблицы и т.д. Раз сделал каркас и потом для разных роботов его использую, правда приходится руками классы фреймов в каркасе дополнять/убирать поля, дополнять пункты меню и т.д., но после генерации предложенным тобой вариантом, все равно придется лезть в код и писать обработчики тех же кнопок и полей...
можно автоматизировать и обработчики
да хотя бы дизайн заценить визуально, и то будет хорошо
руками надоело
this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); this.checkBox1 = new System.Windows.Forms.CheckBox(); this.checkBox2 = new System.Windows.Forms.CheckBox(); this.checkBox3 = new System.Windows.Forms.CheckBox(); this.textBox1 = new System.Windows.Forms.TextBox();
Строка начинается с "this.", содержит " = new". Между "this." и "= new" нет точки. Получим имена.
Потом для каждого имени формировать строки начинающиеся с "this.[name].Location" и с "this.[name].Size", искать их и смотреть, то что в конце в скобках. Еще найти строку начинающуюся с this.ClientSize.
Можно и без регулярок, чисто поиском подстрок в цикле, теста не много, и вообще парсинг простой.
Строка начинается с "this.", содержит " = new". Между "this." и "= new" нет точки. Получим имена.
Потом для каждого имени формировать строки начинающиеся с "this.[name].Location" и с "this.[name].Size", искать их и смотреть, то что в конце в скобках. Еще найти строку начинающуюся с this.ClientSize.
Можно и без регулярок, чисто поиском подстрок в цикле, теста не много, и вообще парсинг простой.
Это понятно, проято я уверен, есть какие-то библиотеки. Или как-то библиотеку рег. выражений по умному использовать.
Для чего библиотека? Для mql5 есть такая библиотека в кодабазе. В C# вроде есть - using System.Text.RegularExpressions;
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Давно есть идея сделать на основе редактора Visual Studio генератор графического интерфейса для программ на MQL4/5. Чтобы не набивать весь GUI ручками, как в начале 90-х, а рисовать его в редакторе, а полученное конвертировать в код MQL.
Тем более, что сейчас Microsoft выпускает редактор отдельно от студии, естественно, бесплатно. Итак, небольшой пример панельки и код, который порождает редактор. Задача для начала - вытянуть в массивы все кнопки, чекбоксы и эдит. Формат на выходе для начала неважен, главное, как грамотно сделать такой парсинг? У меня в парсинге и регулярных выражения опыта мало, поэтому прошу совета.
И код, который генерит редактор
namespace WindowsFormsApp { partial class Form1 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); this.checkBox1 = new System.Windows.Forms.CheckBox(); this.checkBox2 = new System.Windows.Forms.CheckBox(); this.checkBox3 = new System.Windows.Forms.CheckBox(); this.textBox1 = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(12, 121); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; // // button2 // this.button2.Location = new System.Drawing.Point(93, 121); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(75, 23); this.button2.TabIndex = 1; this.button2.Text = "button2"; this.button2.UseVisualStyleBackColor = true; // // button3 // this.button3.Location = new System.Drawing.Point(174, 121); this.button3.Name = "button3"; this.button3.Size = new System.Drawing.Size(75, 23); this.button3.TabIndex = 2; this.button3.Text = "button3"; this.button3.UseVisualStyleBackColor = true; this.button3.Click += new System.EventHandler(this.button3_Click); // // checkBox1 // this.checkBox1.AutoSize = true; this.checkBox1.Location = new System.Drawing.Point(174, 33); this.checkBox1.Name = "checkBox1"; this.checkBox1.Size = new System.Drawing.Size(80, 17); this.checkBox1.TabIndex = 3; this.checkBox1.Text = "checkBox1"; this.checkBox1.UseVisualStyleBackColor = true; // // checkBox2 // this.checkBox2.AutoSize = true; this.checkBox2.Location = new System.Drawing.Point(174, 56); this.checkBox2.Name = "checkBox2"; this.checkBox2.Size = new System.Drawing.Size(80, 17); this.checkBox2.TabIndex = 4; this.checkBox2.Text = "checkBox2"; this.checkBox2.UseVisualStyleBackColor = true; // // checkBox3 // this.checkBox3.AutoSize = true; this.checkBox3.Location = new System.Drawing.Point(174, 79); this.checkBox3.Name = "checkBox3"; this.checkBox3.Size = new System.Drawing.Size(80, 17); this.checkBox3.TabIndex = 5; this.checkBox3.Text = "checkBox3"; this.checkBox3.UseVisualStyleBackColor = true; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(12, 32); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(156, 20); this.textBox1.TabIndex = 6; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(266, 164); this.Controls.Add(this.textBox1); this.Controls.Add(this.checkBox3); this.Controls.Add(this.checkBox2); this.Controls.Add(this.checkBox1); this.Controls.Add(this.button3); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; private System.Windows.Forms.Button button3; private System.Windows.Forms.CheckBox checkBox1; private System.Windows.Forms.CheckBox checkBox2; private System.Windows.Forms.CheckBox checkBox3; private System.Windows.Forms.TextBox textBox1; } }