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

 
MetaDriver:
Попробуй ObjSetInteger(id, Name, OBJPROP_BACK, false);
Пробовал. Форма действительно проваливается назад, но делает это самым безобразным образом, т.е. проваливается даже за бары. А задача несколько другая, нужно просто что бы текст отображался в форме, при этом сама форма была поверх графика и других форм.
 
C-4:
Пробовал. Форма действительно проваливается назад, но делает это самым безобразным образом, т.е. проваливается даже за бары. А задача несколько другая, нужно просто что бы текст отображался в форме, при этом сама форма была поверх графика и других форм.

Объекты отображаются в порядке создания, если нужно поменять порядок то стоит сохранить данные объектов и пересоздать их в нужном порядке.

Или баг даже в этом?

 
C-4:
Пробовал. Форма действительно проваливается назад, но делает это самым безобразным образом, т.е. проваливается даже за бары. А задача несколько другая, нужно просто что бы текст отображался в форме, при этом сама форма была поверх графика и других форм.
Нужно просто учитывать порядок создания графических объектов. Те, что должны быть ниже, нужно создавать в первую очередь. 
 
tol64:
Нужно просто учитывать порядок создания графических объектов. Те, что должны быть ниже, нужно создавать в первую очередь. 

Да, это первое о чем я подумал. Менял порядок - результат тот же. Но чудес не бывает. Хотя сейчас взял рабочий проект и попытался в нем разместить OBJ_EDIT - он заработал нормально, т.е виден над формой. В общем чертовщина какая-то. Ясно, что я что-то не учел или забыл. Но все-таки хотелось бы разобраться, дабы не наступать на эти грабли в следущий раз. Вот код OnInit() для теста:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
   ObjectCreate(0, "cell", OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "cell", OBJPROP_XDISTANCE, 15);
   ObjectSetInteger(0, "cell", OBJPROP_YDISTANCE, 60);
   ObjectSetInteger(0, "cell", OBJPROP_BGCOLOR, clrWhite);
   ObjectSetInteger(0, "cell", OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(0, "cell", OBJPROP_BORDER_COLOR, clrBlack);
   ObjectSetInteger(0, "cell", OBJPROP_BACK, false);
   //ObjectSetInteger(0, "cell", OBJPROP_SELECTED, false);
   
   ObjectCreate(0, "edittext", OBJ_EDIT, 0, 30, 30);
   ObjectSetInteger(0, "edittext", OBJPROP_XDISTANCE, 40);
   ObjectSetInteger(0, "edittext", OBJPROP_YDISTANCE, 50);
   ObjectSetInteger(0, "edittext", OBJPROP_BGCOLOR, clrNONE);
   ObjectSetInteger(0, "edittext", OBJPROP_BORDER_COLOR, clrNONE);
   //ObjectSetInteger(0, "edittext", OBJPROP_WIDTH, 3);
   ObjectSetString(0, "edittext", OBJPROP_TEXT, "edit text");
   ObjectSetInteger(0, "edittext", OBJPROP_BACK, false);
   
   
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов - Документация по MQL5
 
C-4:

Да, это первое о чем я подумал. Менял порядок - результат тот же. Но чудес не бывает. Хотя сейчас взял рабочий проект и попытался в нем разместить OBJ_EDIT - он заработал нормально, т.е виден над формой. В общем чертовщина какая-то. Ясно, что я что-то не учел или забыл. Но все-таки хотелось бы разобраться, дабы не наступать на эти грабли в следущий раз. Вот код OnInit() для теста:

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

такой баг сложно отловить, и даже предусмотреть.

 
Инфо для MQ. В справочнике для OnTimer есть "... на получение функцией EventSetTimer()...". Надо бы ещё дописать "... или EventSetMillisecondTimer()...".
Документация по MQL5: Работа с событиями / EventSetTimer
Документация по MQL5: Работа с событиями / EventSetTimer
  • www.mql5.com
Работа с событиями / EventSetTimer - Документация по MQL5
 

Всем здравствуйте!

 В справке есть вот такой абзац:

Все события обрабатываются одно за другим в порядке поступления. Если в очереди уже есть событие NewTick либо это событие находится в состоянии обработки, то новое событие NewTick в очередь mql5-программы не ставится. Аналогично, если в очереди mql5-программы уже находится событие ChartEvent или такое событие обрабатывается, то новое событие такого типа не ставится в очередь

Т.е. если в очереди событий есть ChartEvent – второй раз в очередь оно вставать не должно. Не тут то было :)

Набросал эксперт для проверки... Получилось что не зависимо от того, есть в очереди событие  ChartEvent или нет, обработчик события ChartEvent вызывается столько раз, сколько я его генерирую.

Это отлично, но по-моему нужно править справку… Или я не прав?

input int N= 50; //количество событий в очереди

void OnInit()
  {
   EventSetTimer(5);
  }

void OnDeinit(const int reason)
  {
   EventKillTimer();    
  }

void OnTimer()
  {
  for (ushort i=0; i<N; i++) EventChartCustom(0,1,i,0,(string)0);
  }


void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if (id>CHARTEVENT_CUSTOM) Print ("Обработано событие номер: ", lparam);
  }
 
MigVRN:

Всем здравствуйте!

 В справке есть вот такой абзац:

Т.е. если в очереди событий есть ChartEvent – второй раз в очередь оно вставать не должно. Не тут то было :)

Набросал эксперт для проверки... Получилось что не зависимо от того, есть в очереди событие  ChartEvent или нет, обработчик события ChartEvent вызывается столько раз, сколько я его генерирую.

Это отлично, но по-моему нужно править справку… Или я не прав?

Это касается лишь случая переполнения очереди, если очередь переполнена то событие тип которого уже есть в очереди не ставиться.

если же очередь не переполнена (а длинна очереди навскидку 1024) то все события встают на обработку.

 
Urain:

Это касается лишь случая переполнения очереди, если очередь переполнена то событие тип которого уже есть в очереди не ставиться.

если же очередь не переполнена (а длинна очереди навскидку 1024) то все события встают на обработку.

Понял. Спасибо :) 

PS: В вышеприведенном эксперте больше 1000 в очередь поставить не получилось. 

 
paladin800:
Инфо для MQ. В справочнике для OnTimer есть "... на получение функцией EventSetTimer()...". Надо бы ещё дописать "... или EventSetMillisecondTimer()...".
Тогда все будут выставлять миллисекундный таймер, даже если этого и не надо...
Причина обращения: