ComboBox заранее заполняется данными. Следовательно обрабатывается событие ON_CHANGE.
А какой "правильности" Вы говорите? Что имеется в виду?
Karputov Vladimir:
я пока слабо ориентируюсь в событиях, поэтому мне сложно правильно сформулировать вопрос :) Как бы написать правильно.. наверно, лучше сделать готовый пример как я делаю и показать что это не работает
ComboBox заранее заполняется данными. Следовательно обрабатывается событие ON_CHANGE.
А какой "правильности" Вы говорите? Что имеется в виду?
Вот панель (эксперт) с одним ComboBox и обработка событий:
//+------------------------------------------------------------------+ //| ControlsComboBox.mq5 | //| Copyright 2015, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property description "Панель индикации и диалогов управления. Демонстрация работы класса CComboBox" #include <Controls\Dialog.mqh> #include <Controls\ComboBox.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 INDENT_RIGHT (11) // indent from right (with allowance for border width) #define INDENT_BOTTOM (11) // indent from bottom (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 //--- for group controls #define GROUP_WIDTH (150) // size by X coordinate #define LIST_HEIGHT (179) // size by Y coordinate #define RADIO_HEIGHT (56) // size by Y coordinate #define CHECK_HEIGHT (93) // size by Y coordinate //+------------------------------------------------------------------+ //| Class CControlsDialog | //| Usage: main dialog of the Controls application | //+------------------------------------------------------------------+ class CControlsDialog : public CAppDialog { private: CComboBox m_combo_box;; // CComboBox объект 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); //--- chart event handler virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); protected: //--- create dependent controls bool CreateComboBox(void); //--- handlers of the dependent controls events void OnChangeComboBox(void); }; //+------------------------------------------------------------------+ //| Event Handling | //+------------------------------------------------------------------+ EVENT_MAP_BEGIN(CControlsDialog) ON_EVENT(ON_CHANGE,m_combo_box,OnChangeComboBox) EVENT_MAP_END(CAppDialog) //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CControlsDialog::CControlsDialog(void) { } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CControlsDialog::~CControlsDialog(void) { } //+------------------------------------------------------------------+ //| Create | //+------------------------------------------------------------------+ 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); //--- create dependent controls if(!CreateComboBox()) return(false); //--- succeed return(true); } //+------------------------------------------------------------------+ //| Create the "ComboBox" element | //+------------------------------------------------------------------+ bool CControlsDialog::CreateComboBox(void) { //--- coordinates int x1=INDENT_LEFT; int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y)+ (BUTTON_HEIGHT+CONTROLS_GAP_Y)+ (EDIT_HEIGHT+CONTROLS_GAP_Y); int x2=x1+GROUP_WIDTH; int y2=y1+EDIT_HEIGHT; //--- create if(!m_combo_box.Create(m_chart_id,m_name+"ComboBox",m_subwin,x1,y1,x2,y2)) return(false); if(!Add(m_combo_box)) return(false); //--- fill out with strings for(int i=0;i<16;i++) if(!m_combo_box.ItemAdd("Item "+IntegerToString(i))) return(false); //--- succeed return(true); } //+------------------------------------------------------------------+ //| Event handler | //+------------------------------------------------------------------+ void CControlsDialog::OnChangeComboBox(void) { Comment(__FUNCTION__+" \""+m_combo_box.Select()+"\""); } //+------------------------------------------------------------------+ //| Global Variables | //+------------------------------------------------------------------+ CControlsDialog ExtDialog; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create application dialog if(!ExtDialog.Create(0,"Controls",0,40,40,380,344)) return(INIT_FAILED); //--- run application ExtDialog.Run(); //--- succeed return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- очистим комментарии Comment(""); //--- destroy dialog ExtDialog.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 { ExtDialog.ChartEvent(id,lparam,dparam,sparam); } //+------------------------------------------------------------------+
Реакция на событие выводится в комментарии на графике.
Файлы:
ControlsComboBox.mq5
8 kb
О, спасибо большое :) Вот пример как я делал. Значения в комбобоксе меняютя, но если мы кликнем в пустое место панели, то они сбрасываются на ноль, почему так происходит?
//+------------------------------------------------------------------+ //| ComboBox.mq4 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #include <Controls\Defines.mqh> #include <Controls\Dialog.mqh> #include <Controls\Panel.mqh> #include <Controls\ComboBox.mqh> int panelXX = 20; int panelYY = 20; int panelWidth = 435; int panelHeight = 366; CAppDialog m_panel; CComboBox myComboBox; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- CreateComboBox(); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+ void CreateComboBox() { m_panel.Create(0,"myPanel",0,panelXX,panelYY,panelWidth,panelHeight); m_panel.Run(); myComboBox.Create(0,"IntegralComboBox",0,5,55,100,80); myComboBox.ListViewItems(27); myComboBox.Id(1); myComboBox.AddItem("EUR/USD",0); myComboBox.AddItem("USD/JPY",1); myComboBox.AddItem("GBP/USD",2); myComboBox.AddItem("EUR/GBP",3); myComboBox.AddItem("CAD/CHF",4); myComboBox.AddItem("CAD/JPY",5); myComboBox.AddItem("CHF/JPY",6); myComboBox.AddItem("EUR/AUD",7); myComboBox.AddItem("USD/CHF",8); myComboBox.AddItem("EUR/JPY",9); myComboBox.AddItem("EUR/CHF",10); myComboBox.AddItem("USD/CAD",11); myComboBox.AddItem("AUD/USD",12); myComboBox.AddItem("GBP/JPY",13); myComboBox.AddItem("AUD/CAD",14); myComboBox.AddItem("AUD/CHF",15); myComboBox.AddItem("AUD/JPY",16); myComboBox.AddItem("AUD/NZD",17); myComboBox.AddItem("EUR/CAD",18); myComboBox.AddItem("EUR/NOK",19); myComboBox.AddItem("EUR/NZD",20); myComboBox.AddItem("GBP/CAD",21); myComboBox.AddItem("GBP/CHF",22); myComboBox.AddItem("NZD/JPY",23); myComboBox.AddItem("NZD/USD",24); myComboBox.AddItem("USD/NOK",25); myComboBox.AddItem("USD/SEK",26); myComboBox.SelectByText("EUR/USD"); m_panel.Add(myComboBox); } void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { m_panel.OnEvent(id,lparam,dparam,sparam); if(id ==1) { myComboBox.OnEvent(id,lparam,dparam,sparam); } }
Пожалуйста возьмите, за основу, мой пример и вносите свой функционал.
Karputov Vladimir:
Пожалуйста возьмите, за основу, мой пример и вносите свой функционал.
Да, спасибо, хороший пример.
Пожалуйста возьмите, за основу, мой пример и вносите свой функционал.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Стандартный обработчик события не обрабатывает как надо элемент ComboBox, обрабатывается только по клику, а как обработать правильно изменение значения не знаю.. Где можно прочитать разжеванную справку по вот этому безобразию? Что куда пихать :) или как правильно обрабатывать комбо бокс... %) буду благодарен за помощь. Это список макросов, которые не очень понятно куда пихать..
А я делаю как-то так, до этого присвоил комбобоксу айди "1". После изменения значения комбо бокса на другое, при клике на панели, значение сбрасывается обратно на старое.. Т.е. не фиксируется выбранное значение как надо.