Интересует правильное применение указателей.
Интересует правильное применение указателей.
следующая глава
https://docs.mql4.com/ru/basis/types/object_pointers
- docs.mql4.com
В справке есть пример реализации пользовательских типов в котором используются указатели на функции.
Пользовательские типы - Типы данных - Основы языка - Справочник MQL4
При компиляции полного исходного кода примера, возникает ошибка в строке
'MyButton' - no one of the overloads can be applied to the function call
Подскажите, как правильно?
Добавьте метод
bool AddButton(MyButton *button){return(m_buttons.Add(button));m_buttons.Sort();};
по аналогии с существующем AddButton(MyButton &)
Добавьте метод
bool AddButton(MyButton *button){return(m_buttons.Add(button));m_buttons.Sort();};
по аналогии с существующем AddButton(MyButton &)
Благодарю!
В справке есть пример реализации пользовательских типов в котором используются указатели на функции.
Пользовательские типы - Типы данных - Основы языка - Справочник MQL4
При компиляции полного исходного кода примера, возникает ошибка в строке
'MyButton' - no one of the overloads can be applied to the function call
Подскажите, как правильно?
А код примера полностью перенесён в код программы?
Для MyButton есть public конструктор, который принимает параметры требуемых типов?
А код примера пример полностью перенесён в код программы?
Для MyButton есть public конструктор, который принимает параметры требуемых типов?
//+------------------------------------------------------------------+ //| Panel_Buttons.mq5 | //| Copyright 2017, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property description "Панель с несколькими кнопками CButton" #include <Controls\Dialog.mqh> #include <Controls\Button.mqh> //+------------------------------------------------------------------+ //| defines | //+------------------------------------------------------------------+ //--- indents and gaps #define INDENT_LEFT (11) // indent from left (with allowance for border width) #define INDENT_TOP (11) // indent from top (with allowance for border width) #define CONTROLS_GAP_X (5) // gap by X coordinate #define CONTROLS_GAP_Y (5) // gap by Y coordinate //--- for buttons #define BUTTON_WIDTH (100) // size by X coordinate #define BUTTON_HEIGHT (20) // size by Y coordinate //--- for the indication area #define EDIT_HEIGHT (20) // size by Y coordinate //--- создадим пользовательский тип функции typedef int(*TAction)(string,int); //+------------------------------------------------------------------+ //| Открывает файл | //+------------------------------------------------------------------+ int Open(string name,int id) { PrintFormat("Вызвана функция %s (name=%s id=%d)",__FUNCTION__,name,id); return(1); } //+------------------------------------------------------------------+ //| Сохраняет файл | //+------------------------------------------------------------------+ int Save(string name,int id) { PrintFormat("Вызвана функция %s (name=%s id=%d)",__FUNCTION__,name,id); return(2); } //+------------------------------------------------------------------+ //| Закрывает файл | //+------------------------------------------------------------------+ int Close(string name,int id) { PrintFormat("Вызвана функция %s (name=%s id=%d)",__FUNCTION__,name,id); return(3); } //+------------------------------------------------------------------+ //| Создадим свой класс кнопки с функцией обработки событий | //+------------------------------------------------------------------+ class MyButton: public CButton { private: TAction m_action; // обработчик событий графика public: MyButton(void){} ~MyButton(void){} //--- конструктор с указанием текста кнопки и указателя на функцию для обработки событий MyButton(string text,TAction act) { Text(text); m_action=act; } //--- установка собственной функции, которая будет вызываться из обработчика событий OnEvent() void SetAction(TAction act){m_action=act;} //--- стандартный обработчик событий графика virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam) override { if(m_action!=NULL && lparam==Id()) { //--- вызовем собственный обработчик m_action(sparam,(int)lparam); return(true); } else //--- вернем результат вызова обработчика из родительского класса CButton return(CButton::OnEvent(id,lparam,dparam,sparam)); } }; //+------------------------------------------------------------------+ //| Класс CControlsDialog | //| Назвначение: графическая панель для управления приложением | //+------------------------------------------------------------------+ class CControlsDialog : public CAppDialog { private: CArrayObj m_buttons; // массив кнопок public: CControlsDialog(void){}; ~CControlsDialog(void){}; //--- create virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) override; //--- добавление кнопки bool AddButton(MyButton &button){return(m_buttons.Add(GetPointer(button)));m_buttons.Sort();}; bool AddButton(MyButton *button){return(m_buttons.Add(button));m_buttons.Sort();}; protected: //--- создание кнопок bool CreateButtons(void); }; //+------------------------------------------------------------------+ //| Создание объекта CControlsDialog на графике | //+------------------------------------------------------------------+ bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) { if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) return(false); return(CreateButtons()); //--- } //+------------------------------------------------------------------+ //| Создание и добавление кнопок на панель CControlsDialog | //+------------------------------------------------------------------+ bool CControlsDialog::CreateButtons(void) { //--- расчет координат кнопок int x1=INDENT_LEFT; int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y); int x2; int y2=y1+BUTTON_HEIGHT; //--- добавим объекты кнопок вместе с указателями на функции AddButton(new MyButton("Open",Open)); //'MyButton' - no one of the overloads can be applied to the function call AddButton(new MyButton("Save",Save)); AddButton(new MyButton("Close",Close)); //'MyButton' - no one of the overloads can be applied to the function call //--- создадим кнопки графически for(int i=0;i<m_buttons.Total();i++) { MyButton *b=(MyButton*)m_buttons.At(i); x1=INDENT_LEFT+i*(BUTTON_WIDTH+CONTROLS_GAP_X); x2=x1+BUTTON_WIDTH; if(!b.Create(m_chart_id,m_name+"bt"+b.Text(),m_subwin,x1,y1,x2,y2)) { PrintFormat("Failed to create button %s %d",b.Text(),i); return(false); } //--- добавим каждую кнопку в контейнер CControlsDialog if(!Add(b)) return(false); } //--- succeed return(true); } //--- объявим объект на глобальном уровне, чтобы создать его автоматически при запуске программы CControlsDialog MyDialog; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- теперь создадим объект на графике if(!MyDialog.Create(0,"Controls",0,40,40,380,344)) return(INIT_FAILED); //--- запускаем приложение MyDialog.Run(); //--- успешная инициализация приложения return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- очистим комментарии при завершении работы приложения Comment(""); //--- destroy dialog MyDialog.Destroy(reason); } //+------------------------------------------------------------------+ //| Expert chart event function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, // event ID const long& lparam, // event parameter of the long type const double& dparam, // event parameter of the double type const string& sparam) // event parameter of the string type { //--- для событий графика вызываем обработчика из родительского класса (CAppDialog в данном случае) MyDialog.ChartEvent(id,lparam,dparam,sparam); }
вот полный код примера с исправлениями.
Оставшиеся ошибки выделены.
вот полный код примера с исправлениями.
Оставшиеся ошибки выделены.
Нужно переименовать функции Open и Close. Ведь это зарезервированные слова. По единичке хотя бы к ним добавьте.
Нужно переименовать функции Open и Close. Ведь это зарезервированные слова. По единичке хотя бы к ним добавьте.
Так и сделал. Странно что в справке привели именно такой пример.
Так и сделал. Странно что в справке привели именно такой пример.
Его из МQL5 перенесли как есть. Там Open и Close - незарезервированные слова.
Его из МQL5 перенесли как есть. Там Open и Close - незарезервированные слова.
Попробовал скомпилировать в 5. Компилятор выдает ошибку в строке
AddButton(new MyButton("Save",Save));
Как ни крути, пример не самый удачный.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В справке есть пример реализации пользовательских типов в котором используются указатели на функции.
Пользовательские типы - Типы данных - Основы языка - Справочник MQL4
При компиляции полного исходного кода примера, возникает ошибка в строке
'MyButton' - no one of the overloads can be applied to the function call
Подскажите, как правильно?