Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1173

 
Peter Vorobyev:
Создал свой класс CAppDialogPTR - наследник от CAppDialog -  подскажите как правильно переопределить объекты m_background, m_caption ... из класса  CDialog для доступа к ним из своего класса?

Dialog.mqh

Никак. Эти объекты закрыты от непосредственного изменения в Вашем классе, о чем говорит ключевое слово private. Работать с ними напрямую нельзя. Используйте методы класса CDialog которые работают с этими полями.

 
Vasiliy Sokolov:

Никак. Эти объекты закрыты от непосредственного изменения в Вашем классе, о чем говорит ключевое слово private. Работать с ними напрямую нельзя. Используйте методы класса CDialog которые работают с этими полями.

Допустим.

У созданного экземпляра класса CAppDialogPTR - есть контролы (класса  CWndContainer -> CWnd*             Control(const int ind)            const { return(dynamic_cast<CWnd *>(m_controls.At(ind))); }) через которые можно получить доступ к m_background, m_caption

1)  Какой синтаксис обращения (ссылки на память) на созданный объект?: 

"CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2);"
 
Peter Vorobyev:

Допустим.

У созданного экземпляра класса CAppDialogPTR - есть контролы (класса  CWndContainer -> CWnd*             Control(const int ind)            const { return(dynamic_cast<CWnd *>(m_controls.At(ind))); } ) через которые можно получить доступ к m_background, m_caption

1)  Какой синтаксис обращения (ссылки на память) на созданный объект?: 

Получить доступ к контралам адресно через коллекцию m_controls Вы все равно не сможете, потому что она также закрыта, к тому же не известно какой именно индекс соответствует тому или иному контролу. Тут идея в том, что CDialog закрывает доступ к элементами из которых он состоит, но дает управлять основными свойствами в согласованном виде. Например обращаться к m_caption и менять его текст напрямую мы не можем, зато можем изменить его текст через метод Caption(const string text).

То, что Вы хотите это хак по сути. В принципе при использовании любой поделки от MQ возникает желание сделать тот или иной хак, поэтому тут Вы не одиноки. Наверное самым простым способом будет скопировать либу в отдельный каталог и переместить private секцию в protected. Это грубо и тупо, но сработает. Другие варианты едва ли - слишком жесткий код.

 
Vasiliy Sokolov:

Получить доступ к контралам адресно через коллекцию m_controls Вы все равно не сможете, потому что она также закрыта, к тому же не известно какой именно индекс соответствует тому или иному контролу. Тут идея в том, что CDialog закрывает доступ к элементами из которых он состоит, но дает управлять основными свойствами в согласованном виде. Например обращаться к m_caption и менять его текст напрямую мы не можем, зато можем изменить его текст через метод Caption(const string text).

То, что Вы хотите это хак по сути. В принципе при использовании любой поделки от MQ возникает желание сделать тот или иной хак, поэтому тут Вы не одиноки. Наверное самым простым способом будет скопировать либу в отдельный каталог и переместить private секцию в protected. Это грубо и тупо, но сработает. Другие варианты едва ли - слишком жесткий код.

Изменить исходники MQ и вытащить методы в публичные понятно что не наш метод :).
Но я могу обратиться в свойствам Caption после объявление глобальной переменной panel:

CAppDialogPTR panel;

            int total=panel.ControlsTotal();
            for(int i=0;i<total;i++)
            {
               CWnd *_control=panel.Control(i);
               string _control_name=_control.Name();

               if(StringFind(_control_name,"Caption")>0)
               {
                  CEdit *_caption=(CEdit*)_control;
                  _caption.Text("test";
                  _caption.Color(clrRed);
                  ChartRedraw();
                  break;
               }
               
             }

Но мало того что это както не красиво выглядит, так этот код за классом CAppDialogPTR. А как аналогично мне сделать тоже самое внутри класса CAppDialogPTR ?
 

 

 
Peter Vorobyev:

Изменить исходники MQ и вытащить методы в публичные понятно что не наш метод :)

#define private public

если не хотите так, то все элементы панели CAppDialog формируются графическими обьектами, нужно знать только имя обьекта и после создания экземпляра класса CAppDialog напишите  метод который перекрасит бордеры  CAppDialog в нужный Вам цвет

 
Igor Makanu:

если не хотите так, то все элементы панели CAppDialog формируются графическими обьектами, нужно знать только имя обьекта и после создания экземпляра класса CAppDialog напишите  метод который перекрасит бордеры  CAppDialog в нужный Вам цвет

через this. можно перенести код с поиском нужного контрола внутр класса. Это работает.

А вот как зная имя объекта как к нему обратиться я не знаю. 

 
Peter Vorobyev:

через this. можно перенести код с поиском нужного контрола внутр класса. Это работает.

А вот как зная имя объекта как к нему обратиться я не знаю. 

https://www.mql5.com/ru/docs/objects/objectsetinteger

но по моему проще для своих задач все таки переопределить макроподстановкой все закрытые методы и поля в публичные 

 
Igor Makanu:

https://www.mql5.com/ru/docs/objects/objectsetinteger

но по моему проще для своих задач все таки переопределить макроподстановкой все закрытые методы и поля в публичные 

ObjectSetInteger - работает :), я про него забыл совсем.
Можете пример для  #define private public - что то я не понял как метод переопределить. Это в своем классе надо делать?

 
Peter Vorobyev:

ObjectSetInteger - работает :), я про него забыл совсем.
Можете пример для  #define private public - что то я не понял как метод переопределить. Это в своем классе надо делать?

#define private public
#include <Controls\Dialog.mqh>
// тут весь Ваш класс который наследуете от CAppDialog
#undef private
c undef поэкспериментируйте, можно после макроподстановки отменить ее и закрыть все теперь публичные методы CAppDialog в уже своем классе, чтобы в дальнейшем было удобно код писать
 
Igor Makanu:

Игорь, да работает. Спасибо.