Помогите сохранить состояние положение кнопки - страница 3

 
Alexey Viktorov:

А почему такое решение? Не правильней-ли будет

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

#property copyright "Copyright 2010"
#property link      ""
#property version   "1.00"
#property strict
#property indicator_chart_window


extern long X=1112; //Смещение меню по Х
extern long Y=0; //Смещение меню по Y
long X1,X2,Y1,Y2; //Координаты меню
bool ShowMenu=false;//Есть или нет меню на чарте
int Widht=50;//Ширина элемента меню
int Height=20;//Высота элемента меню
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);//Устанавливаем отслеживание координат мышки на чарте
//Пересчитаем координаты для реагирования
   X1=X; Y1=Y; X2=X+Widht; Y2=Y+Height;  
   EventSetMillisecondTimer(100);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

//--- return value of prev_calculated for next call
   return(rates_total);
  }
  
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // идентификатор события  
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam) // параметр события типа string
  {
  
//Если мышка в границах реагирования то реагируем
    if(id==CHARTEVENT_MOUSE_MOVE && lparam>=X1 && lparam<=X2 && dparam>=Y1 && dparam<=Y2)
     {
      if(!ShowMenu){CreateMenu();}//Если меню нет на чарте то создаём его
     }
//Если мышка вне границ реагирования то проверяем
   if(id==CHARTEVENT_MOUSE_MOVE && (lparam<X1-237 || lparam>X2 || dparam<Y1 || dparam>Y2))
     {
      if(ShowMenu){DeleteMenu();}//Если меню есть на чарте то удаляем
     }
  }
//+------------------------------------------------------------------+
void DeleteMenu()
  {
   ObjectDelete("H1");
//Пересчитаем координаты реагирования
   Y2=Y+Height;
   ShowMenu=false;
  }
//+------------------------------------------------------------------+
void CreateMenu()
  {
   PutButton("H1",191,27,"",false);
   Y2=Y+364+46;
   //X2=X400+Widht;
   ShowMenu=true;
  }
  
void PutButton(string name,int x,int y,string text,bool state)
  {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
//--- установим координаты кнопки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
   ObjectSetInteger(0,name,OBJPROP_XSIZE,190);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,25);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,9);
//--- установим цвет текста
   ObjectSetInteger(0,name,OBJPROP_COLOR,Black);
//--- установим цвет фона
   //ObjectSetInteger(0,name,OBJPROP_BGCOLOR,ChartGetInteger(0,CHART_COLOR_BACKGROUND));
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,C'245,245,245');
//--- установим цвет границы
   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,C'125,125,125');
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,false);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(0,name,OBJPROP_ZORDER,0);
//--- переведем кнопку в заданное состояние
   ObjectSetInteger(0,name,OBJPROP_STATE,state);
  }  
 
vebster005:

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

Я следил за темой с самого начала, но так и не понял что в вашем понимании положение кнопки. Это координаты на графике или это состояние, нажата\отжата?

Потом я не понимаю зачем для нажатия кнопки вы используете CHARTEVENT_MOUSE_MOVE вместо CHARTEVENT_OBJECT_CLICK

Если хотите разобраться, я к вашим услугам. Если-же просто написать, то это не ко мне.

 
Alexey Viktorov:

Я следил за темой с самого начала, но так и не понял что в вашем понимании положение кнопки. Это координаты на графике или это состояние, нажата\отжата?

Потом я не понимаю зачем для нажатия кнопки вы используете CHARTEVENT_MOUSE_MOVE вместо CHARTEVENT_OBJECT_CLICK

Если хотите разобраться, я к вашим услугам. Если-же просто написать, то это не ко мне.

Смотрите, я пытаюсь добиться подобие меню, тобишь наводим на нужное место, показывается меню(в данном случае кнопка) далее уже по нажатию кнопки что либо происходит, так вот, если навести на нужное место показывается и вправду кнопка, но вот если нажать на неё(тобишь активировать кнопку) далее если убрать курсор и заного поднести на нужное место тогда кнопка уже не активка! тобишь её нужно как то сохранить, если бы не было такого действия(поднести дабы показалась кнопка) а просто нажать -->показалась кнопка --> нажали еще другая показалась и так далее

 
vebster005:

Смотрите, я пытаюсь добиться подобие меню, тобишь наводим на нужное место, показывается меню(в данном случае кнопка) далее уже по нажатию кнопки что либо происходит, так вот, если навести на нужное место показывается и вправду кнопка, но вот если нажать на неё(тобишь активировать кнопку) далее если убрать курсор и заного поднести на нужное место тогда кнопка уже не активка! тобишь её нужно как то сохранить, если бы не было такого действия(поднести дабы показалась кнопка) а просто нажать -->показалась кнопка --> нажали еще другая показалась и так далее

Я дал полноценный ответ в том сообщении которое вы цитировали, но не проверили как это работает.

Ответьте себе на такие вопросы:

Если кнопку надо только скрыть, то зачем её удалять???

Зачем 100500 раз пересчитывать координаты кнопки и "меню"?

 
Alexey Viktorov:

Я дал полноценный ответ в том сообщении которое вы цитировали, но не проверили как это работает.

Ответьте себе на такие вопросы:

Если кнопку надо только скрыть, то зачем её удалять???

Зачем 100500 раз пересчитывать координаты кнопки и "меню"?

стоп не понял вас,
Сначалом ы наводим курсор мышки дабы появилось меню (пока меню состоит из 1-й кнопки) далее мы нажимаем кнопку тобишь включаем что либо, потом же мы решаем отключить что либо а кнопка уже показывает что она не нажата!

Могли бы вы ответить, как сделать так чтобы мы вначале поставили статус кнопки - нажатое состояние, а в нажатом состоянии должно что-то показывать но если мы кидаем на график (ставим курсор мышки дабы появилось меню) и лицезрим что кнопка нажата - а информация которая должна выводится в начатом состоянии нет, и она появится если мы заново щелкним на кнопку

 
vebster005:

стоп не понял вас,
Сначалом ы наводим курсор мышки дабы появилось меню (пока меню состоит из 1-й кнопки) далее мы нажимаем кнопку тобишь включаем что либо, потом же мы решаем отключить что либо а кнопка уже показывает что она не нажата!

Могли бы вы ответить, как сделать так чтобы мы вначале поставили статус кнопки - нажатое состояние, а в нажатом состоянии должно что-то показывать но если мы кидаем на график (ставим курсор мышки дабы появилось меню) и лицезрим что кнопка нажата - а информация которая должна выводится в начатом состоянии нет, и она появится если мы заново щелкним на кнопку

В OnInit() создаём кнопку и больше нигде и никогда не вызываем функцию PutButton(). Сразу её прячем по моей подсказке на стр.2, затем при наведении мышки на "куда надо" по той-же подсказке кнопку показываем. По сути функции создания и удаления меню абсолютно лишние. Ну, разве-что так нравится, можно сделать и так. Только заменив удаление на скрытие, а создание на отображение объекта.

Вся проблема у вас в том, что кнопка создаётся со статусом отжата. Если-же вы упорно хотите удалять и создавать кнопку, то воспользуйтесь советом Федосеева, сохраняйте её состояние в GV и при очередном создании кнопки ставьте ей состояние которое было перед удалением.

И ещё одно замечание: Это

ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
надо делать исключительно с проверкой если объект не найден.
 
Alexey Viktorov:

В OnInit() создаём кнопку и больше нигде и никогда не вызываем функцию PutButton(). Сразу её прячем по моей подсказке на стр.2, затем при наведении мышки на "куда надо" по той-же подсказке кнопку показываем. По сути функции создания и удаления меню абсолютно лишние. Ну, разве-что так нравится, можно сделать и так. Только заменив удаление на скрытие, а создание на отображение объекта.

Вся проблема у вас в том, что кнопка создаётся со статусом отжата. Если-же вы упорно хотите удалять и создавать кнопку, то воспользуйтесь советом Федосеева, сохраняйте её состояние в GV и при очередном создании кнопки ставьте ей состояние которое было перед удалением.

И ещё одно замечание: Это

надо делать исключительно с проверкой если объект не найден.

Спасибо что отвечаете, с созданием и удалением (показать/скрыть) всё понятно, теперь же могли бы объяснить:
Мне нужно чтобы информация выводилась через кнопку, тобишь нажал кнопку - появилась информация, отжали - скрылась. С этим проблем нету
Проблема в том что я изначально делаю статус кнопки нажатой, а информация с нажатой кнопки не выводится. Она выведется только если я нажму любую другую кнопку,

Если можно приведите пример пожалуйста 

 
Сделайте координаты кнопки static и не парьтесь. При смене любых параметров графика (ТФ, даже валютная пара) кнопка будет позиционироваться одинаково, пока Вы не закроете график, либо явно не измените значения этих координат. Впервые увидел хоть какой-нибудь смысл в MQL-вском понимании режима управления памятью static ) 
 
Алексей Тарабанов:
Сделайте координаты кнопки static и не парьтесь. При смене любых параметров графика (ТФ, даже валютная пара) кнопка будет позиционироваться одинаково, пока Вы не закроете график, либо явно не измените значения этих координат. Впервые увидел хоть какой-нибудь смысл в MQL-вском понимании режима управления памятью static ) 

static  сбрасывается в индикаторах при смене тайма

 
Vitaly Muzichenko:

static  сбрасывается в индикаторах при смене тайма

Нет. Он это делает во всех языках программирования, кроме MQL. Пробуйте, если есть желание.