Невидимые объекты

 

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

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

//+------------------------------------------------------------------+
//|                                                 LoopTemplate.mq4 |
//|                                                    Candid, 2010. |
//|                                          http://candid.110mb.com |
//+------------------------------------------------------------------+
string ScriptName = "LoopTemplate";

#property show_inputs

extern int Delay = 500;

//+------------------------------------------------------------------+
void SetWingdingsLabel(string LabelName, string Code, int Corner, int X, int Y, color Color, int Size) {
  ObjectCreate(LabelName,OBJ_LABEL,0,0,0);
  ObjectSet(LabelName,OBJPROP_CORNER,Corner);
  ObjectSet(LabelName,OBJPROP_XDISTANCE,X);
  ObjectSet(LabelName,OBJPROP_YDISTANCE,Y);
  ObjectSetText(LabelName,Code,Size,"Wingdings",Color); 
  return;
}
//+------------------------------------------------------------------+
//| script                                                           |
//+------------------------------------------------------------------+
int start() {
  int CurY = 10;
  string SwPart1Name = ScriptName + "SwPart1";
  SetWingdingsLabel(SwPart1Name,"\xA4",1,10,30,Red,16);
  string SwPart2Name = ScriptName + "SwPart2";
  SetWingdingsLabel(SwPart2Name,"\x48",1,14,CurY,Red,16);

  while (CurY == 10) {
//  Вставлять код здесь  

    Sleep(100);
    CurY = ObjectGet(SwPart2Name,OBJPROP_YDISTANCE);
  }

  Sleep(Delay);
  ObjectDelete(SwPart1Name);
  while (ObjectFind(SwPart2Name) >= 0) ObjectDelete(SwPart2Name);
  Comment("");
  return (0);
}


Поначалу всё работало как надо, но с какого-то момента при запуске скрипта картинка начала появляться не сразу, а только после щелчка мышью в окне графика. Причины такого переключения понять не удалось. Как и вернуть "нормальное" поведение. А хотелось бы.

Сталкивался кто-нибудь с таким эффектом? Билд 226, Win7, терминал в оффлайне.

 

после запуска скрипта делай принудительное обновление графика (не путать с обновлением котировок)

ЗЫ: вернее после отрисовки объекта

 
   WindowRedraw();
 
Ага, спасибо, помогает. Но всё равно интересно бы понять причину такого "переключения", может какую пользу от эффекта удастся придумать :).
 
Скорее всего это из-за привязки к тикам, график обновляется с приходом свежего тика
 
sanyooooook:
Скорее всего это из-за привязки к тикам, график обновляется с приходом свежего тика

Так вроде другие скрипты нормально свои объекты рисуют. В принципе есть смутное воспоминание что появление эффекта примерно совпало с появлением в коде

while (ObjectFind(SwPart2Name) >= 0)


Но ручаться что именно совпало(а тем более что совпало неспроста), не буду.

 
 ObjectCreate(LabelName,OBJ_LABEL,0,0,0);
  ObjectSet(LabelName,OBJPROP_CORNER,Corner);
  ObjectSet(LabelName,OBJPROP_XDISTANCE,X);
  ObjectSet(LabelName,OBJPROP_YDISTANCE,Y);
  ObjectSetText(LabelName,Code,Size,"Wingdings",Color); 
void WindowRedraw( ) 
Принудительно перерисовывает текущий график. Обычно применяется после изменения свойств объектов.  

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

ЗЫ: попробуй сразу от рисовать объект с нужными координатами

 
Это я знаю, тем не менее другие скрипты прекрасно продолжают рисовать и без WindowRedraw() . И этот поначалу рисовал.
 
Да кто знает почему так, давай код посмотрим, сам знаешь телепаты в отпусках )))
 

sanyooooook:

ЗЫ: попробуй сразу от рисовать объект с нужными координатами

Э нет, с метками сразу не получится давать координаты.

Вобщем-то WindowRedraw() нормальное решение, для того и ввели её чтобы не было необходимости лезть во всякие тонкие места.

 
sanyooooook:
Да кто знает почему так, давай код посмотрим, сам знаешь телепаты в отпусках )))

А код-то - в первом посте с самого начала был :)

Причина обращения: