Помогите понять как правильно удалять элементы с панели, и добавлять заново при нажатии кнопки

 

Здесь по нажатии кнопки элементы бид и аск должны добавляться на график и исчезать с него, но что-то пошло не так... справки почти нет по этому делу, приходится идти вслепую :)


//+------------------------------------------------------------------+
//|                                                      MyPanel.mqh |
//|                                    Copyright © 2013, DeltaTrader |
//|                                    http://www.deltatrader.com.br |
//+------------------------------------------------------------------+
#property copyright     "DeltaTrader © 2013"
#property link          "www.deltatrader.com.br"
#property version       "1.000"
#property description   "Test Panel"
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Includes                                                         |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Label.mqh>
#include <Controls\Panel.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Defines.mqh>
#include <Controls\Button.mqh>

//+------------------------------------------------------------------+
//| Global parameters                                                |
//+------------------------------------------------------------------+
int      panelXX     =  200;
int      panelYY     =  200;
int      panelWidth  =  600;
int      panelHeight =  400;

CAppDialog m_panel;

//--- Bid objects
CPanel m_bidcolor;
CLabel m_bidlabel;


//--- Ask objects
CPanel m_askcolor;
CLabel m_asklabel;
CEdit m_edit;

CButton m_button;
//+------------------------------------------------------------------+
//| On Init                                                          |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Panel create
   m_panel.Create(0,"blablabla",0,panelXX,panelYY,panelWidth,panelHeight);
//--- Bid label and colors
   m_bidcolor.Create(0,"Bid Background Color",0,1,1,panelWidth-30,30);
   m_bidcolor.ColorBackground(clrYellow);
   m_panel.Add(m_bidcolor);
  
   m_bidlabel.Create(0,"Bid Text",0,5,5,0,0);
   m_bidlabel.Text("Bid "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
   m_bidlabel.Color(clrBlue);
   m_panel.Add(m_bidlabel);
//--- Ask label and colors
   m_askcolor.Create(0,"Ask Background Color",0,1,1,panelWidth-30,30);
   m_askcolor.ColorBackground(clrAqua);
   m_panel.Add(m_askcolor);
  
   m_asklabel.Create(0,"Ask Text",0,5,30,0,0);
   m_asklabel.Text("Ask "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits));
   m_asklabel.Color(clrRed);
   m_panel.Add(m_asklabel);
  
   m_edit.Create(0,"Bid Background Color",0,1,1,panelWidth-30,30);
   m_panel.Add(m_edit);
  
   m_button.Create(0,"My button",0, 150,5,250,50);
   m_button.Text("Show or hide");
   m_panel.Add(m_button);
//--- Run panel
   m_panel.Run();
   return(0);
  }
//+------------------------------------------------------------------+
//| On DeInit                                                        |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Destroy panel
   m_panel.Destroy(reason);
//--- Delete all objects
   ObjectsDeleteAll(0,0);
  }
//+------------------------------------------------------------------+
//| On Calculate                                                     |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//--- A very simples bid label
   m_bidlabel.Text("Bid "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
//--- A very simples ask label
   m_asklabel.Text("Ask "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits));
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| On Chart Event                                                   |
//+------------------------------------------------------------------+

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Move the panel with the mouse
   m_panel.ChartEvent(id,lparam,dparam,sparam);
  
   if(sparam == "My button")
    {
     if(m_button.Pressed())
      {
       m_bidlabel.Destroy();
       m_asklabel.Destroy();
      }
     else
      {
       m_panel.Add(m_bidlabel);
       m_panel.Add(m_asklabel);
      }
    }
//---
  }
//+------------------------------------------------------------------+


 

 
Maxim Dmitrievsky:

Здесь по нажатии кнопки элементы бид и аск должны добавляться на график и исчезать с него, но что-то пошло не так...


//+------------------------------------------------------------------+
//|                                                      MyPanel.mqh |
//|                                    Copyright © 2013, DeltaTrader |
//|                                    http://www.deltatrader.com.br |
//+------------------------------------------------------------------+
#property copyright     "DeltaTrader © 2013"
#property link          "www.deltatrader.com.br"
#property version       "1.000"
#property description   "Test Panel"
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Includes                                                         |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Label.mqh>
#include <Controls\Panel.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Defines.mqh>
#include <Controls\Button.mqh>

//+------------------------------------------------------------------+
//| Global parameters                                                |
//+------------------------------------------------------------------+
int      panelXX     =  200;
int      panelYY     =  200;
int      panelWidth  =  600;
int      panelHeight =  400;

CAppDialog m_panel;

//--- Bid objects
CPanel m_bidcolor;
CLabel m_bidlabel;


//--- Ask objects
CPanel m_askcolor;
CLabel m_asklabel;
CEdit m_edit;

CButton m_button;
//+------------------------------------------------------------------+
//| On Init                                                          |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Panel create
   m_panel.Create(0,"blablabla",0,panelXX,panelYY,panelWidth,panelHeight);
//--- Bid label and colors
   m_bidcolor.Create(0,"Bid Background Color",0,1,1,panelWidth-30,30);
   m_bidcolor.ColorBackground(clrYellow);
   m_panel.Add(m_bidcolor);
  
   m_bidlabel.Create(0,"Bid Text",0,5,5,0,0);
   m_bidlabel.Text("Bid "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
   m_bidlabel.Color(clrBlue);
   m_panel.Add(m_bidlabel);
//--- Ask label and colors
   m_askcolor.Create(0,"Ask Background Color",0,1,1,panelWidth-30,30);
   m_askcolor.ColorBackground(clrAqua);
   m_panel.Add(m_askcolor);
  
   m_asklabel.Create(0,"Ask Text",0,5,30,0,0);
   m_asklabel.Text("Ask "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits));
   m_asklabel.Color(clrRed);
   m_panel.Add(m_asklabel);
  
   m_edit.Create(0,"Bid Background Color",0,1,1,panelWidth-30,30);
   m_panel.Add(m_edit);
  
   m_button.Create(0,"My button",0, 150,5,250,50);
   m_button.Text("Show or hide");
   m_panel.Add(m_button);
//--- Run panel
   m_panel.Run();
   return(0);
  }
//+------------------------------------------------------------------+
//| On DeInit                                                        |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Destroy panel
   m_panel.Destroy(reason);
//--- Delete all objects
   ObjectsDeleteAll(0,0);
  }
//+------------------------------------------------------------------+
//| On Calculate                                                     |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//--- A very simples bid label
   m_bidlabel.Text("Bid "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
//--- A very simples ask label
   m_asklabel.Text("Ask "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits));
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| On Chart Event                                                   |
//+------------------------------------------------------------------+

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Move the panel with the mouse
   m_panel.ChartEvent(id,lparam,dparam,sparam);
  
   if(sparam == "My button")
    {
     if(m_button.Pressed())
      {
       m_bidlabel.Destroy();
       m_asklabel.Destroy();
      }
     else
      {
       m_panel.Add(m_bidlabel);
       m_panel.Add(m_asklabel);
      }
    }
//---
  }
//+------------------------------------------------------------------+


 

Что пошло не так? Не появляются кнопки, не удаляются..... ???
 
Evgeny Belyaev:
Что пошло не так? Не появляются кнопки, не удаляются..... ???

по нажатии кнопки должны удаляться метки, при повторном нажатии появляться опять.. они удаляются но не появляются это раз, во вторых если заново прописать Create при нажатии кнопки, то они появятся, но не будут привязаны к панели, то есть будут перемещаться не синхронно с ней, плюс к этому я вообще не нашел в справке как правильно нужно делать :)  Поэтому мне лучше бы просто информацию о том как это нужно правильно делать - удалять а потом снова удалять элементы с панели.

специально для вас разжевал, если вы по коду не видите что я делю ) 

 

Скорее никак. По идее надо у формы из массива удалять элемент управления, но нет такого метода, а сам массив объявлен в privte.

Может быть через видимость, но тогда возникнут проблемы при сворачивании/разворачивании формы, тогда может быть создать свой массив и в нем держать данные какой элемент управления видим, какой скрыт. При событии ресайза формы включать/выключать видимость. (но не пробовал такой вариант (по событию формы), и так хватило экспериментов)

 
Dmitry Fedoseev:

Скорее никак. По идее надо у формы из массива удалять элемент управления, но нет такого метода, а сам массив объявлен в privte.

Может быть через видимость, но тогда возникнут проблемы при сворачивании/разворачивании формы, тогда может быть создать свой массив и в нем держать данные какой элемент управления видим, какой скрыт. При событии ресайза формы включать/выключать видимость. (но не пробовал такой вариант, и так хватило экспериментов)

или мб пересоздавать панель просто.. ) не пойму почему удаленные элементы при повторном добавлении в панель криво к ней привязываются и двигаются не синхронно с ней, но двигаются.. что-то накладывается друг на друга, видимо 
 
Maxim Dmitrievsky:
или мб пересоздавать панель просто.. ) не пойму почему удаленные элементы при повторном добавлении в панель криво к ней привязываются и двигаются не синхронно с ней, но двигаются.. что-то накладывается друг на друга, видимо 

Попробуйте вот эту версию библиотеки для создания графических интерфейсов: Графические интерфейсы X: Элемент "Время", элемент "Список из чекбоксов" и сортировка таблицы (build 6)

 

Maxim Dmitrievsky:
1. или мб пересоздавать панель просто.. )

 

2. не пойму почему удаленные элементы при повторном добавлении в панель криво к ней привязываются и двигаются не синхронно с ней, но двигаются.. что-то накладывается друг на друга, видимо 

1. С пересозданием панели возможно будет работать, но уж слишком громоздкий способ.

2. Наверно после удаления элемента управления и его нового создания он снова располагается по тому же адресу в памяти, поэтому, при смещении формы два раза выполняется его смещение.  

 
Anatoli Kazharski:

Попробуйте вот эту версию библиотеки для создания графических интерфейсов: Графические интерфейсы X: Элемент "Время", элемент "Список из чекбоксов" и сортировка таблицы (build 6)

мне придется очень много переделывать, т.к. уже все сделано через стандартные классы )
 
Maxim Dmitrievsky:
мне придется очень много переделывать, т.к. уже все сделано через стандартные классы )
Зато попрощаетесь со всеми этими трудностями и всегда будете получать ответы на вопросы. В общем, выбор за Вами. )
 
проблему можно решить, установив для контролов флаг Visible, и отображать или прятать их когда надо. А поверх добавлять другие вместо них, например.. не знаю вкатит такой подход или нет, попробую чуть позже ) По крайней мере они прячутся и снова отображаются без видимых проблем
 
Maxim Dmitrievsky:
проблему можно решить, установив для контролов флаг Visible, и отображать или прятать их когда надо. А поверх добавлять другие вместо них, например.. не знаю вкатит такой подход или нет, попробую чуть позже ) По крайней мере они прячутся и снова отображаются без видимых проблем
Поразительно какие тут все читатели. Писал же про это выше. Будут проблемы при сворачивании/разворачивании формы.
Причина обращения: