Как получить состояние включения/выключения кнопки?
Это следующая тема. Мы ее сегодня рассмотрим.
Добавлю, что элементы этого GUI рисованные, поэтому стандартный метод получения состояния ObjectGetInteger(0, "button1", OBJPROP_STATE); работать не будет.
Также, напомню что события элементов, в том числе кнопок, приходят в API файл.
1. Ориентирование в списке интеллисенс и выбор функции нужного окна.
2. Программное открытие и закрытие окон.
3. Ориентирование в списке интеллисенс и выбор нужного элемента в нужном окне.
4. Ориентирование в списках индивидуальных свойств элементов.
5. Разбор названия функции обертки элемента и окна.
6. Возврат значения параметра выбранного элемента в переменную его типа. Рассмотрим три типа нескольких разных элементов.
7. Установка значений в параметры разных типов элементов. Посмотрим как значения будут появляться в окнах интерфейса этих элементов.
8. Возврат значений параметра одного элемента, изменение и пересылка этого значения в другой элемент. Рассмотрим разные типы элементов и значений, и проведем тест на пересылку между разными типами элементов в разных окнах.
9. Возврат предыдущего значения (_V_LAST). Когда и для каких случаев требуется последнее значение (не путать с текущим).
10. Протестируем устновку состояний ON/OFF/LOCK_ON/LOCK_OFF/LOCK/UNLOCK для различных типов элементов.
11. Попробуем связать и синхронизировать изменения значений элементов разных типов: например поля ввода с кнопками и слайдера. Допустим, чтобы при изменении значения одного элемента (ручного или программного), значение во втором элементе менялось соответствующе.
12. Попробуем программно переустановить границы диапазона слайдера и поля ввода с кнопками через функции обертки. Я не успел это протестировать, но что то подсказывает, что это получится. Впрочем, посмотрим.
13. Попробуем вернуть состояния элементов через функции обертки. Это заложено в функционал, но также, не успел протестировать. Поэтому посмотрим... Результат неизвестен.
14. Получим и установим цвета для текста и оснований элементов. Можно попытаться связать эти цвета с какими то незамысловатыми событиями или границами значений.
15. Расскажу подробнее как ориентироваться и читать новую распечатку файла API.
//------------------------------------------
Желтым цветом выделены темы которые уже рассмотрели.
Сегодня рассмотрим:
11. Синхронизация (связывание) изменения значений элементов разных типов: например поля ввода с кнопками и слайдера. Чтобы при изменении значения одного элемента (ручного или программного), значение во втором элементе менялось соответствующе.
12. Попробуем программно переустановить границы диапазона слайдера и поля ввода с кнопками через функции обертки. Я не успел это протестировать, но что то подсказывает, что это получится. Впрочем, посмотрим.
13. Попробуем вернуть состояния элементов через функции обертки. Это заложено в функционал, но также, не успел протестировать. Поэтому посмотрим... Результат неизвестен.
Наблюдательный человек замечал, что во многооконном графическом интерфейсе разные элементы часто связаны значениями параметров, свойствами и состояниями. Например:
Можно подумать, где то проходит невидимая связь элементов. И она действительно есть. Но невидима она только для стороннего наблюдателя. Для разработчика она вполне очевидна и сегодня рассмотрим ее подробно.
1. Связь элементов имеет две стороны:
Логическую - любая программа имеет парамеры, значения которых прямо или косвенно зависят и переопределяют друг друга.У программ с графическим интерфейсом связь прослеживается визуально.
Техническую - все параметры связываются внутренними программными алгоритмами.
Техническая реализация связей упрощается благодаря наличию графического движка.
Поясню:
В обычном советнике каждый параметр придумывает, называет, хранит и обрабатывает пользователь. Это рутинная работа которую нельзя обойти. Однако в случае использования графического движка, элементы созданные в конструкторе автоматически получают параметр вместе с местом хранения и функцией обработки/возврата. В довесок, пользователь получает их свойства, как тип, диапазон, прошлое значение и т.д. Это значительно упрощает труд. Теоретически, можно использовать готовые параметры элементов GUI как остальные пользовательские параметры, связав их напрямую с торговой логикой. Например лот, трейлинг стоп, тейк профит и другие, брать не из собственных переменных, а у полей настроек отвечающих за их значения.
Некоторые общие выводы:
1. Наличие графического элемента управления в программе =наличие готового программного параметра+его свойств + функции возврата/установки значения.
2. Чем больше элементов управления помещены в окна интерфейсной программы, тем больше параметров потециально участвуют в торговой логике и в вводе/выводе торговой информации.
3. Чем больше настроек и окон - тем выше контроль и ширеполоса вывода рыночных данных (без ущерба автоматизации).
4. Чем выше контроль и шире полоса вывода рыночных данных - тем лучше осведомленность трейдера.
5. Осведомленность помноженная на автоматизацию и контроль=масштабирование трейдерских возможностей.
Добавлю, что часто автоматизацию противопостовляют мануальному контролю. Мол, наличие графического интерфейса означает ручную торговлю. Но это не так. Программный интерфейс не исключает, а расширяет автоматизацию, добавляя к ней "градиент" - открывает три варианта: ручное управление, полуавтоматическую торговлю и автономный режим.
2. Перейдем к технической реализации связывания параметров элементов управления.
Рассмотрим несколько практических примеров:
1. Откроем знакомое окно настроек:
//------------------------------------------------//Open the window "Settings example 1".w_6_Settings_example_1();//------------------------------------------------
2. Откроем файл API и найдем элементы открытого окна внутри функции On_Gui_Event():
Напомню:Все события элементов управления приходят в функцию On_Gui_Event();
В связи с этим, часть связей параметров пропишем внутри этой функциии, а часть вне ее тела.
1. Установим связь между полем с кнопками (S_EDIT) "Spin the value" и слайдером (H_SLIDER) "Roll the value":
Находим поле с кнопками "Spin the value" в файле API.
Прописываем отсылку значения в слайдер "Roll the value".
*(важная заметка. функции элементов и окон нужно перенести из файла UIDATA в низ файла API, чтобы работал интеллисенс. в след.версии они будут печататься там.)
case Settings_example_1___Spin_the_value:
//------------------------------------------------------------------------------------------------------//What to do when the value is set?//------------------------------------------------------------------------------------------------------//Min value: NOT SET | Max value: NOT SET | V_step: 1.7 | Default value: 468.99 | Digits: 3//------------------------------------------------------------------------------------------------------w6_i_p3_H_SLIDER_Roll_the_value((int)value);
Alert("S_EDIT Spin_the_value value entered: ",value);
//------------------------------------------------------------------------------------------------------//Your comment: Send the value to Slider.//------------------------------------------------------------------------------------------------------break;
Результат: меняем значение в поле с кнопками, а слайдер двигается сам.
(*Важно - слайдер может двигаться только в своем диапазоне (в данном случае, от 0 до 100). В случае выхода за пределы, значение не меняется но выводится ошибка в журнал.)
3. Сделаем реверс ролей. Слайдер будет управлять значением в поле ввода:
Находим слайдер "Roll the value" в файле API.
Прописываем отсылку значения в поле с кнопками "Spin the value".
case Settings_example_1___Roll_the_value:
//------------------------------------------------------------------------------------------------------//What to do when the slider's handle is moved?//------------------------------------------------------------------------------------------------------//Min value: 0 | Max value: 100 | V_step: 1 | Default value: 75 | Digits: Integer value//------------------------------------------------------------------------------------------------------w6_d_p5_S_EDIT_Spin_the_value((double)value);
//Alert("H_SLIDER Roll_the_value value entered: ",value);
//------------------------------------------------------------------------------------------------------//Your comment: Send the value to Spin edit.//------------------------------------------------------------------------------------------------------break;
Результат: При перемещении ручки слайдера, поле с кнопками меняет значение синхронно.
4. Пропишем взаимное управление слайдера и поля с кнопками друг другом:
Находим оба элемента в файле API.
Прописываем отсылку значения. Поле с кнопками посылает свое значение слайдеру, слайдер посылает свое значение полю с кнопками.
case Settings_example_1___Spin_the_value://------------------------------------------------------------------------------------------------------//What to do when the value is set?//------------------------------------------------------------------------------------------------------//Min value: NOT SET | Max value: NOT SET | V_step: 1.7 | Default value: 468.99 | Digits: 3//------------------------------------------------------------------------------------------------------w6_i_p3_H_SLIDER_Roll_the_value((int)value);
Alert("S_EDIT Spin_the_value value entered: ",value);
//------------------------------------------------------------------------------------------------------//Your comment: Send the value to Slider.//------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Roll_the_value://------------------------------------------------------------------------------------------------------//What to do when the slider's handle is moved?//------------------------------------------------------------------------------------------------------//Min value: 0 | Max value: 100 | V_step: 1 | Default value: 75 | Digits: Integer value//------------------------------------------------------------------------------------------------------w6_d_p5_S_EDIT_Spin_the_value((double)value);
Alert("H_SLIDER Roll_the_value value entered: ",value);
//------------------------------------------------------------------------------------------------------//Your comment: Send the value to Spin edit.//------------------------------------------------------------------------------------------------------break;
Результат: Слайдер и поля ввода одновременно управляют друг другом.
Это потрясающий материал! Я планирую изучить эту тему более подробно, когда появится время. Я думал, что моя работа расширяет границы графического интерфейса mt4, но ваша работа - это новый уровень.
Это потрясающий материал! Я планирую изучить эту тему более подробно, когда появится время. Я думал, что моя работа расширяет границы графического интерфейса mt4, но ваша работа - это новый уровень.
Посмотрим, можем ли мы применить показанный метод связывания к другим элементам. Например, к чекбоксам.
1. Сделаем так, чтобы верхний чекбокс запирал и отпирал чекбокс стоящий ниже:
Для этого:
1. Найдем чекбокс "Set an option" в файле API.
2. Пропишем вызов функции чекбокса "Set another option" который должен запираться/отпираться.
//===========================================================================================================================//WINDOW :---: Settings example 1 | #: 6 | PFX: w_6// | |//GET/SET :---: int w_6_Settings_example_1(int value = get_i, int Property = 0)//----------------| |------------------------------------------------------------------------------------------------------//ELEMENT :---: TYPE: CHECKBOX | NAME: Set an option | PAR_TYPE: int | INIT STATE: OFF | PFX: w6// | |------------------------------------------------------------------------------------------------------//LOCATION :---: Window's Main Frame //----------------| |------------------------------------------------------------------------------------------------------//G/S PROPERTIES :---: PFX: p7_ | PROPS: NONE// | |------------------------------------------------------------------------------------------------------//G/S ACTIONS :---: p7_ON | p7_OFF | p7_LOCK_ON | p7_LOCK_OFF | p7_GET_STATE |//----------------| |------------------------------------------------------------------------------------------------------// | |//GET/SET CALL :---: int w6_i_p7_CHECKBOX_Set_an_option(int value = none, int Property = 0)//---------------------------------------------------------------------------------------------------------------------------case Settings_example_1___Set_an_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked?//------------------------------------------------------------------------------------------------------switch((int)action)
{
//1. Lock the "Set another option" checkbox in the state ON.
casechecked: w6_i_p7_CHECKBOX_Set_another_option(p7_LOCK_ON);break;
//2. Unlock "Set another option" checkbox in the state ON.
caseunchecked: w6_i_p7_CHECKBOX_Set_another_option(p7_ON);break;
}
//------------------------------------------------------------------------------------------------------//Your comment: //------------------------------------------------------------------------------------------------------break;
Результат: чекбокс запирается и отпирается как задумано:
2. Теперь, сделаем так, чтобы чекбокс запирал и отпирал два нижестоящих чекбокса:
case Settings_example_1___Set_an_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked? //------------------------------------------------------------------------------------------------------switch((int)action)
{
//Lock both checkboxes----
casechecked: w6_i_p7_CHECKBOX_Set_another_option(p7_LOCK_ON);
w6_i_p7_CHECKBOX_And_another_option(p7_LOCK_ON);
break;
//Unlock both checkboxes---
caseunchecked: w6_i_p7_CHECKBOX_Set_another_option(p7_ON);
w6_i_p7_CHECKBOX_And_another_option(p7_ON);
break;
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
Результат: чекбокс запирает и отпирает два нижестоящих чекбокса:
case Settings_example_1___Set_another_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked?//------------------------------------------------------------------------------------------------------switch((int)action)
{
//Locking the element---
casechecked: w6_s_p6_D_LIST_D_LIST_1(p6_LOCK); break;
//Unlocking the element---
caseunchecked: w6_s_p6_D_LIST_D_LIST_1(p6_UNLOCK); break;
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_1___And_another_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked?//------------------------------------------------------------------------------------------------------switch((int)action)
{
//Locking the element---casechecked: w6_s_p6_C_LIST_C_LIST_1(p6_LOCK); break;
//Unlocking the element---caseunchecked: w6_s_p6_C_LIST_C_LIST_1(p6_UNLOCK); break;
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
Результат: чекбоксы запирают выпадающие списки, а сами запираются главным чекбоксом:
5. Следующая задача показана на этой схеме: Необходимо, чтобы переключающиеся радиокнопки посылали свое имя в поля ввода напротив.
Для этого:
Найдем место где прописаны эти радиокнопки в файле API.
Напишем вызов функции нужного поля ввода и пошлем в него имя радиокнопки на событии выбора пользователя.
*Важная заметка: радиокнопки переключаются так как к ним был применен оператор SWITCH в KIB-коде. Поэтому, они имеют один общий параметр на всех и находятся в файле API в одном кейсе.
//===========================================================================================================================//WINDOW :---: Settings example 2 | #: 7 | PFX: w_7// | |//GET/SET :---: int w_7_Settings_example_2(int value = get_i, int Property = 0)//----------------| |------------------------------------------------------------------------------------------------------//GROUP :---: TYPE: R_BUTTONS | NAME: Some options group | PAR_TYPE: string | INIT OPTION: Choose option 1 | PFX: w7// | |------------------------------------------------------------------------------------------------------//LOCATION :---: Window's Main Frame //----------------| |------------------------------------------------------------------------------------------------------//G/S PROPERTIES :---: PFX: p7_ | PROPS: NONE// | |------------------------------------------------------------------------------------------------------//G/S ACTIONS :---: p7_ON | p7_OFF | p7_LOCK_ON | p7_LOCK_OFF | p7_GET_STATE |//----------------| |------------------------------------------------------------------------------------------------------// | |//GET/SET CALL :---: string w7_s_p7_R_BUTTON_Some_options_group(string value = get_s, int Property = 0)//---------------------------------------------------------------------------------------------------------------------------case Settings_example_2___Some_options_group:
//------------------------------------------------------------------------------------------------------//What to do when an option selected?//------------------------------------------------------------------------------------------------------if(selected_option == "Choose option 1"){}
if(selected_option == "Choose option 2"){}
if(selected_option == "Choose option 3"){}
//We send user's choise into the textbox "Comment 3".
w7_s_p4_EDIT_Comment_3(value);//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
Результат: Переключение кнопок вызывает смену текста в поле ввода. *С этим вариантом имеется небольшая техническая проблема. Исправление в след.версии.
case Settings_example_1___C_LIST_1:
//------------------------------------------------------------------------------------------------------//What to do when an option selected?//------------------------------------------------------------------------------------------------------if(selected_option == "Times_New_Roman"){}
if(selected_option == "Arial"){}
if(selected_option == "Tahoma"){}
if(selected_option == "Dali"){}
if(selected_option == "BatangChe"){}
if(selected_option == "Consolas"){}
if(selected_option == "Courier"){}
if(selected_option == "Courier_New"){}
if(selected_option == "DFKai_SB"){}
if(selected_option == "DotumChe"){}
if(selected_option == "FangSong"){}
if(selected_option == "Fixedsys"){}
if(selected_option == "GulimChe"){}
if(selected_option == "GungsuhChe"){}
if(selected_option == "KaiTi"){}
//Send user's choice to textbox "Comment 2" in another window.w8_s_p4_CELL_Leverage__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Roll_the_value:
//------------------------------------------------------------------------------------------------------//What to do when the slider's handle is moved?//------------------------------------------------------------------------------------------------------//Min value: 0 | Max value: 100 | V_step: 1 | Default value: 75 | Digits: Integer value//------------------------------------------------------------------------------------------------------
//Sending the slider's value into the table cell.
w8_s_p4_CELL_Account_balance__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_2___Comment_1:
//------------------------------------------------------------------------------------------------------//What to do when the text is entered?//------------------------------------------------------------------------------------------------------
//Sending textbox's text into the cell
w8_s_p4_CELL_Account_number__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_2___Comment_2:
//------------------------------------------------------------------------------------------------------//What to do when the text is entered?//------------------------------------------------------------------------------------------------------
//Sending textbox's text into the cell
w8_s_p4_CELL_Account_server__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_2___Comment_3:
//------------------------------------------------------------------------------------------------------//What to do when the text is entered?//------------------------------------------------------------------------------------------------------
//Sending textbox's text into the cell
w8_s_p4_CELL_Account_currency__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_2___C_LIST_1:
//------------------------------------------------------------------------------------------------------//What to do when an option selected?//------------------------------------------------------------------------------------------------------if(selected_option == "Times_New_Roman"){}
if(selected_option == "Arial"){}
if(selected_option == "Tahoma"){}
if(selected_option == "Dali"){}
if(selected_option == "BatangChe"){}
if(selected_option == "Consolas"){}
if(selected_option == "Courier"){}
if(selected_option == "Courier_New"){}
if(selected_option == "DFKai_SB"){}
if(selected_option == "DotumChe"){}
if(selected_option == "FangSong"){}
if(selected_option == "Fixedsys"){}
if(selected_option == "GulimChe"){}
if(selected_option == "GungsuhChe"){}
if(selected_option == "KaiTi"){}
//Sending C_LIST value into the cell.
w8_s_p4_CELL_Account_profit__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Как получить состояние включения/выключения кнопки?
Это следующая тема. Мы ее сегодня рассмотрим.
Добавлю, что элементы этого GUI рисованные, поэтому стандартный метод получения состояния ObjectGetInteger(0, "button1", OBJPROP_STATE); работать не будет.
Также, напомню что события элементов, в том числе кнопок, приходят в API файл.
Общий список тем для рассмотрения:
1. Ориентирование в списке интеллисенс и выбор функции нужного окна.
2. Программное открытие и закрытие окон.
3. Ориентирование в списке интеллисенс и выбор нужного элемента в нужном окне.
4. Ориентирование в списках индивидуальных свойств элементов.
5. Разбор названия функции обертки элемента и окна.
6. Возврат значения параметра выбранного элемента в переменную его типа. Рассмотрим три типа нескольких разных элементов.
7. Установка значений в параметры разных типов элементов. Посмотрим как значения будут появляться в окнах интерфейса этих элементов.
8. Возврат значений параметра одного элемента, изменение и пересылка этого значения в другой элемент. Рассмотрим разные типы элементов и значений, и проведем тест на пересылку между разными типами элементов в разных окнах.
9. Возврат предыдущего значения (_V_LAST). Когда и для каких случаев требуется последнее значение (не путать с текущим).
10. Протестируем устновку состояний ON/OFF/LOCK_ON/LOCK_OFF/LOCK/UNLOCK для различных типов элементов.
11. Попробуем связать и синхронизировать изменения значений элементов разных типов: например поля ввода с кнопками и слайдера. Допустим, чтобы при изменении значения одного элемента (ручного или программного), значение во втором элементе менялось соответствующе.
12. Попробуем программно переустановить границы диапазона слайдера и поля ввода с кнопками через функции обертки. Я не успел это протестировать, но что то подсказывает, что это получится. Впрочем, посмотрим.
13. Попробуем вернуть состояния элементов через функции обертки. Это заложено в функционал, но также, не успел протестировать. Поэтому посмотрим... Результат неизвестен.
14. Получим и установим цвета для текста и оснований элементов. Можно попытаться связать эти цвета с какими то незамысловатыми событиями или границами значений.
15. Расскажу подробнее как ориентироваться и читать новую распечатку файла API.
//------------------------------------------
Желтым цветом выделены темы которые уже рассмотрели.
Сегодня рассмотрим:
11. Синхронизация (связывание) изменения значений элементов разных типов: например поля ввода с кнопками и слайдера. Чтобы при изменении значения одного элемента (ручного или программного), значение во втором элементе менялось соответствующе.
12. Попробуем программно переустановить границы диапазона слайдера и поля ввода с кнопками через функции обертки. Я не успел это протестировать, но что то подсказывает, что это получится. Впрочем, посмотрим.
13. Попробуем вернуть состояния элементов через функции обертки. Это заложено в функционал, но также, не успел протестировать. Поэтому посмотрим... Результат неизвестен.
11. Связывание параметров элементов разных типов.
Наблюдательный человек замечал, что во многооконном графическом интерфейсе разные элементы часто связаны значениями параметров, свойствами и состояниями. Например:
//-------------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------------
Можно подумать, где то проходит невидимая связь элементов. И она действительно есть. Но невидима она только для стороннего наблюдателя. Для разработчика она вполне очевидна и сегодня рассмотрим ее подробно.
1. Связь элементов имеет две стороны:
Техническая реализация связей упрощается благодаря наличию графического движка.
Поясню:
В обычном советнике каждый параметр придумывает, называет, хранит и обрабатывает пользователь. Это рутинная работа которую нельзя обойти. Однако в случае использования графического движка, элементы созданные в конструкторе автоматически получают параметр вместе с местом хранения и функцией обработки/возврата. В довесок, пользователь получает их свойства, как тип, диапазон, прошлое значение и т.д. Это значительно упрощает труд. Теоретически, можно использовать готовые параметры элементов GUI как остальные пользовательские параметры, связав их напрямую с торговой логикой. Например лот, трейлинг стоп, тейк профит и другие, брать не из собственных переменных, а у полей настроек отвечающих за их значения.
Некоторые общие выводы:
1. Наличие графического элемента управления в программе = наличие готового программного параметра + его свойств + функции возврата/установки значения.
2. Чем больше элементов управления помещены в окна интерфейсной программы, тем больше параметров потециально участвуют в торговой логике и в вводе/выводе торговой информации.
3. Чем больше настроек и окон - тем выше контроль и шире полоса вывода рыночных данных (без ущерба автоматизации).
4. Чем выше контроль и шире полоса вывода рыночных данных - тем лучше осведомленность трейдера.
5. Осведомленность помноженная на автоматизацию и контроль = масштабирование трейдерских возможностей.
Добавлю, что часто автоматизацию противопостовляют мануальному контролю. Мол, наличие графического интерфейса означает ручную торговлю. Но это не так. Программный интерфейс не исключает, а расширяет автоматизацию, добавляя к ней "градиент" - открывает три варианта: ручное управление, полуавтоматическую торговлю и автономный режим.
Все что нужно трейдеру - выбрать опцию.
Благо, для этого легко создать окно.
//---------------------------------------------------------------------------------------------------
2. Перейдем к технической реализации связывания параметров элементов управления.
Рассмотрим несколько практических примеров:
1. Откроем знакомое окно настроек:
2. Откроем файл API и найдем элементы открытого окна внутри функции On_Gui_Event():
Напомню: Все события элементов управления приходят в функцию On_Gui_Event();
В связи с этим, часть связей параметров пропишем внутри этой функциии, а часть вне ее тела.
1. Установим связь между полем с кнопками (S_EDIT) "Spin the value" и слайдером (H_SLIDER) "Roll the value":
Результат: меняем значение в поле с кнопками, а слайдер двигается сам.
(*Важно - слайдер может двигаться только в своем диапазоне (в данном случае, от 0 до 100). В случае выхода за пределы, значение не меняется но выводится ошибка в журнал.)
//----------------------------------------------------------------------------------------------------------------
3. Сделаем реверс ролей. Слайдер будет управлять значением в поле ввода:
Результат: При перемещении ручки слайдера, поле с кнопками меняет значение синхронно.
//----------------------------------------------------------------------------------------------------------------
4. Пропишем взаимное управление слайдера и поля с кнопками друг другом:
Результат: Слайдер и поля ввода одновременно управляют друг другом.
//---------------------------------------------------------------------------------------------------
Завтра опубликую вторую часть этой темы с другими элементами.
Это потрясающий материал! Я планирую изучить эту тему более подробно, когда появится время. Я думал, что моя работа расширяет границы графического интерфейса mt4, но ваша работа - это новый уровень.
Это потрясающий материал! Я планирую изучить эту тему более подробно, когда появится время. Я думал, что моя работа расширяет границы графического интерфейса mt4, но ваша работа - это новый уровень.
Большое спасибо за добрые слова!
11. Связывание параметров элементов разных типов.
Продолжение темы.
Часть 2.
//--------------------------------------------------------------------------------------------------------------------------------
Посмотрим, можем ли мы применить показанный метод связывания к другим элементам. Например, к чекбоксам.
1. Сделаем так, чтобы верхний чекбокс запирал и отпирал чекбокс стоящий ниже:
Для этого:
1. Найдем чекбокс "Set an option" в файле API.
2. Пропишем вызов функции чекбокса "Set another option" который должен запираться/отпираться.
Результат: чекбокс запирается и отпирается как задумано:
//--------------------------------------------------------------------------------------------------------------------------------
2. Теперь, сделаем так, чтобы чекбокс запирал и отпирал два нижестоящих чекбокса:
Результат: чекбокс запирает и отпирает два нижестоящих чекбокса:
Так это происходило в динамике:
//--------------------------------------------------------------------------------------------------------------------------------
3. Теперь решим задачу изображенную на схеме ниже: чекбоксы должны запирать и отпирать выпадающие списки напротив них.
Для этого:
Результат: чекбоксы запирают выпадающие списки, а сами запираются главным чекбоксом:
//--------------------------------------------------------------------------------------------------------------------------------
4. Перейдем к решению следующей задачи: выпадающие списки должны траслировать выбранное пользователем значение в поле другого окна.
Для этого:
*Результат: оба выпадающих списка успешно посылают свои значения в поля ввода в противоположном окне:
//--------------------------------------------------------------------------------------------------------------------------------
5. Следующая задача показана на этой схеме: Необходимо, чтобы переключающиеся радиокнопки посылали свое имя в поля ввода напротив.
Для этого:
*Важная заметка: радиокнопки переключаются так как к ним был применен оператор SWITCH в KIB-коде. Поэтому, они имеют один общий параметр на всех и находятся в файле API в одном кейсе.
Результат: Переключение кнопок вызывает смену текста в поле ввода. *С этим вариантом имеется небольшая техническая проблема. Исправление в след.версии.
Вторая часть завершена.
В третьей части поработаем с таблицей.
Заключительная часть темы связывания параметров.
Передадим значения параметров элементов ячейкам таблицы.
Схема:
Решение:
Результат: значения благополучно занимают места в выбранных ячейках таблицы.
Как видно из приведенных примеров, разработано простое и удобное решение. Надеюсь, людям пригодится.
На этом тема связывания параметров элементов завершена.
Осталось рассмотреть следующие темы:
12. Программное получение/установка границ значений слайдера и поля с кнопками (_V_MIN, _V_MAX, _V_STEP, _DIGITS).
13. Запрос состояния элементов (_GET_STATE).
14. Связывание цвета текста и рамок с расставленными границами значений.
15. Ориентирование в файле API.
Добавлю тему:
16. Реализация программной логики появления окон сообщений и предупреждений.