Как совместить функцию в OnTick и OnChartEvent ??? возможно ли? - страница 2

 
иными словами нужно чтобы в:
//+------------------------------------------------------------------+
void OnTick()
  {
   
  }
находился:

OnChartEventt()
в котором находился: 
but();


Или же как можно такое осуществить? я просто только так понимаю, но у мня мало опыта поэтому и решил спросить у знающих

 
Dmitry Ivkin:

Добрый день уважаемые программисты, прошу вас помочь мне разобраться)
Вопрос заключается в следующем:
нужно переместить: 

в 

при условии что это всё должно находиться в:

И я не могу понять как это осуществить, кидаю but(); в OnChartEvent но тогда не правильная работа, нужно и туда и туда
Кому не сложно пожалуйста помогите)))


Это какой объект?

if(id==CHARTEVENT_OBJECT_CLICK && sparam==Prefix+"M1")
 
Alexey Viktorov:

Это какой объект?

эта кнопка, я в неё попытался запихать весь код панели))) но т.к она(кнопка) находится в: OnChartEvent  следовательно  сама панель не работает правильно т.к должна находиться в  OnTick()

 
Dmitry Ivkin:

эта кнопка, я в неё попытался запихать весь код панели))) но т.к она(кнопка) находится в: OnChartEvent  следовательно  сама панель не работает правильно т.к должна находиться в  OnTick()

Нажатие кнопки в OnTick контролируется такой функцией

ObjectGetInteger(0, Prefix+"М1", OBJPROP_STATE)

Если эта функция вернула true значит кнопка нажата. После выполнения того, что должно выполняться по нажатию на кнопку, её надо вернуть в отжатое положение функцией 

ObjectSetInteger(0, Prefix+"М1", OBJPROP_STATE, false);
И даже в OnChartEvent с моей точки зрения, лучше использовать контроль состояния кнопки, а не клик по объекту.
 
Alexey Viktorov:

Нажатие кнопки в OnTick контролируется такой функцией

Если эта функция вернула true значит кнопка нажата. После выполнения того, что должно выполняться по нажатию на кнопку, её надо вернуть в отжатое положение функцией 

И даже в OnChartEvent с моей точки зрения, лучше использовать контроль состояния кнопки, а не клик по объекту.

Спасибо что не бросили меня) 

тоесть по вашим словам мне в данном случае не нужно использовать OnChartEvent
а просто в OnTick поставить ObjectGetInteger(0, Prefix+"М1", OBJPROP_STATE)

смотрите клик по кнопки в 
OnChartEvent обрабатывается так:

//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if (id==CHARTEVENT_OBJECT_CLICK){
      if (sparam=="knopka"){
        if(GetState("knopka")){
           ляляляляля                          
        }
      }
   }
}

Подскажите пожалуйста подобрый образец примера только не для OnChartEvent а для OnTick 

 
я как не пытался поставить кнопку в онтик всё время получалось что сама кнопка меню переставала работать
 
Dmitry Ivkin:

Спасибо что не бросили меня) 

тоесть по вашим словам мне в данном случае не нужно использовать OnChartEvent
а просто в OnTick поставить ObjectGetInteger(0, Prefix+"М1", OBJPROP_STATE)

смотрите клик по кнопки в 
OnChartEvent обрабатывается так:

Подскажите пожалуйста подобрый образец примера только не для OnChartEvent а для OnTick 

if(ObjectGetInteger(0, "knopka", OBJPROP_STATE))
 {
  // Если надо проверить ещё и надпись на кнопке, вставить соответствующую проверку
  // ляляляляля
  ObjectSetInteger(0, "knopka", OBJPROP_STATE, false);
 }

И ВСЁ...

А уж отказываться совсем от OnChartEvent или нет, решать только вам. Я не изучал весь код. Но как-бы не сделали состояние кнопки после нажатия надо всегда возвращать в отжатое состояние. Иначе кнопка будет работать то по первому нажатию, то после второго.

knopka это имя объекта при его создании.
 
Alexey Viktorov:

И ВСЁ...

А уж отказываться совсем от OnChartEvent или нет, решать только вам. Я не изучал весь код. Но как-бы не сделали состояние кнопки после нажатия надо всегда возвращать в отжатое состояние. Иначе кнопка будет работать то по первому нажатию, то после второго.

knopka это имя объекта при его создании.

Спасибо что ответили, неужели так всё просто, понимаете у меня то как раз и была проблема что кнопка вообще не нажималась, просто застыла

Могли бы еще помочь:
кнопка(она у меня из 2-х картинок) у меня создаётся вот так:

int OnInit()
  { ButtonPicture(0,"Menu",0,330,8,"::Menu1.bmp","::Menu1.bmp",76,16,0,0,false,CORNER_LEFT_UPPER,ANCHOR_CENTER,clrBlack,STYLE_SOLID,1,false,false,true,1                 
  );

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

void OnTick()
  {
if(ObjectGetInteger(0, "Menu", OBJPROP_STATE))                          //кнопка для показа кнопки 2
        {
            ObjectSetInteger(0,"Menu2",OBJPROP_XDISTANCE,330); //координаты 2-й кнопки
            ObjectSetInteger(0,"Menu2",OBJPROP_YDISTANCE,24);  //координаты 2-й кнопки
            ObjectSetInteger(0, "Menu", OBJPROP_STATE, false);         //в прежнее состоянии кнопки1
        }
  }


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

Но пока я хочу понять как сделать простой показ на примере 1-й кнопки(как в вашем примере)

 
не могу понять, тот вариант который выше он как я понял работает(я может ошибаюсь) но у меня по нажатию кнопки проходит примерно 1-2-3  минуты после которого показывается 2-я кнопка, это так и должно быть чтоли??? Пожалусйста подправьте если ошибаюсь, как можно получить быстро реагирование(как только нажал тут же чтобы выполнилось действие) в данном случае показалась 2-я кнопка
 
Dmitry Ivkin:

В таком случае вторая кнопка в общем-то и не нужна и возвращать кнопке отжатое состояние не надо. Получится что если клик по кнопке переводит её в состояние "нажата", то сверху ставим картинку 1. Второе нажатие переводит кнопку в состояние отжата и меняет на картинку 2. Или наоборот... как душе угодно. Соответственно таким образом будут выполняться два разных кода после каждого нажатия на кнопку.