Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Планируешь заказать программу? Узнай, как получить желаемый результат
Alexey Volchanskiy
16683
Alexey Volchanskiy 2016.09.25 19:41 

Давно есть идея сделать на основе редактора 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
16683
Alexey Volchanskiy 2016.09.25 19:42  
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
16683
Alexey Volchanskiy 2016.09.25 21:04  
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
9819
Maxim Kuznetsov 2016.09.25 21:07  
Alexey Volchanskiy:

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

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

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

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

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


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

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

Alexey Volchanskiy
16683
Alexey Volchanskiy 2016.09.26 00:58  
coderex:

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

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

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

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

Dmitry Fedoseev
42921
Dmitry Fedoseev 2016.09.26 03:20  
            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
16683
Alexey Volchanskiy 2016.09.26 07:44  
Dmitry Fedoseev:

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

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

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

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