버튼 도전! - 페이지 7

 
Karputov Vladimir :
아마도 테스트 코드를 첨부할 시간입니다. 이렇게 하면 실험하기가 더 쉬워집니다.

여기

 //+------------------------------------------------------------------+
//|                                                       Button.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   ButtonCreate( 0 , "A" , 0 , 20 , 50 , 100 , 20 , CORNER_LEFT_UPPER , "Button A" );
   ButtonCreate( 0 , "B" , 0 , 20 , 80 , 100 , 20 , CORNER_LEFT_UPPER , "Button B" );

   if (( bool ) ObjectGetInteger ( 0 , "A" , OBJPROP_STATE )== true )
       ObjectSetInteger ( 0 , "B" , OBJPROP_STATE , false );

   if (( bool ) ObjectGetInteger ( 0 , "B" , OBJPROP_STATE )== true )
       ObjectSetInteger ( 0 , "A" , OBJPROP_STATE , false );

  }
//+------------------------------------------------------------------+
bool ButtonCreate( const long               chart_ID= 0 ,               // ID графика
                   const string             name= "Button" ,             // имя кнопки
                   const int                sub_window= 0 ,             // номер подокна
                   const int                x= 0 ,                       // координата по оси X
                   const int                y= 0 ,                       // координата по оси Y
                   const int                width= 50 ,                 // ширина кнопки
                   const int                height= 18 ,                 // высота кнопки
                   const ENUM_BASE_CORNER   corner= CORNER_LEFT_UPPER , // угол графика для привязки
                   const string             text= "Button" ,             // текст
                   const string             font= "Arial" ,             // шрифт
                   const int                font_size= 10 ,             // размер шрифта
                   const color              clr= clrBlack ,             // цвет текста
                   const color              back_clr= C'236,233,216' ,   // цвет фона
                   const color              border_clr= clrNONE ,       // цвет границы
                   const bool               state= false ,               // нажата/отжата
                   const bool               back= false ,               // на заднем плане
                   const bool               selection= false ,           // выделить для перемещений
                   const bool               hidden= true ,               // скрыт в списке объектов
                   const long               z_order= 0 )                 // приоритет на нажатие мышью
  {
//--- сбросим значение ошибки
   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);
       //--- установим приоритет на получение события нажатия мыши на графике
       ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
     }
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+

해결책이 있기를 바랍니다..

 
Vladimir Pastushak :

시간을 어디에 쓸까? 각 버튼에 시간을 저장할 변수를 만드시겠습니까?

모두 감사합니다. 문제가 해결되었습니다. 더 쉬운 방법을 찾았습니다. 앉아서 궁금해...

TS는 두 번째 페이지에서 솔루션을 찾았습니다. https://www.mql5.com/en/forum/64408/page2#comment_1923439

그리고 공유하지 않았다

Задача с кнопками !
Задача с кнопками !
  • www.mql5.com
Задача : При нажатии на любую из кнопок предыдущая нажатая кнопка должна отжаться. - Страница 2 - Категория: общее обсуждение
 
Event :

TS는 두 번째 페이지에서 솔루션을 찾았습니다. https://www.mql5.com/en/forum/64408/page2#comment_1923439

그리고 공유하지 않았다

누군가 더 나은 것을 제안 할 수 있습니까?
 
물론 미안하지만 나는 항상 코드에 놀란다.
 bool b;

if (b== true )
   ...

나는 그것을 추가하고 싶습니다 :
 bool b;

if (b== true )
  {
  ...
  }
else
  {
   if (b== false )
     ...
   else
     // не true и не false - что-то другое
  }
 
Ilyas :
물론 미안하지만 나는 항상 코드에 놀란다.

나는 그것을 추가하고 싶습니다 :
이것은 테스트 용 샘플이며 결함을 찾지 마십시오 ...
 
Vladimir Pastushak :
테스터에서 작동하지 않습니다 ...
무슨 터미널이야? MT5에서는 테스터에서 타이머가 작동하여 확인할 수 있습니다. MT4에서는 타이머도 작동하지 않습니다((
 

하나의 버튼만 눌러지기 때문에 하나의 정적 변수 를 생략할 수 있습니다.

누른 버튼이 기억되고 각 틱마다 비교가 있습니다. 차이가 있으면 버튼이 메모리에서 해제되고 새 값이 저장됩니다.

 
그리고 모든 간단한 2x2 솔루션이 고문과 함께 어디론가 사라졌습니다...
 
bool stateA = false;
bool stateB = false;
bool stateC = false;

int init()
{
   ButtonCreate( 0, "A", 0, 20, 50, 100, 20, CORNER_LEFT_UPPER, "Button A" );
   ButtonCreate( 0, "B", 0, 20, 80, 100, 20, CORNER_LEFT_UPPER, "Button B" );
   ButtonCreate( 0, "C", 0, 20, 110, 100, 20, CORNER_LEFT_UPPER, "Button C" );
   
   return 0;
}

void OnTick()
{
   if( stateA != (bool)ObjectGetInteger( 0, "A", OBJPROP_STATE ) )
   {
      stateA = true;
      stateB = false;
      stateC = false;
      ObjectSetInteger( 0, "B", OBJPROP_STATE, false );
      ObjectSetInteger( 0, "C", OBJPROP_STATE, false );
   }
   
   if( stateB != (bool)ObjectGetInteger( 0, "B", OBJPROP_STATE ) )
   {
      stateA = false;
      stateB = true;
      stateC = false;
      ObjectSetInteger( 0, "A", OBJPROP_STATE, false );
      ObjectSetInteger( 0, "C", OBJPROP_STATE, false );
   }
   
   if( stateC != (bool)ObjectGetInteger( 0, "C", OBJPROP_STATE ) )
   {
      stateA = false;
      stateB = false;
      stateC = true;
      ObjectSetInteger( 0, "A", OBJPROP_STATE, false );
      ObjectSetInteger( 0, "B", OBJPROP_STATE, false );
   }
}
 
static int t=0;

void OnTick()
{
   ButtonCreate( 0, "A", 0, 20, 50, 100, 20, CORNER_LEFT_UPPER, "Button A" );
   ButtonCreate( 0, "B", 0, 20, 80, 100, 20, CORNER_LEFT_UPPER, "Button B" );
   ButtonCreate( 0, "C", 0, 20, 110, 100, 20, CORNER_LEFT_UPPER, "Button C" );
   
   if( (bool)ObjectGetInteger( 0, "A", OBJPROP_STATE ) && t!=0)
   {
      t=0;
      ObjectSetInteger( 0, "B", OBJPROP_STATE, false );
      ObjectSetInteger( 0, "C", OBJPROP_STATE, false );
   }
   
   if( stateB != (bool)ObjectGetInteger( 0, "B", OBJPROP_STATE ) && t!=1 )
   {
      t=1;
      ObjectSetInteger( 0, "A", OBJPROP_STATE, false );
      ObjectSetInteger( 0, "C", OBJPROP_STATE, false );
   }
   
   if( stateC != (bool)ObjectGetInteger( 0, "C", OBJPROP_STATE ) && t!=2 )
   {
      t=2;
      ObjectSetInteger( 0, "A", OBJPROP_STATE, false );
      ObjectSetInteger( 0, "B", OBJPROP_STATE, false );
   }
}