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

 
Alexey Oreshkin:

Может быть, свой код удалил и сейчас уже не могу сказать точно.

...

Графические интерфейсы I: Подготовка структуры библиотеки (Глава 1) >>> 

Обратите внимание, что перед функциями в листинге кода выше стоят двойные двоеточия. На самом деле их можно не ставить и все будет работать правильно. Но в программировании считается хорошим тоном ставить двойные двоеточия перед системными функциями языка. Это придает однозначность в том, что функция является системной.

Alexey Oreshkin:

Ошибка возникает когда закрываю крестиком созданное индикатором окно. Немного изменил файл MainWindow.mqh из примера расположенного здесь: Indicators\Article 10\SeparateWindow

Ошибку исключу дополнительной проверкой. Исправление будет в следующем обновлении. Воспроизвести не удалось. Какие были изменения в файле MainWindow.mqh ?

Alexey Oreshkin:

и ещё не понял как можно удалить строку в созданной таблице ? 

Пока никак. Будет в следующих версиях библиотеки. Можно будет добавлять и удалять строки в таблицах и списках.

 

Видать я что то лишнее удалил. Прикладываю файлы.

п.с. А могу ли я в таблице каждому столбу задать свою ширину ?  

Файлы:
 
Alexey Oreshkin:

Видать я что то лишнее удалил. Прикладываю файлы.

п.с. А могу ли я в таблице каждому столбу задать свою ширину ?  

Причина была в том, что Вы два раза добавили объект одной и той же таблицы в базу элементов. Сначала в методе создания таблицы CProgram::CreateTable(), где это и нужно делать, а затем в Вашем методе CProgram::ModifyTable(). Удалите строку выделенную красным в листинге кода ниже.

//+------------------------------------------------------------------+
//| Создаёт таблицу     Symbol                                       |
//+------------------------------------------------------------------+
bool CProgram::ModifyTable(int id)
  {
   int r=1;
   switch(id){
      case  0:         
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL;r++)
            m_table.SetValue(c,r,"rb1 "+(string)c+" "+(string)r);                                  
      break;
      
      case 1:
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL-5;r++)
            m_table.SetValue(c,r,"rb2 "+(string)c+" "+(string)r);  
      break;
      case 3:
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL-10;r++)
            m_table.SetValue(c,r,"rb3 "+(string)c+" "+(string)r);                                      
      break;
   }
      for(int c=0;c<COLUMNS2_TOTAL;c++)
      for(int rr=r;rr<ROWS2_TOTAL;rr++) m_table.SetValue(c,rr,"");

//--- Обновить таблицу для отображения изменений
   m_table.UpdateTable();
//--- Добавим объект в общий массив групп объектов
   CWndContainer::AddToElementsArray(0,m_table);
   return(true);
  }  

//---

При удалении программы с графика или при её перезагрузке, например, при смене таймфрейма или символа, осуществлялась повторная попытка удаления элемента, который уже был до этого удалён. Массивы при удалении объекта таблицы освобождались и это приводило к ошибке при повторном вызове метода удаления элемента. 

Alexey Oreshkin:

п.с. А могу ли я в таблице каждому столбу задать свою ширину ?  

 В этом типе таблиц (CTable) нет. Задать ширину столбцов можно пока только в таблицах типа CCanvasTable. Но в этом типе таблиц на текущий момент есть масса других ограничений, которые скорее всего Вас не устроят. Возможности таблиц типа CCanvasTable будут расширяться.

 
Anatoli Kazharski:

Причина была в том, что Вы два раза добавили объект одной и той же таблицы в базу элементов. Сначала в методе создания таблицы CProgram::CreateTable(), где это и нужно делать, а затем в Вашем методе CProgram::ModifyTable(). Удалите строку выделенную красным в листинге кода ниже.

А да, это глупо, не заметил т.к. свой метод ModifyTable сделал копипастом с CreateTable
Попробую таблицу CCanvasTable, может и подойдёт.
Благодарю!

 

п.с: Если я не могу удалить строки в таблице, то я могу удалить всю таблицу и создать её заново, ту, которая мне необходима. Правда методов удаления я тоже не нашёл. Я пока не могу удалить таблицу ? 

п.с2: Раз я не могу создать у таблицы столбы разной ширины, то логично расположить две таблицы рядом, но как я понял это не могу сделать потому что таблица автоматом расширяется до правой границы. Есть метод AutoXResizeMode, но он ещё пока не работает? при его установке в false изменений не происходит.

 
Alexey Oreshkin:

