Обсуждение статьи "Графические интерфейсы X: Обновления для библиотеки Easy And Fast (build 2)" - страница 3

 
Alexey Oreshkin:
А когда ждать обновление ?

Если нужно срочно, то можете сами добавить следующие изменения:

1. В файл Defines.mqh добавьте новый идентификатор:

#define ON_CLICK_TAB               (26) // Переключение вкладки

//--- 

2. В классы CTabs и CIconTabs (файлы Tabs.mqh и IconTabs.mqh) в метод ShowTabElements() нужно добавить строчку, как показано в листинге ниже:

//+------------------------------------------------------------------+
//| Показывает элементы только выделенной вкладки                    |
//+------------------------------------------------------------------+
void CTabs::ShowTabElements(void)
  {
//--- Выйти, если вкладки скрыты
   if(!CElement::IsVisible())
      return;
//--- Проверка индекса выделенной вкладки
   CheckTabIndex();
//---
   for(int i=0; i<m_tabs_total; i++)
     {
      //--- Получим количество элементов присоединённых к вкладке
      int tab_elements_total=::ArraySize(m_tab[i].elements);
      //--- Если выделена эта вкладка
      if(i==m_selected_tab)
        {
         //--- Показать элементы вкладки
         for(int j=0; j<tab_elements_total; j++)
            m_tab[i].elements[j].Show();
        }
      //--- Скрыть элементы неактивных вкладок
      else
        {
         for(int j=0; j<tab_elements_total; j++)
            m_tab[i].elements[j].Hide();
        }
     }
//--- Отправить сообщение об этом
   ::EventChartCustom(m_chart_id,ON_CLICK_TAB,CElement::Id(),m_selected_tab,"");
  }

//---

3. Теперь событие с идентификатором ON_CLICK_TAB можно принимать в обработчике пользовательского класса. 

Пример: 

//+------------------------------------------------------------------+
//| Обработчик событий графика                                       |
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Событие нажатия на вкладке
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_TAB)
     {
      //--- Если нажали на радио-кнопку
      if(m_tabs.SelectedTab()==0)
        {
         switch(m_radio_buttons1.SelectedButtonIndex()){
            case  0:
               m_canvas_table1.Show();
               m_canvas_table11.Hide();
               m_canvas_table111.Hide();
               ModifyCanvasTable1(0);
            break;
            case  1:
               m_canvas_table1.Hide();
               m_canvas_table11.Show();
               m_canvas_table111.Hide();
               ModifyCanvasTable1(1);                
            break;
            case  2:
               m_canvas_table1.Hide();
               m_canvas_table11.Hide();
               m_canvas_table111.Show();
               ModifyCanvasTable1(2);               
            break;                        
         }       
         return;
        }
      return;
     }
  }
 
Благодарю, работает.
Нашёл ещё одну ошибку - запускаем индюк, отодвигаем панель и начинаем жать радиокнопки. Когда отрисовывается таблица, вначале она начинает рисоваться с левого края, а потом как бы подтягивается к нужным координатам.
 
Alexey Oreshkin:
Благодарю, работает.
Нашёл ещё одну ошибку - запускаем индюк, отодвигаем панель и начинаем жать радиокнопки. Когда отрисовывается таблица, вначале она начинает рисоваться с левого края, а потом как бы подтягивается к нужным координатам.

Да, есть такое. На примере таблиц этого типа, добавьте в метод CCanvasTable::Show() в файле CanvasTable.mqh строку, как показано ниже:

//+------------------------------------------------------------------+
//| Показывает элемент                                               |
//+------------------------------------------------------------------+
void CCanvasTable::Show(void)
  {
//--- Выйти, если элемент уже видим
   if(CElement::IsVisible())
      return;
//--- Сделать видимыми все объекты
   m_area.Timeframes(OBJ_ALL_PERIODS);
   m_canvas.Timeframes(OBJ_ALL_PERIODS);
   m_scrollv.Show();
   m_scrollh.Show();
//--- Состояние видимости
   CElement::IsVisible(true);
//--- Перемещение элемента
   Moving(m_wnd.X(),m_wnd.Y());
  }

 //---

Если такая проблема будет с другими элементами добавляйте в их метод Show() такую же строчку. В следующем обновлении во всех классах элементов будет это исправление.

 

Здравствуйте,
Я так понимаю, что в этой статье последнее обновление для mql4 EasyAndFastGUI?
Можете, пожалуйста, подсказать как исправить предупреждение "expresion not boolen".


 
Nauris Zukas #:

Здравствуйте,
Я так понимаю, что в этой статье последнее обновление для mql4 EasyAndFastGUI?
Можете, пожалуйста, подсказать как исправить предупреждение "expresion not boolen".


m_show_flags какой имеет тип? Если не bool, то так: return((bool)m_show_flags);

 
Artyom Trishkin #:

m_show_flags какой имеет тип? Если не bool, то так: return((bool)m_show_flags);

uint m_show_flags. Если это поменять на bool то предупреждение пропадёт, но из за того что я не уверен что это где-то по цепочке не повредит какой-то функций, то я сделаю как Вы посоветовали. Спасибо.

 
Nauris Zukas #:

uint m_show_flags. Если это поменять на bool то предупреждение пропадёт, но из за того что я не уверен что это где-то по цепочке не повредит какой-то функций, то я сделаю как Вы посоветовали. Спасибо.

На bool менять нельзя - ведь это же набор флагов. Соответственно, значение переменной может быть больше 1. Если её значение равно нулю, то это равносильно значению false  переменной с типом bool. Поэтому при приведении результата возврата к типу bool, любое значение переменной, отличной от нуля даст значение true. Соответственно, только 0 даст значение false.

А так как метод (судя по его названию) возвращает флаг видимости объекта, то при любом значении, отличном от нуля, метод вернёт флаг того, что объект виден на каком-то таймфрейме. Только при значении переменной, равном нулю, мы знаем точно, что объект скрыт на всех таймфреймах.

Я могу ошибаться о назначении этого метода. Но предположения свои взял из того, что это вот этот набор флагов:

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Видимость объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Видимость объектов
  • www.mql5.com
Видимость объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

И, кстати, исходя из вышеозвученного, Вы можете написать метод так:

bool ShowFlags(void) const { return m_show_flags!=OBJ_NO_PERIODS; }

Тогда не придётся преобразовывать возвращаемый тип не булевой переменной к значению с типом bool - тут и так возвращается результат проверки, а это и есть bool.

Но выбирать Вам - разницы особой нету.

 
Artyom Trishkin #:

И, кстати, исходя из вышеозвученного, Вы можете написать метод так:

Тогда не придётся преобразовывать возвращаемый тип не булевой переменной к значению с типом bool - тут и так возвращается результат проверки, а это и есть bool.

Но выбирать Вам - разницы особой нету.

Артём, на мой взгляд лучше поменять тип функции на uint

uint ShowFlags(void) const { return m_show_flags; }

Тогда по значению полученному от этой функции можно будет проверить видимость объекта на конкретном ТФ. Ведь это не конкретное значение, а набор флагов…

 
Alexey Viktorov #:

Артём, на мой взгляд лучше поменять тип функции на uint

Тогда по значению полученному от этой функции можно будет проверить видимость объекта на конкретном ТФ. Ведь это не конкретное значение, а набор флагов…

Мы не знаем смысла этого метода. Скорее всего это именно флаг - виден/не виден. А выковыривать из результата нужные флаги - усложнение жизни пользователя библиотеки.