Ошибки, баги, вопросы - страница 2801

 
Igor Makanu:

вопрос где инициализируете

если по условию prev_calculated == 0 , тогда все ОК, если в OnInt() , то будет глючить при переключении ТФ и при компиляции

перебрал все варианты (и он-инит, и он-калкулэйт); текущий: в цикле перебора каждое значение индивидуально присваивается. через окно данных проверял - странных/мусорных значений нет.

 
Igor Makanu:

хочу отобразить один символ на канвасе и двигать его, исходник:


почему я предыдущее выведенное изображение затираю черным, а остаются артефакты ?


Это из-за сглаживания. Самый верный способ, это рисовать прямоугольник по цвету фона, поверх символа. А затем выводить символ с новыми координатами. Так обычно и делают в подобных случаях.

 
Igor Makanu:
Mihail Matkovskij:

Это из-за сглаживания. Самый верный способ, это рисовать прямоугольник по цвету фона, поверх символа. А затем выводить символ с новыми координатами. Так обычно и делают в подобных случаях.

Не забываем про возможность простого перемещения канваса без всяких перерисовок и закрашиваний.
Это самый быстрый способ перемещения.

#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164

void OnStart() {
// Формируем какой-то фон
   for (int i = 0; i<1000; i++) Canvas.Circle(rand()%2048, rand()%2048,50+rand()%50,ARGB(255,rand()%256,rand()%256,rand()%256));
   Canvas.Update();
// -----------------------
   int x=100, y=100;
   iCanvas c(0,x,y,"symbol",50,50); // создаем дополнительный канвас размером 50х50
   c.TextPosition(0,0);
   c.CurentFont("Tahoma",50);
   c.Comm("S");
   c.Update();
   while(!IsStopped()&& x<W.Height) {
      c.MoveCanvas(++x,++y);        // перемещаем данный канвас
      c.Update();
      Sleep(50);
   }
}
 
Nikolai Semko:

Не забываем про возможность простого перемещения канваса без всяких перерисовок и закрашиваний.
Это самый быстрый способ перемещения.

Никто его и не отрицает. Просто бывает концепция, когда есть один экран в виде канвы. В свою очередь, та же пользовательская канва (массив пикселей) рисуется на канве окна (чарта). Точнее, он сначала передаётся чарту (копируется) с помощью ResourceCreate (в OBJ_BITMAP либо OBJ_BITMAP_LABEL). В окне же чарта всё рисуется с помощью Win API (если не ошибаюсь). Хотя, можно и с помощью других API это делать. А вот в классе CCanvas прописаны свои методы рисования на элементах массива m_pixels.

Получается, рисуя маленький прямоугольник потом всё равно приходится передавать множество пикселей с помощью ResourceCreate (экономится время только на рисовании). А так можно просто перемещать OBJ_BITMAP_LABEL по графику, без обработки массива m_pixels и последующего его копирования в OBJ_BITMAP_LABEL.
 
Mihail Matkovskij:

Никто его и не отрицает. Просто бывает концепция, когда есть один экран в виде канвы. В свою очередь, та же пользовательская канва (массив пикселей) рисуется на канве окна (чарта). Точнее, он сначала передаётся чарту (копируется) с помощью ResourceCreate (в OBJ_BITMAP либо OBJ_BITMAP_LABEL). В окне же чарта всё рисуется с помощью Win API (если не ошибаюсь). Хотя, можно и с помощью других API это делать. А вот в классе CCanvas прописаны свои методы рисования на элементах массива m_pixels.

Получается, рисуя маленький прямоугольник потом всё равно приходится передавать множество пикселей с помощью ResourceCreate (экономится время только на рисовании). А так можно просто перемещать OBJ_BITMAP_LABEL по графику, без обработки массива m_pixels и последующего его копирования OBJ_BITMAP_LABEL.

Дело в том, что в классе CCanvas нет метода перемещения канваса, что весьма странно.
В классе iCanvas он реализован.

ЗЫ Прошу прощения, только сейчас увидел, что в текущей версии iCanvas в КБ нет реализации этого метода, а только его декларация. Сейчас поправлю. 

bool iCanvas::MoveCanvas(const int x,const int y) {
   if(ObjectSetInteger(m_chart_id,m_objname,OBJPROP_XDISTANCE,x) && ObjectSetInteger(m_chart_id,m_objname,OBJPROP_YDISTANCE,y))  return(true);
   else return(false);
}

Поправил


Файлы:
iCanvas.mqh  45 kb
Movement.mq5  2 kb
 
Nikolai Semko:

Дело в том, что в классе CCanvas нет метода перемещения канваса, что весьма странно.
В классе iCanvas он реализован.

ЗЫ Прошу прощения, только сейчас увидел, что в текущей версии iCanvas в КБ нет реализации этого метода, а только его декларация. Сейчас поправлю. 

Поправил


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

 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
 

У меня перестала работать портативная версия MetaEditor (/portable в свойствах ярлыка). Произошло это с сегодняшним обновлением. Убрал /portable из свойств, редактор запустился, но с настройками из установленного терминала и MetaEditor-а. Также, рабочие каталоги он использует не из моей папки с портативной версией. Терминал вроде продолжает нормально запускаться с опцией /portable, но  MetaEditor также не запускается по нажатию F4. Пишет в журнале:

2020.07.14 20:00:17.560 Error MetaEditor not found

Как теперь можно наладить портативную версию терминала и редактора для нормальной работы?

 
Mihail Matkovskij:

У меня перестала работать портативная версия MetaEditor (/portable в свойствах ярлыка). Произошло это с сегодняшним обновлением. Убрал /portable из свойств, редактор запустился, но с настройками из установленного терминала и MetaEditor-а. Также, рабочие каталоги он использует не из моей папки с портативной версией. Терминал вроде продолжает нормально запускаться с опцией /portable, но  MetaEditor также не запускается по нажатию F4. Пишет в журнале:

Как теперь можно наладить портативную версию терминала и редактора для нормальной работы?

Вышло очередное обновление. Решил проверить MetaEditor. Добавляю /portable в свойства ярлыка, запускаю и всё заработало. Все настройки и рабочие каталоги на месте, как и было ранее.

 

Возможно ли штатными способами сделать следующее?


  1. Просматриваю лог через ПКМ->Просмотр. Там использую фильтр. 
  2. В полученном результате нахожу нужную строку.
  3. Хочу увидеть, что было до и после этой строки в логе, если фильтр отключить.
Никак не получается это сделать. Приходится запоминать время и примерное содержание строки, а потом отключать фильтр и по запомненному искать вручную ее.