Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1173
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Создал свой класс CAppDialogPTR - наследник от CAppDialog - подскажите как правильно переопределить объекты m_background, m_caption ... из класса CDialog для доступа к ним из своего класса?
Dialog.mqh
Никак. Эти объекты закрыты от непосредственного изменения в Вашем классе, о чем говорит ключевое слово private. Работать с ними напрямую нельзя. Используйте методы класса CDialog которые работают с этими полями.
Никак. Эти объекты закрыты от непосредственного изменения в Вашем классе, о чем говорит ключевое слово 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);"Допустим.
У созданного экземпляра класса 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. Это грубо и тупо, но сработает. Другие варианты едва ли - слишком жесткий код.
Получить доступ к контралам адресно через коллекцию m_controls Вы все равно не сможете, потому что она также закрыта, к тому же не известно какой именно индекс соответствует тому или иному контролу. Тут идея в том, что CDialog закрывает доступ к элементами из которых он состоит, но дает управлять основными свойствами в согласованном виде. Например обращаться к m_caption и менять его текст напрямую мы не можем, зато можем изменить его текст через метод Caption(const string text).
То, что Вы хотите это хак по сути. В принципе при использовании любой поделки от MQ возникает желание сделать тот или иной хак, поэтому тут Вы не одиноки. Наверное самым простым способом будет скопировать либу в отдельный каталог и переместить private секцию в protected. Это грубо и тупо, но сработает. Другие варианты едва ли - слишком жесткий код.
Изменить исходники MQ и вытащить методы в публичные понятно что не наш метод :).
Но я могу обратиться в свойствам Caption после объявление глобальной переменной panel:
Но мало того что это както не красиво выглядит, так этот код за классом CAppDialogPTR. А как аналогично мне сделать тоже самое внутри класса CAppDialogPTR ?
Изменить исходники MQ и вытащить методы в публичные понятно что не наш метод :)
если не хотите так, то все элементы панели CAppDialog формируются графическими обьектами, нужно знать только имя обьекта и после создания экземпляра класса CAppDialog напишите метод который перекрасит бордеры CAppDialog в нужный Вам цвет
если не хотите так, то все элементы панели CAppDialog формируются графическими обьектами, нужно знать только имя обьекта и после создания экземпляра класса CAppDialog напишите метод который перекрасит бордеры CAppDialog в нужный Вам цвет
через this. можно перенести код с поиском нужного контрола внутр класса. Это работает.
А вот как зная имя объекта как к нему обратиться я не знаю.
через this. можно перенести код с поиском нужного контрола внутр класса. Это работает.
А вот как зная имя объекта как к нему обратиться я не знаю.
https://www.mql5.com/ru/docs/objects/objectsetinteger
но по моему проще для своих задач все таки переопределить макроподстановкой все закрытые методы и поля в публичные
https://www.mql5.com/ru/docs/objects/objectsetinteger
но по моему проще для своих задач все таки переопределить макроподстановкой все закрытые методы и поля в публичные
ObjectSetInteger - работает :), я про него забыл совсем.
Можете пример для #define private public - что то я не понял как метод переопределить. Это в своем классе надо делать?
ObjectSetInteger - работает :), я про него забыл совсем.
Можете пример для #define private public - что то я не понял как метод переопределить. Это в своем классе надо делать?
Игорь, да работает. Спасибо.