Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Сделал скриншот в MetaTrader? Поделись им с друзьями!
Imperium
17
Imperium 2016.09.22 17:17 

Есть панель. Объект "Edit" и поверх него объект "Button". Все нормально работает, но есть одно НО.... если под кнопкой (назовем - "объект панели") находится какой-либо иной объект ("объект графика"), например, индикаторная линия, или трендовая, то два (или более) быстрых клика на "объект панели" понимаются программой как двойной клик на "объект графика". Насколько я понимаю "zorder priority" имеет значение для одиночного клика, при двойном выставление приоритетов не помогает.

Очень прошу помогите советом как с этим бороться. Как можно сделать так чтобы объекты графика находящиеся под созданными юзером объектами (кнопками и т.п.) не реагировали на клики мыши. Заранее спасибо.

Alexey Volchanskiy
16611
Alexey Volchanskiy 2016.09.22 17:35  
Imperium:

Есть панель. Объект "Edit" и поверх него объект "Button". Все нормально работает, но есть одно НО.... если под кнопкой (назовем - "объект панели") находится какой-либо иной объект ("объект графика"), например, индикаторная линия, или трендовая, то два (или более) быстрых клика на "объект панели" понимаются программой как двойной клик на "объект графика". Насколько я понимаю "zorder priority" имеет значение для одиночного клика, при двойном выставление приоритетов не помогает.

Очень прошу помогите советом как с этим бороться. Как можно сделать так чтобы объекты графика находящиеся под созданными юзером объектами (кнопками и т.п.) не реагировали на клики мыши. Заранее спасибо.

Может Настройки-Объекты-Выделять объект по одиночному клику мышки?

Или обрабатывать OnChartEvent и там снимать выделение с линии? 

Imperium
17
Imperium 2016.09.22 18:04  
Alexey Volchanskiy:

Может Настройки-Объекты-Выделять объект по одиночному клику мышки?

Или обрабатывать OnChartEvent и там снимать выделение с линии? 

Спасибо за скорый ответ. Не совсем понял то что Вы имели ввиду под "снимать выделение с линии". Отвечу на то как понял ))

Дело в том что клик на кнопку может быть как одиночным так и повторяющимся в зависимости от обстоятельств (например кнопка изменения какого-либо числового параметра ордера, СЛ или ТП, например). Оптимальным было бы чтобы нажатие кнопки (одиночное или двойное) всегда относилось только к этой кнопке, а не к объекту под ней, так как объекты под ней могут быть самые разные (трендовая, идникаторная, мовинг, фибо... и т.д). С параметрами этих многочисленных объектов тоже не хотелось бы играться, так как к их вызову никаких нареканий нет, и даже хорошо бы чтобы этот вызов оставался прежним ВНЕ той небольшой площади графика которую покрывает кнопка.

Ihor Herasko
9018
Ihor Herasko 2016.09.22 19:01  

Да, есть некоторые проблемы с очередностью реакции объектов на клики мыши. Но, в основном, у меня все как-то решалось путем подкладывания панели под подобные объекты.

P. S. Панель - это OBJ_RECTANGLE_LABEL.

Alexey Viktorov
6678
Alexey Viktorov 2016.09.22 19:17  
А OBJPROP_SELECTED или OBJPROP_SELECTABLE к тем объектам которые внизу не поможет?
Alexey Volchanskiy
16611
Alexey Volchanskiy 2016.09.22 19:46  
Alexey Viktorov:
А OBJPROP_SELECTED или OBJPROP_SELECTABLE к тем объектам которые внизу не поможет?

Я это и имел в виду, но ТС видно с этими свойствами не работал.

Для ТС - при любом событии на графике вызывается OnChartEvent, в этой функции можно узнать, по какому объекту щелкнули, его свойства и много чего еще, смотрите справку. Я думаю, надо для объектов внизу OBJPROP_SELECTABLE выставлять в false, возможно, проверять OBJPROP_SELECTED. Надо проверить, сходу трудно сказать.

Вот пример вытаскивания свойств кнопок

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
    bool stateSell = false, stateBuy = false;

    if(id == CHARTEVENT_OBJECT_CLICK)
    {
        if(StringFind(sparam, "btnSellEnable") != -1) // btnSellEnable - имя объекта
        {
            if(TrButtons.GetPressedState(sparam, stateSell)) // TrButtons - мой класс, приводить не буду
            {
                if(TrButtons.GetPressedState("btnBuyEnable", stateBuy))
                {
                    if(stateBuy && stateSell)
                        TradeState = EnableAll;
                    if(stateBuy && !stateSell)
                        TradeState = EnableBuy;
                    if(!stateBuy && stateSell)
                        TradeState = EnableSell;
                    if(!stateBuy && !stateSell)
                        TradeState = DisableAll;
                    SmartDsp.SetTradeEnable(TradeState);
                }    
            }    
        }    
        if(StringFind(sparam, "btnBuyEnable") != -1) 
        {
            if(TrButtons.GetPressedState(sparam, stateBuy))
            {
                if(TrButtons.GetPressedState("btnSellEnable", stateSell))
                {
                    if(stateBuy && stateSell)
                        TradeState = EnableAll;
                    if(stateBuy && !stateSell)
                        TradeState = EnableBuy;
                    if(!stateBuy && stateSell)
                        TradeState = EnableSell;
                    if(!stateBuy && !stateSell)
                        TradeState = DisableAll;
                    SmartDsp.SetTradeEnable(TradeState);
                }    
            }    
        }    
        ChartRedraw();    
    }      
}

 

 

Imperium
17
Imperium 2016.09.22 20:07  
Ihor Herasko:

Да, есть некоторые проблемы с очередностью реакции объектов на клики мыши. Но, в основном, у меня все как-то решалось путем подкладывания панели под подобные объекты.

P. S. Панель - это OBJ_RECTANGLE_LABEL.

Здравствуйте Игорь. Большое Вам спасибо за то что Вы меня уже пару раз очень сильно выручили (правда был я тогда под другим ником). Надеюсь что поможете советом и на этот раз.

Дело в том что моя панель использует OBJ_EDIT и OBJ_BUTTON. Чаще всего располагается в подокне, поверх какого-нибудь индикатора (Stoch, MACD, etc). Вот и получается что никогда не знаешь есть в данный момент под одной из кнопок линия индикатора или нет. Никаким образом сделать либо кнопки либо объект EDIT непрозрачными для кликов у меня не получилось. Поэтому при измении например парматера SL или TP, требующем несколько частых кликов, выскакивает окно параметров индикатора. (((

Готов к любому способу решения проблемы, кроме необходимости переписывать эксперта на корню )

Imperium
17
Imperium 2016.09.22 20:48  
Alexey Viktorov:
А OBJPROP_SELECTED или OBJPROP_SELECTABLE к тем объектам которые внизу не поможет?
Alexey Volchanskiy:

Я это и имел в виду, но ТС видно с этими свойствами не работал.

Для ТС - при любом событии на графике вызывается OnChartEvent, в этой функции можно узнать, по какому объекту щелкнули, его свойства и много чего еще, смотрите справку. Я думаю, надо для объектов внизу OBJPROP_SELECTABLE выставлять в false, возможно, проверять OBJPROP_SELECTED. Надо проверить, сходу трудно сказать.

Вот пример вытаскивания свойств кнопок

Большое всем спасибо. Игорь навел меня на мысль, попробовал - получилось. Алексея действительно не так понял, но дело оказалось немного в другом. Опишу, может кому-то понадобится.

Так вот, OBJPROP_SELECTED или OBJPROP_SELECTABLE изначально и преднамеренно были установлены на FALSE. Не хотелось чтобы объекты могли быть выделены при любых обстоятельствах. Оказалось что именно поэтому двойные клики, так сказать, проходили насквозь. Как только изменил OBJPROP_SELECTABLE на TRUE двойной клик стал выделять объект, но, по крайней мере, то что под ним он уже не трогает. А это было главное.  Прописал немедленное отключение выделения объекта панели, и все.

Еще раз спасибо что помогли.

P.S. Алексей, то что Вы предоставили намного превосходит мои знания предмета ))) но тем не менее благодарю.

Alexey Volchanskiy
16611
Alexey Volchanskiy 2016.09.23 11:01  
Imperium:


P.S. Алексей, то что Вы предоставили намного превосходит мои знания предмета ))) но тем не менее благодарю.

Лиха беда начало, успехов )
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий