Вопрос по программированию кнопок

 

Добрый день!

Прошу помочь в решении вопроса. Заранее благодарю за ответы!


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

Не могу написать код так, чтобы при нажатии одной кнопки отжималась другая (если нажата).

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

Прошу подсказать, как правильно написать код для моей цели.

   ButtonCreate_UP();
   
   if(ObjectGet("Name_UP",OBJPROP_STATE)==true)
   {
   ObjectSetInteger(0,"Name_Down",OBJPROP_STATE,false);
      ButtonCreate_Down();
   
   if(ObjectGet("Name_Down",OBJPROP_STATE)==true)
   {
   ObjectSetInteger(0,"Name_UP",OBJPROP_STATE,false);
 
Не забывайте ChartRedraw()
 
ELDAR133:

Добрый день!

Прошу помочь в решении вопроса. Заранее благодарю за ответы!


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

Не могу написать код так, чтобы при нажатии одной кнопки отжималась другая (если нажата).

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

Прошу подсказать, как правильно написать код для моей цели.

надо было весь код привести..

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

PS/ форум неплохо развивает телепатические способности, что должно положительно влиять на торговлю. Так скоро можно вообще от роботов отказаться :-)

 
Maxim Kuznetsov:

надо было весь код привести..

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

PS/ форум неплохо развивает телепатические способности, что должно положительно влиять на торговлю. Так скоро можно вообще от роботов отказаться :-)

Прошу прощения, думал будет достаточно. Привожу весь код:

#property copyright ""
#property link      ""
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   ButtonCreate_UP();
   
   if(ObjectGet("Name_UP",OBJPROP_STATE)==true)
   {
   ObjectSetInteger(0,"Name_Down",OBJPROP_STATE,false);
   ChartRedraw(0);
   ObjectCreate(0,"UP",OBJ_HLINE,0,0,Bid);
   ObjectSetInteger(0,"UP",OBJPROP_COLOR,clrMidnightBlue);
   ObjectSetInteger(0,"UP",OBJPROP_STYLE,STYLE_DASHDOT);
   ObjectCreate(0,"SLUP",OBJ_HLINE,0,0,Bid-383*Point);
   ObjectSetInteger(0,"SLUP",OBJPROP_COLOR,clrCrimson);
   ObjectSetInteger(0,"SLUP",OBJPROP_STYLE,STYLE_DASHDOT);
   ObjectCreate(0,"TPUP",OBJ_HLINE,0,0,Bid+621*Point);
   ObjectSetInteger(0,"TPUP",OBJPROP_COLOR,clrSeaGreen);
   ObjectSetInteger(0,"TPUP",OBJPROP_STYLE,STYLE_DASHDOT);
   }
   if(ObjectGet("Name_UP",OBJPROP_STATE)==false)
   {
   ObjectDelete(0,"UP");
   ObjectDelete(0,"SLUP");
   ObjectDelete(0,"TPUP");
   }
      ButtonCreate_Down();
   
   if(ObjectGet("Name_Down",OBJPROP_STATE)==true)
   {
   ObjectSetInteger(0,"Name_UP",OBJPROP_STATE,false);
   ChartRedraw(0);
   ObjectCreate(0,"Down",OBJ_HLINE,0,0,Bid);
   ObjectSetInteger(0,"Down",OBJPROP_COLOR,clrMidnightBlue);
   ObjectSetInteger(0,"Down",OBJPROP_STYLE,STYLE_DASHDOT);
   ObjectCreate(0,"SLDown",OBJ_HLINE,0,0,Bid+383*Point);
   ObjectSetInteger(0,"SLDown",OBJPROP_COLOR,clrCrimson);
   ObjectSetInteger(0,"SLDown",OBJPROP_STYLE,STYLE_DASHDOT);
   ObjectCreate(0,"TPDown",OBJ_HLINE,0,0,Bid-621*Point);
   ObjectSetInteger(0,"TPDown",OBJPROP_COLOR,clrSeaGreen);
   ObjectSetInteger(0,"TPDown",OBJPROP_STYLE,STYLE_DASHDOT);
   }
   if(ObjectGet("Name_Down",OBJPROP_STATE)==false)
   {
   ObjectDelete(0,"Down");
   ObjectDelete(0,"SLDown");
   ObjectDelete(0,"TPDown");
   }

   
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"Name_UP");
   ObjectDelete(0,"Name_Down");
  }
