Обсуждение статьи "Графические интерфейсы V: Элемент "Комбинированный список" (Глава 3)"

 

Опубликована статья Графические интерфейсы V: Элемент "Комбинированный список" (Глава 3):

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

Комбинированный список или комбо-бокс (combobox) это составной элемент управления, основными частями которого являются (1) кнопка и (2) список. Список в этом случае является выпадающим элементом и вызывается посредством нажатия на кнопку. После выбора пункта из списка его текст отображается в кнопке, а список скрывается. Когда в программе есть множество многовариантных параметров, то комбо-боксы будут весьма кстати, так как позволяют создать компактный графический интерфейс.

В списке ниже перечислены все объекты-примитивы, из которых будет собираться элемент «Комбо-бокс».

  1. Фон элемента
  2. Надпись (описание элемента)
  3. Кнопка
  4. Признак выпадающего списка

Рис. 1. Составные части элемента «Комбо-бокс».

Рис. 1. Составные части элемента «Комбо-бокс».

Автор: Anatoli Kazharski

 

Классно, пользительные вещи вытворяешь ;)

Анатоль, мне кажется есть некие доработки, которые можно было бы внести. Например, когда курсор находится над любым из списков, рука сама тянется к колёсику для прокрутки списка, но, увы, прокручиваем график. А ведь у тебя есть отслеживание прокрутки графика. Может лучше не убирать список, а именно его прокручивать, временно отключив прокрутку графика, как считаешь?

И ещё: так и не понял, есть ли возможность не выводить описание списка, которое слева от кнопки списка находится? Оно не всегда нужно.

 

Ну или вообще кардинально - если главное окно программы в фокусе, то отрубить прокрутку графика, а там уже по месту определять, нужно что-либо прокручивать от колёсика, или не реагировать на него...

Например, в 3D Studio MAX, например, есть реакция на на зажатую левую кнопку мыши и её перемещение вверх-вниз над формой инкремента/декремента какого-либо значения. Щёлкнул по стрелке вверх или вниз и, не отпуская кнопки ведёшь мышой вверх или вниз, а значение в окошке формы либо увеличивается, либо уменьшается в зависимости от направления движения мыши.

 
Artyom Trishkin:

Анатоль, мне кажется есть некие доработки, которые можно было бы внести. Например, когда курсор находится над любым из списков, рука сама тянется к колёсику для прокрутки списка, но, увы, прокручиваем график. А ведь у тебя есть отслеживание прокрутки графика. Может лучше не убирать список, а именно его прокручивать, временно отключив прокрутку графика, как считаешь?

Сейчас, насколько я знаю, средствами MQL можно отследить, нажата ли средняя кнопка мыши. Но отследить прокручивается ли она, пока нельзя. 

И ещё: так и не понял, есть ли возможность не выводить описание списка, которое слева от кнопки списка находится? Оно не всегда нужно. 

Да, это можно. При создании элемента в метод CComboBox::LabelText() передать пустую строку ("").

Например, в 3D Studio MAX, например, есть реакция на на зажатую левую кнопку мыши и её перемещение вверх-вниз над формой инкремента/декремента какого-либо значения. Щёлкнул по стрелке вверх или вниз и, не отпуская кнопки ведёшь мышой вверх или вниз, а значение в окошке формы либо увеличивается, либо уменьшается в зависимости от направления движения мыши.

В следующей статье будет представлен ряд элементов управления, в числе которых есть элемент "Поле ввода". Там в текущей реализации есть ускоренная прокрутка. То есть зажатие левой кнопки мыши над кнопками инкремента/декремента и удержание курсора в области этих кнопок приводит к ускоренной перемотке значений.

 
//+------------------------------------------------------------------+

//|ComboBox.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "Element.mqh"
#include "Window.mqh"
#include "ListView.mqh"
//+------------------------------------------------------------------+
//| Êëàññ äëÿ ñîçäàíèÿ êîìáèíèðîâàííîãî ñïèñêà                      |
//+------------------------------------------------------------------+
class CComboBox : public CElement
  {
private:
   //--- Óêàçàòåëü íà ôîðìó, ê êîòîðîé ýëåìåíò ïðèñîåäèí¸í
   CWim_buttonndow          *m_wnd;
   //--- Îáúåêòû äëÿ ñîçäàíèÿ êîìáî-áîêñà
   CRectLabel        m_area;
По какой причине комментарии больше не на английском?
 
Amir Yacoby:
По какой причине комментарии больше не на английском?

У меня то же самое, и я думаю, что в настоящее время у них есть две причины.


1. Некоторые проблемы, которые все еще необходимо исправить (особенно в MT4 !)
2. В настоящее время нет человека, который мог бы перевести их на английский. Для меня также непонятно, почему основные комментарии не на английском. Но пока функции объявлены на английском, и большинство примеров, как выше, доступны на английском, это не имеет значения.


 
MetaQuotes Software Corp.:

Опубликована новая статья Graphical Interfaces V: The Combobox Control (Chapter 3):

Автор: Анатолий Кажарский

Хорошая работа со статьями. Я наслаждаюсь следующей серией статей. Не могли бы вы проверить SplitButton.mqh строку 90? Я получаю ошибку

return - cannot convert from const pointer to nonconst pointer.

Я удалил "const", чтобы все заработало.
 
Kaleem Haider:

return - невозможно преобразовать указатель const в указатель nonconst.

Я удалил "const", чтобы все заработало.

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

 

[WIN7 64bits - MetaTrader5 build 1472]

Странное поведение SplitString с ComboBox.

Я создал combobox для контроля sl и tp для ордера, но когда я попытался получить выбранный элемент, возникла проблема.
Когда пользователь нажимает на кнопки sell или buy, программа получает выбранный элемент из combobox и рассчитывает sl и tp для ордера.
Когда я запускаю его в режиме отладки (F5), проблемы нет. Но когда я перетаскиваю его из списка советников на график, проблема появляется.
Похоже, что библиотека EasyAndFast переопределяет каким-то образом функции SplitString, или PrintFormat, или StringToDouble, или что-то в этом роде. Но я не уверен.
Вот мой пример:

//+------------------------------------------------------------------+
//| Создает комбобокс TP:SL|
//+------------------------------------------------------------------+
bool CProgram::CreateTPSLComboBox(const int x_gap, const int y_gap, const string text) {
  // Общее количество элементов в списке
  #define ITEMS_TOTAL1 4

  // Передайте объект панели
  _tpslCombobox.WindowPointer(_mainWindow);
  
  // Прикрепите к первой вкладке
  _mainTabs.AddToElementsArray(0, _tpslCombobox);  
  
  // Координаты
  int x = _mainWindow.X() + x_gap;
  int y = _mainWindow.Y() + y_gap;
  
  // Массив значений элементов в представлении списка
  string items_text[ITEMS_TOTAL1] = {"2:4", "2:3", "3:4", "0:0"};
  
  // Установите свойства перед созданием
  _tpslCombobox.XSize(90);
  _tpslCombobox.YSize(18);
  _tpslCombobox.LabelText(text);
  _tpslCombobox.ButtonXSize(45);
  _tpslCombobox.ItemsTotal(ITEMS_TOTAL1);
  _tpslCombobox.VisibleItemsTotal(4);
  _tpslCombobox.AreaColor(clrWhite);

  // Храните значения элементов в представлении списка combobox
  for(int i = 0; i < ITEMS_TOTAL1; i++)
    _tpslCombobox.ValueToList(i, items_text[i]);
  
  // Получите указатель вида списка
  CListView *lv = _tpslCombobox.GetListViewPointer();
  
  // Установите свойства представления списка
  lv.LightsHover(true);
  lv.SelectedItemByIndex(lv.SelectedItemIndex() == WRONG_VALUE ? 0 : lv.SelectedItemIndex());
  
  // Создайте элемент управления
  if(!_tpslCombobox.CreateComboBox(m_chart_id, m_subwin, x, y))
    return(false);

  // Добавьте объект в общий массив групп объектов
  CWndContainer::AddToElementsArray(0, _tpslCombobox);
  return(true);
}

...

//+------------------------------------------------------------------+
//| Функция продажи |
//+------------------------------------------------------------------+
void CProgram::Sell() {
  string sep = ":";
  ushort usep;
  usep = StringGetCharacter(sep, 0);
  string s[];
  double tp = 0.0;
  double sl = 0.0;
  if(StringSplit(_tpslCombobox.ButtonText(), usep, s) == 2) {
    PrintFormat("s01: %s - s02: %s", s[0], s[1]); // output: s01: 2 - s02: 4 
    tp = StringToDouble(s[0]);
    sl = StringToDouble(s[1]);
  }
  PrintFormat("tp: %.2f - sl: %.2f", tp, sl); // output: tp: 2.00 - sl: 2.00
...

Вывод: "tp:2.00 - sl: 2.00" должно быть "tp:2.00 - sl: 4.00".
Но опять же, проблема возникает только тогда, когда я перетаскиваю на график. Когда я запускаю его в режиме отладки, все в порядке.
Что посоветуете?

------
UPDATE:
Похоже, что проблема в MetaTrader 5, а не конкретно в библиотеке EasyAndFast.
Вот тест:
//+------------------------------------------------------------------+
//|тест.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Функция запуска программы сценария|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    string sep = ":";
    ushort usep;
    usep = StringGetCharacter(sep, 0);
    string s[];
    double tp = 0.0;
    double sl = 0.0;
    if(StringSplit("2:4", usep, s) == 2) {
      tp = StringToDouble(s[0]);
      sl = StringToDouble(s[1]);
    }
    PrintFormat("tp: %.2f - sl: %.2f", tp, sl);
  }
//+------------------------------------------------------------------+
Вывод: "tp: 2.00 - sl: 4.00" в режиме отладки (F5).
Вывод: "tp: 2.00 - sl: 2.00" при перетаскивании скрипта на график.

Если кто-то еще подтвердит это, я сообщу в ServiceDesk.
Спасибо.

[WIN7 64bits - MetaTrader5 build 1472]
 

Скопировал фсе в mql4 папку, советник TestLibrary серый и не открывается. Пишет в экспертах "cannot open file".

Работает ли в режиме теста? Есть ли смысл разбираться, почему не запускается, так как очень важно чтобы работало в режиме тестирования

 
Evgeniy Scherbina:

Скопировал фсе в mql4 папку, советник TestLibrary серый и не открывается. Пишет в экспертах "cannot open file".

Работает ли в режиме теста? Есть ли смысл разбираться, почему не запускается, так как очень важно чтобы работало в режиме тестирования

Версия библиотеки для MT4 больше не поддерживается мной.

Последнюю версию для MT5 на текущий момент можно скачать в этой статье: Графические интерфейсы X: Элемент "Время", элемент "Список из чекбоксов" и сортировка таблицы (build 6)

На текущей стадии разработки тесты в тестере не проводились и ещё долго не будут проводиться.