...

п.с: Если я не могу удалить строки в таблице, то я могу удалить всю таблицу и создать её заново, ту, которая мне необходима. Правда методов удаления я тоже не нашёл. Я пока не могу удалить таблицу ? 

Сейчас все элементы графического интерфейса создаются сразу и потом можно управлять их видимостью с помощью методов Show() и Hide(). 

Alexey Oreshkin: 

п.с2: Раз я не могу создать у таблицы столбы разной ширины, то логично расположить две таблицы рядом, но как я понял это не могу сделать потому что таблица автоматом расширяется до правой границы. Есть метод AutoXResizeMode, но он ещё пока не работает? при его установке в false изменений не происходит.

Воспользуйтесь методом XSize() для настройки ширины таблицы.

Пример: 

m_table.XSize(300);
 

Благодарю за ответы.

Есть ещё пару вопросов:

1.Если данные не влазят в ячейку таблицы, то планируется ли в будущем сделать либо всплывающую подсказку либо бегущую строку в этой ячейке ? 

2.Есть ли возможность  запретить горизонтальную прокрутку у некоторых таблиц?

 

п.с:
 
Ошибка возникает когда создаём таблицу с 5 столбиками ,а пытаемся отобразить больше. Вариант глупый, согласен, но чек какой то надо. Особенно если в будущем таблицы смогут стать динамическими.

 

п.с2: Методы Show и Hide отлично работают и позволяют не изменять таблицу на лету а показывать ту которая необходима. На каждой вкладке создал необходимые таблицы которые привязаны к радиокнопкам и при их активации нужная показывается, те что нет -скрываются. Тут всё работает. Но почему то я немогу скрыть неактуальные таблицы сразу после их создания. Из-за этого, думаю, не работают нормально полосы прокрутки, но как только хоть раз нажмёш на радиокнопку и всё ненужное скроется - всё начинает работать отлично.

 
Alexey Oreshkin:

1.Если данные не влазят в ячейку таблицы, то планируется ли в будущем сделать либо всплывающую подсказку либо бегущую строку в этой ячейке ? 

Добавил в список будущих обновлений. Сделаю режим всплывающих подсказок в таблицах. 

Alexey Oreshkin:

2.Есть ли возможность  запретить горизонтальную прокрутку у некоторых таблиц?

Полосы прокрутки появляются тогда, когда видимая часть таблицы меньше общей части.

Alexey Oreshkin:

Ошибка возникает когда создаём таблицу с 5 столбиками ,а пытаемся отобразить больше. Вариант глупый, согласен, но чек какой то надо. Особенно если в будущем таблицы смогут стать динамическими.

 Внёс исправления. Будет доступно в следующем обновлении.

Alexey Oreshkin:

п.с2: Методы Show и Hide отлично работают и позволяют не изменять таблицу на лету а показывать ту которая необходима. На каждой вкладке создал необходимые таблицы которые привязаны к радиокнопкам и при их активации нужная показывается, те что нет -скрываются. Тут всё работает. Но почему то я немогу скрыть неактуальные таблицы сразу после их создания. Из-за этого, думаю, не работают нормально полосы прокрутки, но как только хоть раз нажмёш на радиокнопку и всё ненужное скроется - всё начинает работать отлично.

Скрывайте их после того, как обновятся элементы вкладок:

//--- Отобразить элементы активной вкладки
   m_tabs.ShowTabElements();
//--- Скрываем таблицы
...

Если не получится, то пришлите свой код, я посмотрю.

 
Что то не так делаю походу или проблема в другом, но с полосами прокрутки какие то проблемы у меня.
При старте они почти не работают, но если радиокнопками их обновить то всё начинает работать норм. При переходе на новую вкладку та же беда, пока не нажму на радиокнопку.
Отправил архив в ЛС.
 
Alexey Oreshkin:
Что то не так делаю походу или проблема в другом, но с полосами прокрутки какие то проблемы у меня.
При старте они почти не работают, но если радиокнопками их обновить то всё начинает работать норм. При переходе на новую вкладку та же беда, пока не нажму на радиокнопку.
Отправил архив в ЛС.

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

 

//---

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

Сейчас такое событие при переключении вкладок не генерируется. Будет доступно в следующем обновлении библиотеки.

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