//+------------------------------------------------------------------+
//+******************************************************************+ 
//| Создает кнопку                                                   | 
//+******************************************************************+ 
bool ButtonCreate_UP(const long              chart_ID=0,                  // ID графика 
                     const string            name="Name_UP",              // имя кнопки 
                     const int               sub_window=0,                // номер подокна 
                     const int               x=500,                       // координата по оси X 
                     const int               y=657,                       // координата по оси Y 
                     const int               width=70,                    // ширина кнопки 
                     const int               height=43,                   // высота кнопки 
                     const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER,    // угол графика для привязки 
                     const string            text="Up",                   // текст 
                     const string            font="Cambira",              // шрифт 
                     const int               font_size=11,                // размер шрифта 
                     const color             clr=clrBlack,                // цвет текста 
                     const color             back_clr=clrMediumSeaGreen,  // цвет фона 
                     const color             border_clr=clrNONE,          // цвет границы 
                     const bool              state=false,                 // нажата/отжата 
                     const bool              back=false,                  // на заднем плане 
                     const bool              selection=false,             // выделить для перемещений 
                     const bool              hidden=true)                 // скрыт в списке объектов 
  {
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим кнопку 
   if(ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0)) 
     {  
//--- установим координаты кнопки 
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); 
//--- установим размер кнопки 
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); 
//--- установим угол графика, относительно которого будут определяться координаты точки 
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); 
//--- установим текст 
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 
//--- установим шрифт текста 
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font); 
//--- установим размер шрифта 
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); 
//--- установим цвет текста 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим цвет фона 
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); 
//--- установим цвет границы 
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- переведем кнопку в заданное состояние 
   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); 
//--- включим (true) или отключим (false) режим перемещения кнопки мышью 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
     } 
//--- успешное выполнение 
   return(true); 
  }
//***********************************************************************************************************************
//***********************************************************************************************************************
bool ButtonCreate_Down(const long              chart_ID=0,                  // ID графика 
                       const string            name="Name_Down",            // имя кнопки 
                       const int               sub_window=0,                // номер подокна 
                       const int               x=570,                       // координата по оси X 
                       const int               y=657,                       // координата по оси Y 
                       const int               width=70,                    // ширина кнопки 
                       const int               height=43,                   // высота кнопки 
                       const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER,    // угол графика для привязки 
                       const string            text="Down",                 // текст 
                       const string            font="Cambira",              // шрифт 
                       const int               font_size=11,                // размер шрифта 
                       const color             clr=clrBlack,                // цвет текста 
                       const color             back_clr=clrFireBrick,       // цвет фона 
                       const color             border_clr=clrNONE,          // цвет границы 
                       const bool              state=false,                 // нажата/отжата 
                       const bool              back=false,                  // на заднем плане 
                       const bool              selection=false,             // выделить для перемещений 
                       const bool              hidden=true)                 // скрыт в списке объектов 
  {
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим кнопку 
   if(ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0)) 
     {  
//--- установим координаты кнопки 
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); 
//--- установим размер кнопки 
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); 
//--- установим угол графика, относительно которого будут определяться координаты точки 
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); 
//--- установим текст 
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 
//--- установим шрифт текста 
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font); 
//--- установим размер шрифта 
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); 
//--- установим цвет текста 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим цвет фона 
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); 
//--- установим цвет границы 
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- переведем кнопку в заданное состояние 
   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); 
//--- включим (true) или отключим (false) режим перемещения кнопки мышью 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
     } 
//--- успешное выполнение 
   return(true); 
  }
 
ELDAR133:

Прошу прощения, думал будет достаточно. Привожу весь код:

Совершенно неправильная логика.

Кнопки создавать надо в OnInit а реагировать на нажатие в OnChartEvent

Вот кусок моего кода. Следить за скобками я не буду, главное откуда взято и что сделано

void OnChartEvent(const int id,
                  const long & lparam,
                  const double & dparam,
                  const string & sparam)
 {
  if(id == CHARTEVENT_OBJECT_CLICK)
   {
    if(sparam == prefix + "BUY") // Если клик по кнопке BUY
     {
      if(ObjectGetInteger(0, sparam, OBJPROP_STATE) == true)// Если нажата кнопка BUY
       {
        ObjectSetInteger(0, prefix + "BUY", OBJPROP_BGCOLOR, clrDimGray);  // поменять ей цвет
        ObjectSetInteger(0, prefix + "SELL", OBJPROP_STATE, false);        // отжать кнопку SELL
        ObjectSetInteger(0, prefix + "SELL", OBJPROP_BGCOLOR, clrDimGray); // и поменять ей цвет
        return;
       }
 
Alexey Viktorov:

Совершенно неправильная логика.

Кнопки создавать надо в OnInit а реагировать на нажатие в OnChartEvent

Вот кусок моего кода. Следить за скобками я не буду, главное откуда взято и что сделано

Я не программист), но за критику, отклик и пример Спасибо БОЛЬШОЕ!

Теперь все работает!

 
ELDAR133:

Я не программист), но за критику, отклик и пример Спасибо БОЛЬШОЕ!

Теперь все работает!

Да это и не похоже на критику. А в качестве критики вопрос такой: Зачем для создания кнопок две функции, по одной на каждую кнопку? Посмотрите какая в них разница. Имя, координата Х и координата Y. Беглым взглядом я больше ничего не увидел.

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