Как упростить текст?

 
Здравствуйте, я пытаюсь создать что-то типо информационной панели, но не знаю как укоротить код, т.е моя панель состоит из множества прямоугольников, и думаю глупо каждый описывать вот так:
   ObjectCreate(0,"info2",OBJ_RECTANGLE_LABEL,0,0,0);
   ObjectSetInteger(0,"info2", OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0,"info2",OBJPROP_XDISTANCE,23);
   ObjectSetInteger(0,"info2",OBJPROP_YDISTANCE,60);
   ObjectSetInteger(0,"info2",OBJPROP_WIDTH,0); 
   ObjectSetInteger(0,"info2",OBJPROP_XSIZE,288);
   ObjectSetInteger(0,"info2",OBJPROP_YSIZE,30);
   ObjectSetInteger(0,"info2",OBJPROP_BGCOLOR,C'245,244,246');
   ObjectSetInteger(0,"info2",OBJPROP_CORNER,0);
   ObjectSetInteger(0,"info2",OBJPROP_BACK,false);

может можно как то в строку или... не знаю, как то упростить, просто таких блоков у меня как минимум 25, и занимает тонны текста, или так все делают!? Спасибо
 
Dmitry Ivkin:
Здравствуйте, я пытаюсь создать что-то типо информационной панели, но не знаю как укоротить код, т.е моя панель состоит из множества прямоугольников, и думаю глупо каждый описывать вот так:

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


Для начала итак пойдет

Потом когда наберетесь опыта, можете вынести этот код в отдельную функцию. и вызывать ее с своими параметрами


например потом можно сделать так (из справки)

//+------------------------------------------------------------------+ 
//| Cоздает прямоугольник по заданным координатам                    | 
//+------------------------------------------------------------------+ 
bool RectangleCreate(const long            chart_ID=0,        // ID графика 
                     const string          name="Rectangle",  // имя прямоугольника 
                     const int             sub_window=0,      // номер подокна  
                     datetime              time1=0,           // время первой точки 
                     double                price1=0,          // цена первой точки 
                     datetime              time2=0,           // время второй точки 
                     double                price2=0,          // цена второй точки 
                     const color           clr=clrRed,        // цвет прямоугольника 
                     const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий прямоугольника 
                     const int             width=1,           // толщина линий прямоугольника 
                     const bool            fill=false,        // заливка прямоугольника цветом 
                     const bool            back=false,        // на заднем плане 
                     const bool            selection=true,    // выделить для перемещений 
                     const bool            hidden=true,       // скрыт в списке объектов 
                     const long            z_order=0)         // приоритет на нажатие мышью 
  { 
//--- установим координаты точек привязки, если они не заданы 
   ChangeRectangleEmptyPoints(time1,price1,time2,price2); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим прямоугольник по заданным координатам 
   if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE,sub_window,time1,price1,time2,price2)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать прямоугольник! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- установим цвет прямоугольника 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим стиль линий прямоугольника 
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); 
//--- установим толщину линий прямоугольника 
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); 
//--- включим (true) или отключим (false) режим заливки прямоугольника 
   ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим выделения прямоугольника для перемещений 
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект 
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection 
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   return(true); 
  } 


а потом вызов будет такой:

RectangleCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpHidden,InpZOrder);
     


Одной строкой. 

 

Я бы вот так сделал, так как пишу для себя мне так удобнее.))) Хотя пример выше, правильнее и красивее, ну я колхоз мне можно))

for(int i=0;i<=24;i++)
{
string name=IntegerToString(i);
int y = 60+i;
ObjectCreate(0,name,OBJ_RECTANGLE_LABEL,0,0,0);
   ObjectSetInteger(0,name, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,23);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,0); 
   ObjectSetInteger(0,name,OBJPROP_XSIZE,288);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,30);
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,C'245,244,246');
   ObjectSetInteger(0,name,OBJPROP_CORNER,0);
   ObjectSetInteger(0,name,OBJPROP_BACK,false);
}
 
Evgeny Raspaev:

Я бы вот так сделал, так как пишу для себя мне так удобнее.))) Хотя пример выше, правильнее и красивее, ну я колхоз мне можно))

Спасибо, а если у меня размеры цвет разные?

 
Vladislav Andruschenko:


Для начала итак пойдет

Потом когда наберетесь опыта, можете вынести этот код в отдельную функцию. и вызывать ее с своими параметрами


например потом можно сделать так (из справки)


а потом вызов будет такой:


Одной строкой. 

Спасибо)

 
Dmitry Ivkin:

Спасибо, а если у меня размеры цвет разные?

ну если начал колхозить то колхозить до конца)) через if выставлю параметры какие мне надо.)))

for(int i=0;i<=24;i++)
{
string name=IntegerToString(i);
int y = 60+i;
color Colors;// = "clrRed";
int xsize,ysize;
if(i==0)
{
Colors = clrRed;
xsize=288;
ysize=30;
}
if(i==1)
{
Colors = clrAqua;
xsize=250;
ysize=50;
}
ObjectCreate(0,name,OBJ_RECTANGLE_LABEL,0,0,0);
   ObjectSetInteger(0,name, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,23);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,0); 
   ObjectSetInteger(0,name,OBJPROP_XSIZE,xsize);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,ysize);
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Colors);
   ObjectSetInteger(0,name,OBJPROP_CORNER,0);
   ObjectSetInteger(0,name,OBJPROP_BACK,false);
}

Конечно я шучу - этот пример не куда не годится, это пример КАК НЕ НАДО ПИСАТЬ. Воспользуйтесь примером из справки, отдельную функцию, и вызывать с отдельными параметрами когда вам необходимо. 

 
Dmitry Ivkin:
Здравствуйте, я пытаюсь создать что-то типо информационной панели, но не знаю как укоротить код, т.е моя панель состоит из множества прямоугольников, и думаю глупо каждый описывать вот так:

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

Если хотите УПРОСТИТЬ, то ничего делать не надо, всё и так упрощено, ибо самый простой алгоритм - линейный! И если экран большой, а шрифт маленький, и времени на комментарии не жалко - то неудобства минимальны.

Если хотите УКОРОТИТЬ, например, чтобы легче понималась основная линия алгоритма, то второстепенные детали (и не обязательно даже повторяющиеся) нужно выносить в функции (процедуры).

При этом например алгоритм рисования района города будет выглядеть как:

Улица;
Улица;
Площадь;
Улица;

А алгоритм рисования улицы, например:

Дом;
Дом;
Дорога;
Дом;
Дом;

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

Чем сложнее общий алгоритм, тем обычно большее количество уровней детализации приходится использовать, но обычно ограничиваются 2-4 уровнями.

 
Dmitry Ivkin:
не знаю, как то упростить, просто таких блоков у меня как минимум 25, и занимает тонны текста, или так все делают!?

Начните упрощение с постановки задачи: сейчас вам нужен функционал для рисования таблицы + возможность управлять ячейками в ней

Года 3 тому тоже хотел упростить это же самое. На сегодня упрощённый вариант содержит 400+ строк кода

 
Где то видел библиотеку для рисования панелек. Поищите в кодобазе.
Причина обращения: