Скачать MetaTrader 5

Как лучше распарсить такие данные?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Volchanskiy
24702
Alexey Volchanskiy  

Давно есть идея сделать на основе редактора Visual Studio генератор графического интерфейса для программ на MQL4/5. Чтобы не набивать весь GUI ручками, как в начале 90-х, а рисовать его в редакторе, а полученное конвертировать в код MQL.

Тем более, что сейчас Microsoft выпускает редактор отдельно от студии, естественно, бесплатно. Итак, небольшой пример панельки и код, который порождает редактор. Задача для начала - вытянуть в массивы все кнопки, чекбоксы и эдит. Формат на выходе для начала неважен, главное, как грамотно сделать такой парсинг? У меня в парсинге и регулярных выражения опыта мало, поэтому прошу совета.

f1

И код, который генерит редактор

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;
    }
}

Alexey Volchanskiy
24702
Alexey Volchanskiy  
Alexey Volchanskiy:


Редактор генерит комментарии перед каждым блоком с параметрами элемента, можно от этого отталкиваться

            // 
            // 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;
Alexey Volchanskiy
24702
Alexey Volchanskiy  
Alexey Volchanskiy:

Почему-то в скайпе, а не здесь, посоветовали обратить внимание на редактор https://glade.gnome.org , который генерит в формате XML, парсить который проще и есть стандартные тулзы. Ок, я не маньяк и не фанат VS, рассмотрю и этот вариант.

PS: Пишите сюда, зачем в скайп или личку-то? 

Glade - A User Interface Designer
  • glade.gnome.org
Glade is a RAD tool to enable quick & easy development of user interfaces for the GTK+ toolkit and the GNOME desktop environment. The user interfaces designed in Glade are saved as XML, and by using the GtkBuilder GTK+ object these can be loaded by applications dynamically as needed. By using GtkBuilder, Glade XML files can be used in...
Maxim Kuznetsov
13608
Maxim Kuznetsov  
Alexey Volchanskiy:

Почему-то в скайпе, а не здесь, посоветовали обратить внимание на редактор https://glade.gnome.org , который генерит в формате XML, парсить который проще и есть стандартные тулзы. Ок, я не маньяк и не фанат VS, рассмотрю и этот вариант.

PS: Пишите сюда, зачем в скайп или личку-то? 

да я просто потерял эту ветку.. :-) Пока с собакой гулял, то да сё..пришёл нажал F5 и (спасибо веб-мастерам) проще написать в скайп или в личку..
coderex
437
coderex  
Alexey Volchanskiy:

Давно есть идея сделать на основе редактора Visual Studio генератор графического интерфейса для программ на MQL4/5. Чтобы не набивать весь GUI ручками, как в начале 90-х, а рисовать его в редакторе, а полученное конвертировать в код MQL.

Тем более, что сейчас Microsoft выпускает редактор отдельно от студии, естественно, бесплатно. Итак, небольшой пример панельки и код, который порождает редактор. Задача для начала - вытянуть в массивы все кнопки, чекбоксы и эдит. Формат на выходе для начала неважен, главное, как грамотно сделать такой парсинг? У меня в парсинге и регулярных выражения опыта мало, поэтому прошу совета.


И код, который генерит редактор

Зачем редактор? Я пользуюсь стандартной библиотекой + написал несколько классов - меню, таблицы и т.д. Раз сделал каркас и потом для разных роботов его использую, правда приходится руками классы фреймов в каркасе дополнять/убирать поля, дополнять пункты меню и т.д., но после генерации предложенным тобой вариантом, все равно придется лезть в код и писать обработчики тех же кнопок и полей...

Alexey Volchanskiy
24702
Alexey Volchanskiy  
coderex:

Зачем редактор? Я пользуюсь стандартной библиотекой + написал несколько классов - меню, таблицы и т.д. Раз сделал каркас и потом для разных роботов его использую, правда приходится руками классы фреймов в каркасе дополнять/убирать поля, дополнять пункты меню и т.д., но после генерации предложенным тобой вариантом, все равно придется лезть в код и писать обработчики тех же кнопок и полей...

можно автоматизировать и обработчики

да хотя бы дизайн заценить визуально, и то будет хорошо

руками надоело 

Dmitry Fedoseev
47905
Dmitry Fedoseev  
            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.

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

Alexey Volchanskiy
24702
Alexey Volchanskiy  
Dmitry Fedoseev:

Строка начинается с "this.", содержит  " = new". Между "this." и "= new" нет точки. Получим имена.

Потом для каждого имени формировать строки начинающиеся с "this.[name].Location" и с  "this.[name].Size", искать их и смотреть, то что в конце в скобках. Еще найти строку начинающуюся с this.ClientSize.

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

Это понятно, проято я уверен, есть какие-то библиотеки. Или как-то библиотеку рег. выражений по умному использовать.
Dmitry Fedoseev
47905
Dmitry Fedoseev  
Alexey Volchanskiy:
Это понятно, проято я уверен, есть какие-то библиотеки. Или как-то библиотеку рег. выражений по умному использовать.
Для чего библиотека? Для mql5 есть такая библиотека в кодабазе. В C# вроде есть - using System.Text.RegularExpressions;  
Alexey Volchanskiy
24702
Alexey Volchanskiy  
Dmitry Fedoseev:
Для чего библиотека? Для mql5 есть такая библиотека в кодабазе. В C# вроде есть - using System.Text.RegularExpressions;  
Ее и имел в виду, для шарпа знаю, просто опыта работы с рег. выр. маловато. Ничего, разберусь )
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий