Почему OBJ_EDIT нельзя назначить точку якоря?

 

хотел поставить OBJ_EDIT в правый нижний угол чарта на расстоянии 15 пикселей от границы. думал что это можно будет сделать указав точку привязки объекта ANCHOR_RIGHT_LOWER. но не получается :((

неужели  OBJ_EDIT привязывается только по левому верхнему углу? если да - то почему ему такая немилость? или это просто еще неисправленный глюк?

вот код из двух абсолютно одинаковых кусков для двух объектов OBJ_EDIT и OBJ_LABEL

#include <Charts\Chart.mqh>

int OnInit()
{
  int Chart_ID = 0; 
  string Name = "ERROR";
  ObjectCreate    (Chart_ID, Name, OBJ_EDIT, 0, 0, 0);
  ObjectSetInteger(Chart_ID, Name, OBJPROP_BACK,false);
  ObjectSetString (Chart_ID, Name, OBJPROP_TEXT, "[1234567890]");
  ObjectSetInteger(Chart_ID, Name, OBJPROP_SELECTABLE, true);  
  ObjectSetInteger(Chart_ID, Name, OBJPROP_READONLY, false);  
  ObjectSetInteger(Chart_ID, Name, OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);

  ObjectSetInteger(Chart_ID, Name, OBJPROP_XDISTANCE,15);
  ObjectSetInteger(Chart_ID, Name, OBJPROP_YDISTANCE,15);
  ObjectSetInteger(Chart_ID, Name, OBJPROP_YSIZE,100);
  ObjectSetInteger(Chart_ID, Name, OBJPROP_XSIZE,200);
  ObjectSetInteger(Chart_ID, Name, OBJPROP_COLOR, DarkBlue);  
  ObjectSetInteger(Chart_ID, Name, OBJPROP_BGCOLOR, Blue);  

  ObjectSetInteger(Chart_ID, Name, OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
  ObjectSetInteger(Chart_ID, Name, OBJPROP_CORNER,CORNER_RIGHT_LOWER);
  
  Name = "OK";
  ObjectCreate    (Chart_ID, Name, OBJ_LABEL, 0, 0, 0);
  ObjectSetInteger(Chart_ID, Name, OBJPROP_BACK,false);
  ObjectSetString (Chart_ID, Name, OBJPROP_TEXT, "[1234567890]");
  ObjectSetInteger(Chart_ID, Name, OBJPROP_SELECTABLE, true);  
  ObjectSetInteger(Chart_ID, Name, OBJPROP_READONLY, false);  
  ObjectSetInteger(Chart_ID, Name, OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);

  ObjectSetInteger(Chart_ID, Name, OBJPROP_XDISTANCE,15);
  ObjectSetInteger(Chart_ID, Name, OBJPROP_YDISTANCE,15);
  ObjectSetInteger(Chart_ID, Name, OBJPROP_YSIZE,100);
  ObjectSetInteger(Chart_ID, Name, OBJPROP_XSIZE,200);
  ObjectSetInteger(Chart_ID, Name, OBJPROP_COLOR, DarkBlue);  
  ObjectSetInteger(Chart_ID, Name, OBJPROP_BGCOLOR, Blue);  

  ObjectSetInteger(Chart_ID, Name, OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
  ObjectSetInteger(Chart_ID, Name, OBJPROP_CORNER,CORNER_RIGHT_LOWER);
  
  ChartRedraw(); 
  return(0);
}


void OnTick()
{
  ChartRedraw(); 
}
 

Вот модифицированный пример из справки из раздела Угол привязки

//+------------------------------------------------------------------+
//|                                        Check_ENUM_BASECORNER.mq5 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//+------------------------------------------------------------------+
//| создание объекта Label в нужном углу                             |
//+------------------------------------------------------------------+
void CreateLabel(long   chart_id,
                 string name,
                 int    chart_corner,
                 string text_label,
                 int    x_ord,
                 int    y_ord)
  {
//---
   ObjectCreate(chart_id,name,OBJ_EDIT,0,0,0);
   ResetLastError();
   if(!ObjectSetInteger(chart_id,name,OBJPROP_CORNER,chart_corner))
      Print("Не удалось установить угол привязки для объекта",
            name,", ошибка",GetLastError());
   ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x_ord);
   ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y_ord);
   ObjectSetString(chart_id,name,OBJPROP_TEXT,text_label);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int height=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);
   int width=ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);
   string arrows[4]=
     {
      "LEFT_UPPER","RIGHT_UPPER",
      "RIGHT_LOWER","LEFT_LOWER"
     };
   CreateLabel(0,arrows[0],CORNER_LEFT_UPPER,"0",50,50);
   CreateLabel(0,arrows[1],CORNER_RIGHT_UPPER,"1",50,50);
   CreateLabel(0,arrows[2],CORNER_RIGHT_LOWER,"2",50,50);
   CreateLabel(0,arrows[3],CORNER_LEFT_LOWER,"3",50,50);
  }
//+------------------------------------------------------------------+

Результат:



 
Rosh:

Вот модифицированный пример из справки из раздела Угол привязки

Спасибо конечно, но это я и сам выяснил. Вопрос был почему OBJ_EDIT-у нельзя назначить угол который привязывается? Вот OBJ_LABEL-у я "сказал" привязываться правым нижним углом, и поставить объект  на расстоянии 15 пикселей от нижней и правой границы. и OBJ_LABEL стал своим правым нижним уголком на расстоянии этих самых 15 пикселей. А когда я в том же самом коде заменил OBJ_LABEL на OBJ_EDIT то OBJ_EDIT встал в точку на 15 пикселях от границ своим левым вершним углом, проигнорировав ObjectSetInteger(Chart_ID, Name, OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);

Ваш новый код из справки должен был бы нарисовать мне симметричную картину если в него подобавлять состветсвующие ObjectSetInteger(Chart_ID, Name, OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);.  

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

 
ForexTools:

Спасибо конечно, но это я и сам выяснил. Вопрос был почему OBJ_EDIT-у нельзя назначить угол который привязывается?

Посмотрите внимательно - в примере как раз расставляютсчя по углам четыре объекта OBJ_EDIT
 

Мы наверно с вами о разных углах привязки говорим. OBJ_EDIT поставить в правый нижний угол графика можно. нельзя задать ему свойство ANCHOR_RIGHT_LOWER.

т.е. якорь объекта от которого отсчитываются координаты самого объекта для OBJ_EDIT это всегда его левый верхний угол! и переназначить якорь объекта на правый нижний угол объекта нельзя.

прошу вас прочитайте внимательно что мне нужно сделать: нужно так разместить объект OBJ_EDIT в правом нижнем углу графика, чтобы его (этого самого OBJ_EDIT) правый нижний угол был на расстоянии 15 пикселей от правой и нижней границы графика. и чтобы если я просто увеличил его ширину, то правый нижний угол OBJ_EDIT так и остался бы на месте а его левая граница отъехала бы влево.

 

да есть такая штука в мт5

сталкивался

как говарил энштейн

все относительно


 
CoreWinTT:
...

все относительно

содержательный ответ... многое после его прочтения становится понятным.... :))))
 
Кстати, на форме свойств объекта угол привязки объекта назван "Угол". Возможно стоит везде (на формах и в документации) переназвать его "Якорь", чтобы было мнемоническое соответствие между терминами и их ENUM-названиями: угол привязки на графике - угол, CORNER, а угол привязки объекта - якорь, ANCHOR.
 
ForexTools:

Мы наверно с вами о разных углах привязки говорим. OBJ_EDIT поставить в правый нижний угол графика можно. нельзя задать ему свойство ANCHOR_RIGHT_LOWER.

т.е. якорь объекта от которого отсчитываются координаты самого объекта для OBJ_EDIT это всегда его левый верхний угол! и переназначить якорь объекта на правый нижний угол объекта нельзя.

прошу вас прочитайте внимательно что мне нужно сделать: нужно так разместить объект OBJ_EDIT в правом нижнем углу графика, чтобы его (этого самого OBJ_EDIT) правый нижний угол был на расстоянии 15 пикселей от правой и нижней границы графика. и чтобы если я просто увеличил его ширину, то правый нижний угол OBJ_EDIT так и остался бы на месте а его левая граница отъехала бы влево.

Теперь понял, но ответить не могу. Пишите в Сервисдеск, напрямую разработчикам.
 

написал разработчикам... ответили что

У OBJ_EDIT задаются фиксированные размеры, а у OBJ_LABEL - нет.

странная логика. в одном объекте сделали возможность выбора якоря для его привязки, а в другом (в сущности - таком же прямоугольнике) - "не захотелось". а ведь практически наверняка код расчетов позиционирования объекта можно почти один-в-один скопипастить.

сначала я думал что это мои "выдумки", но ведь это действительно нужная (имхо) вещь! ведь как правило рядом с полем ввода пишется OBJ_LABEL (слева или справа) и разумно было бы иметь возможность посадить их на одну общую точку привязки.  а сейчас ситуация выглядит так:

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

 
ForexTools:

написал разработчикам... ответили что

странная логика. в одном объекте сделали возможность выбора якоря для его привязки, а в другом (в сущности - таком же прямоугольнике) - "не захотелось". а ведь практически наверняка код расчетов позиционирования объекта можно почти один-в-один скопипастить.

сначала я думал что это мои "выдумки", но ведь это действительно нужная (имхо) вещь! ведь как правило рядом с полем ввода пишется OBJ_LABEL (слева или справа) и разумно было бы иметь возможность посадить их на одну общую точку привязки.  а сейчас ситуация выглядит так:

 

Поддерживаю, так будет удобнее. 

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