Не получается посчитать размер строки в пикселях, не создавая OBJ_LABEL. - страница 2

 
Можно заранее измерить и потом использовать в своей функции расчёта длинны
 
Aleksandr Slavskii:

Здравствуйте.

Задача, написать строку длиннее 62 символов.

Типа такой:


Разбил текст на две строки, от 0 до 11 и от 12 до 24, пытаюсь написать их последовательно.

Для этого надо узнать размер первой строки.

или так

В результате получаю такую картинку

Но если получать не размер строки, а размер OBJ_LABEL с текстом строки, то получаем совсем другой результат

Как вы видите 540 != 324.  И если вместо 324   поставить отступ 540, то всё рисует как надо. 

Но мне такой способ нахождения размера строки не подходит.

Я понимаю, что что то упускаю из вида, не пойму что.


Скрипт.

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

Вот этот код

input int font_size = 20;
long chart_id = ChartID();
/********************Script program start function*******************/
void OnStart()
 {
  int X = 10, Y = 10, x_size, k = 0;

  string txt = "0  " + "1  " + "2  " + "3  " + "4  " + "5  " + "6  " + "7  " + "8  " + "9  " + "10 " + "11 ";
  DrawLABEL("1", txt, X, Y);
  ChartRedraw();
  do
   {
    x_size = (int)ObjectGetInteger(chart_id, "1", OBJPROP_XSIZE); // x_size=540
    if(x_size ==0)
     {
      k++;
      Sleep(50);// можно попробовать убавить
     }
   }
while(x_size == 0 && k < 12 && !IsStopped());
  txt = "12 " + "13 " + "14 " + "15 " + "16 " + "17 " + "18 " + "19 " + "20 " + "21 " + "22 " + "23 " + "24 ";
  int Len = StringLen(txt); //  Len=36
  Print("Длинна lable ", x_size, " k = ", k);
  DrawLABEL("2", txt, X+x_size, Y);
  ChartRedraw();
 }/******************************************************************/
void DrawLABEL(string Name, string _text, int x, int y)
 {
  ObjectCreate(chart_id, Name, OBJ_LABEL, 0, 0, 0);
  ObjectSetInteger(chart_id, Name, OBJPROP_XDISTANCE, x);
  ObjectSetInteger(chart_id, Name, OBJPROP_YDISTANCE, y);
  ObjectSetInteger(chart_id, Name, OBJPROP_FONTSIZE, font_size);
  ObjectSetString(chart_id, Name, OBJPROP_FONT, "Consolas");
  ObjectSetString(chart_id, Name, OBJPROP_TEXT, _text);
  ObjectSetInteger(chart_id, Name, OBJPROP_COLOR, clrBlack);
 }/******************************************************************/
/*****************************End program****************************/

даёт такой результат

и такой текст в логе

2022.04.09 19:10:09.951 00 (EURUSD,M1)  Длинна lable 540 k = 1

как видите нет никаких проблем…

И моё личное: Терпеть не могу нули вместо ID графика, периода графика и прочие замены…

 
Alexey Viktorov #:

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

И моё личное: Терпеть не могу нули вместо ID графика, периода графика и прочие замены…

Спасибо за уделённое время, но 

цитата:

К тому же у меня ширину объекта выдавал и без цикла, достаточно было ChartRedraw 

Вопрос то был не об этом !!!

И моё личное: пример должен быть максимально лаконичен, поэтому поубирал всё, что посчитал излишним)

 

Примеры поучительней правил.(c) MetaQuotes )

#property strict
#property  script_show_inputs
input int font_size = 8;//not use 7 or <7 !!! see print variable size 
//+------------------------------------------------------------------+
void OnStart()
  {
   int X = 0, Y = 40, x_size;
   uint width, height;
   double DPIlocal=TerminalInfoInteger(TERMINAL_SCREEN_DPI)/92.0;
   Print (DPIlocal);
   string txt = "0  " + "1  " + "2  " + "3  " + "4  " + "5  " + "6  " + "7  " + "8  " + "9  " + "10 " + "11 ";
   DrawLABEL("1", txt, X, Y,font_size);
   ChartRedraw();
   for (int ifo=font_size-3;ifo<2*font_size;ifo++)
   {
   TextSetFont("Consolas", -ifo*10);
   TextGetSize("0", width, height);  
   Print ("font size:",ifo,"  TextGetSize(\"0\", width, height)=",width," ",height," h/w=",DoubleToString((double)height/width,2));  
   }
   int Len = StringLen(txt); //  Len=36
   width=font_size-1;
   int WidthS =(int)( Len * width);   
   x_size = (int)ObjectGetInteger(0, "1", OBJPROP_XSIZE); // x_size=540

   txt = "12 " + "13 " + "14 " + "15 " + "16 " + "17 " + "18 " + "19 " + "20 " + "21 " + "22 " + "23 " + "24 ";
   DrawLABEL("2", txt, X +  (int)WidthS, Y, font_size);
   ChartRedraw();
   Sleep(8000);
   ObjectDelete(0,"2");
   ObjectDelete(0,"1");
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void DrawLABEL(string Name, string _text, int x, int y, int _font_size)
  {
   ObjectCreate(0, Name, OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, Name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(0, Name, OBJPROP_YDISTANCE, y);
   ObjectSetInteger(0, Name, OBJPROP_FONTSIZE,_font_size );
   ObjectSetString(0, Name, OBJPROP_FONT, "Consolas");
   ObjectSetString(0, Name, OBJPROP_TEXT, _text);
   ObjectSetInteger(0, Name, OBJPROP_COLOR, clrYellow);
  }
//+------------------------------------------------------------------+

Print:

2022.04.09 20:59:52.196 WLabel (GBPUSD,M15) 1.0

2022.04.09 20:59:52.197 WLabel (GBPUSD,M15) font size:5  TextGetSize("0", width, height)=4 9 h/w=2.25

2022.04.09 20:59:52.197 WLabel (GBPUSD,M15) font size:6  TextGetSize("0", width, height)=5 12 h/w=2.40

2022.04.09 20:59:52.198 WLabel (GBPUSD,M15) font size:7  TextGetSize("0", width, height)=7 14 h/w=2.00

2022.04.09 20:59:52.198 WLabel (GBPUSD,M15) font size:8  TextGetSize("0", width, height)=7 15 h/w=2.14

2022.04.09 20:59:52.198 WLabel (GBPUSD,M15) font size:9  TextGetSize("0", width, height)=8 18 h/w=2.25

2022.04.09 20:59:52.198 WLabel (GBPUSD,M15) font size:10  TextGetSize("0", width, height)=9 20 h/w=2.22

2022.04.09 20:59:52.199 WLabel (GBPUSD,M15) font size:11  TextGetSize("0", width, height)=10 22 h/w=2.20

2022.04.09 20:59:52.200 WLabel (GBPUSD,M15) font size:12  TextGetSize("0", width, height)=11 23 h/w=2.09

2022.04.09 20:59:52.200 WLabel (GBPUSD,M15) font size:13  TextGetSize("0", width, height)=12 26 h/w=2.17

2022.04.09 20:59:52.200 WLabel (GBPUSD,M15) font size:14  TextGetSize("0", width, height)=13 27 h/w=2.08

2022.04.09 20:59:52.200 WLabel (GBPUSD,M15) font size:15  TextGetSize("0", width, height)=14 29 h/w=2.07

 
Aleksandr Slavskii #:

Спасибо за уделённое время, но 

цитата:

К тому же у меня ширину объекта выдавал и без цикла, достаточно было ChartRedraw 

Вопрос то был не об этом !!!

И моё личное: пример должен быть максимально лаконичен, поэтому поубирал всё, что посчитал излишним)

А какой подходит? В один lable всё всунуть? Тогда канвас вам в руки и вперёд. И всё-же одного ChartRedraw недостаточно. Если внимательно посмотрите код, то ChartRedraw после создания первого lable я оставил нетронутым, но это не помогает. Посмотрите результат выполнения… Там сразу видно, что цикл выполнился дважды. Тот факт, что у вас как-то получилось не говорит о том, что без цикла будет ожидаемый результат всегда и обязательно.

 
Aleksandr Slavskii #:


почитайте в этой ветке. Может что-то будет полезным.
https://www.mql5.com/ru/forum/364640/page6#comment_21290218

 
Mikhail Dovbakh #:

Примеры поучительней правил.(c) MetaQuotes )

Print:

Большое спасибо!!! Работает!!!